<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[163542] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/163542">163542</a></dd>
<dt>Author</dt> <dd>mhahnenberg@apple.com</dd>
<dt>Date</dt> <dd>2014-02-06 09:59:05 -0800 (Thu, 06 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Heap::writeBarrier shouldn't be static
https://bugs.webkit.org/show_bug.cgi?id=127807

Reviewed by Geoffrey Garen.

Currently it looks up the Heap in which to fire the write barrier by using 
the cell passed to it. Almost every call site already has a reference to the 
VM or the Heap itself. It seems wasteful to look it up all over again.

Source/JavaScriptCore: 

* GNUmakefile.list.am:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* heap/CopyWriteBarrier.h:
(JSC::CopyWriteBarrier::set):
* heap/Heap.cpp:
(JSC::Heap::writeBarrier):
* heap/Heap.h:
(JSC::Heap::writeBarrier):
* jit/JITOperations.cpp:
* jit/JITWriteBarrier.h:
(JSC::JITWriteBarrierBase::set):
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::llint_write_barrier_slow):
* runtime/Arguments.h:
* runtime/JSWeakMap.cpp:
* runtime/MapData.cpp:
(JSC::MapData::ensureSpaceForAppend):
* runtime/PropertyTable.cpp:
(JSC::PropertyTable::PropertyTable):
* runtime/Structure.h:
* runtime/WriteBarrier.h:
* runtime/WriteBarrierInlines.h: Added.

Source/WebCore: 

* bindings/js/JSEventListener.cpp:
(WebCore::JSEventListener::JSEventListener):
* bindings/js/JSEventListener.h:
(WebCore::JSEventListener::jsFunction):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreGNUmakefilelistam">trunk/Source/JavaScriptCore/GNUmakefile.list.am</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapCopyWriteBarrierh">trunk/Source/JavaScriptCore/heap/CopyWriteBarrier.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeaph">trunk/Source/JavaScriptCore/heap/Heap.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationscpp">trunk/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITWriteBarrierh">trunk/Source/JavaScriptCore/jit/JITWriteBarrier.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntSlowPathscpp">trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArgumentsh">trunk/Source/JavaScriptCore/runtime/Arguments.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSWeakMapcpp">trunk/Source/JavaScriptCore/runtime/JSWeakMap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeMapDatacpp">trunk/Source/JavaScriptCore/runtime/MapData.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyTablecpp">trunk/Source/JavaScriptCore/runtime/PropertyTable.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureh">trunk/Source/JavaScriptCore/runtime/Structure.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeWriteBarrierh">trunk/Source/JavaScriptCore/runtime/WriteBarrier.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSEventListenercpp">trunk/Source/WebCore/bindings/js/JSEventListener.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSEventListenerh">trunk/Source/WebCore/bindings/js/JSEventListener.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreruntimeWriteBarrierInlinesh">trunk/Source/JavaScriptCore/runtime/WriteBarrierInlines.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2014-02-05  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        Heap::writeBarrier shouldn't be static
+        https://bugs.webkit.org/show_bug.cgi?id=127807
+
+        Reviewed by Geoffrey Garen.
+
+        Currently it looks up the Heap in which to fire the write barrier by using 
+        the cell passed to it. Almost every call site already has a reference to the 
+        VM or the Heap itself. It seems wasteful to look it up all over again.
+
+        * GNUmakefile.list.am:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * heap/CopyWriteBarrier.h:
+        (JSC::CopyWriteBarrier::set):
+        * heap/Heap.cpp:
+        (JSC::Heap::writeBarrier):
+        * heap/Heap.h:
+        (JSC::Heap::writeBarrier):
+        * jit/JITOperations.cpp:
+        * jit/JITWriteBarrier.h:
+        (JSC::JITWriteBarrierBase::set):
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::llint_write_barrier_slow):
+        * runtime/Arguments.h:
+        * runtime/JSWeakMap.cpp:
+        * runtime/MapData.cpp:
+        (JSC::MapData::ensureSpaceForAppend):
+        * runtime/PropertyTable.cpp:
+        (JSC::PropertyTable::PropertyTable):
+        * runtime/Structure.h:
+        * runtime/WriteBarrier.h:
+        * runtime/WriteBarrierInlines.h: Added.
+
</ins><span class="cx"> 2014-02-04  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make FTL OSR entry something we only try after we've already compiled the function with the FTL and it still got stuck in a loop after that without ever returning like a sensible function oughta have
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreGNUmakefilelistam"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/GNUmakefile.list.am (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1221,6 +1221,7 @@
</span><span class="cx">         Source/JavaScriptCore/runtime/WeakMapPrototype.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/WeakRandom.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/WriteBarrier.h \
</span><ins>+    Source/JavaScriptCore/runtime/WriteBarrierInlines.h \
</ins><span class="cx">         Source/JavaScriptCore/tools/CodeProfile.cpp \
</span><span class="cx">         Source/JavaScriptCore/tools/CodeProfile.h \
</span><span class="cx">         Source/JavaScriptCore/tools/CodeProfiling.cpp \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1388,6 +1388,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\WeakMapPrototype.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\WeakRandom.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\WriteBarrier.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\runtime\WriteBarrierInlines.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\tools\CodeProfile.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\tools\CodeProfiling.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\tools\ProfileTreeNode.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -2438,6 +2438,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\WriteBarrier.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\runtime\WriteBarrierInlines.h&quot;&gt;
+      &lt;Filter&gt;runtime&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\tools\CodeProfile.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;tools&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1333,6 +1333,7 @@
</span><span class="cx">                 C2981FDD17BAFF4400A3BC98 /* DFGDesiredWriteBarriers.h in Headers */ = {isa = PBXBuildFile; fileRef = C2981FDB17BAFF4400A3BC98 /* DFGDesiredWriteBarriers.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 C29ECB031804D0ED00D2CBB4 /* CurrentThisInsideBlockGetterTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = C29ECB011804D0ED00D2CBB4 /* CurrentThisInsideBlockGetterTest.mm */; };
</span><span class="cx">                 C2A7F688160432D400F76B98 /* JSDestructibleObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C2A7F687160432D400F76B98 /* JSDestructibleObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                C2B6D75318A33793004A9301 /* WriteBarrierInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = C2B6D75218A33793004A9301 /* WriteBarrierInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 C2B916C214DA014E00CBAC86 /* MarkedAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = C2B916C114DA014E00CBAC86 /* MarkedAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 C2B916C514DA040C00CBAC86 /* MarkedAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2B916C414DA040C00CBAC86 /* MarkedAllocator.cpp */; };
</span><span class="cx">                 C2C0F7CD17BBFC5B00464FE4 /* DFGDesiredTransitions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2C0F7CB17BBFC5B00464FE4 /* DFGDesiredTransitions.cpp */; };
</span><span class="lines">@@ -2765,6 +2766,7 @@
</span><span class="cx">                 C29ECB011804D0ED00D2CBB4 /* CurrentThisInsideBlockGetterTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CurrentThisInsideBlockGetterTest.mm; path = API/tests/CurrentThisInsideBlockGetterTest.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 C29ECB021804D0ED00D2CBB4 /* CurrentThisInsideBlockGetterTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CurrentThisInsideBlockGetterTest.h; path = API/tests/CurrentThisInsideBlockGetterTest.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 C2A7F687160432D400F76B98 /* JSDestructibleObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDestructibleObject.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                C2B6D75218A33793004A9301 /* WriteBarrierInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WriteBarrierInlines.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 C2B916C114DA014E00CBAC86 /* MarkedAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkedAllocator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 C2B916C414DA040C00CBAC86 /* MarkedAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkedAllocator.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 C2C0F7CB17BBFC5B00464FE4 /* DFGDesiredTransitions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDesiredTransitions.cpp; path = dfg/DFGDesiredTransitions.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3624,6 +3626,7 @@
</span><span class="cx">                 7EF6E0BB0EB7A1EC0079AFAF /* runtime */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                C2B6D75218A33793004A9301 /* WriteBarrierInlines.h */,
</ins><span class="cx">                                 BCF605110E203EF800B9A64D /* ArgList.cpp */,
</span><span class="cx">                                 BCF605120E203EF800B9A64D /* ArgList.h */,
</span><span class="cx">                                 BC257DE50E1F51C50016B6C9 /* Arguments.cpp */,
</span><span class="lines">@@ -4641,6 +4644,7 @@
</span><span class="cx">                                 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */,
</span><span class="cx">                                 2A68295B1875F80500B6C3E2 /* CopyWriteBarrier.h in Headers */,
</span><span class="cx">                                 2A4EC90C1860D6C20094F782 /* WriteBarrierBuffer.h in Headers */,
</span><ins>+                                C2B6D75318A33793004A9301 /* WriteBarrierInlines.h in Headers */,
</ins><span class="cx">                                 FE5932A8183C5A2600A1ECCC /* VMEntryScope.h in Headers */,
</span><span class="cx">                                 A532439318569709002ED692 /* CodeGeneratorInspectorStrings.py in Headers */,
</span><span class="cx">                                 A532439218569709002ED692 /* CodeGeneratorInspector.py in Headers */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapCopyWriteBarrierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/CopyWriteBarrier.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/CopyWriteBarrier.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/heap/CopyWriteBarrier.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -68,10 +68,10 @@
</span><span class="cx">         return get();
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void set(VM&amp;, const JSCell* owner, T* value)
</del><ins>+    void set(VM&amp; vm, const JSCell* owner, T* value)
</ins><span class="cx">     {
</span><span class="cx">         this-&gt;m_value = value;
</span><del>-        Heap::writeBarrier(owner);
</del><ins>+        vm.heap.writeBarrier(owner);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void setWithoutWriteBarrier(T* value)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1087,8 +1087,7 @@
</span><span class="cx">     ASSERT_GC_OBJECT_LOOKS_VALID(const_cast&lt;JSCell*&gt;(from));
</span><span class="cx">     if (!from || !isMarked(from))
</span><span class="cx">         return;
</span><del>-    Heap* heap = Heap::heap(from);
-    heap-&gt;addToRememberedSet(from);
</del><ins>+    addToRememberedSet(from);
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(from);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/heap/Heap.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -102,9 +102,9 @@
</span><span class="cx">             return MarkedBlock::blockFor(cell)-&gt;isRemembered(cell);
</span><span class="cx">         }
</span><span class="cx">         static bool isWriteBarrierEnabled();
</span><del>-        JS_EXPORT_PRIVATE static void writeBarrier(const JSCell*);
-        static void writeBarrier(const JSCell*, JSValue);
-        static void writeBarrier(const JSCell*, JSCell*);
</del><ins>+        JS_EXPORT_PRIVATE void writeBarrier(const JSCell*);
+        void writeBarrier(const JSCell*, JSValue);
+        void writeBarrier(const JSCell*, JSCell*);
</ins><span class="cx"> 
</span><span class="cx">         WriteBarrierBuffer&amp; writeBarrierBuffer() { return m_writeBarrierBuffer; }
</span><span class="cx">         void flushWriteBarrierBuffer(JSCell*);
</span><span class="lines">@@ -401,7 +401,7 @@
</span><span class="cx">             return;
</span><span class="cx">         if (!to || isMarked(to))
</span><span class="cx">             return;
</span><del>-        Heap::heap(from)-&gt;addToRememberedSet(from);
</del><ins>+        addToRememberedSet(from);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     inline void Heap::writeBarrier(const JSCell* from, JSValue to)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1750,7 +1750,7 @@
</span><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    exec-&gt;heap()-&gt;writeBarrier(cell);
</del><ins>+    vm-&gt;heap.writeBarrier(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // NB: We don't include the value as part of the barrier because the write barrier elision
</span><span class="lines">@@ -1760,7 +1760,7 @@
</span><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    Heap::writeBarrier(cell);
</del><ins>+    vm-&gt;heap.writeBarrier(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JIT_OPERATION operationInitGlobalConst(ExecState* exec, Instruction* pc)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITWriteBarrierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITWriteBarrier.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITWriteBarrier.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/jit/JITWriteBarrier.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -77,9 +77,9 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void set(VM&amp;, CodeLocationDataLabelPtr location, JSCell* owner, JSCell* value)
</del><ins>+    void set(VM&amp; vm, CodeLocationDataLabelPtr location, JSCell* owner, JSCell* value)
</ins><span class="cx">     {
</span><del>-        Heap::writeBarrier(owner, value);
</del><ins>+        vm.heap.writeBarrier(owner, value);
</ins><span class="cx">         m_location = location;
</span><span class="cx">         ASSERT(((!!m_location) &amp;&amp; m_location.executableAddress() != JITWriteBarrierFlag) || (location.executableAddress() == m_location.executableAddress()));
</span><span class="cx">         MacroAssembler::repatchPointer(m_location, value);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntSlowPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1436,9 +1436,10 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-extern &quot;C&quot; void llint_write_barrier_slow(ExecState*, JSCell* cell)
</del><ins>+extern &quot;C&quot; void llint_write_barrier_slow(ExecState* exec, JSCell* cell)
</ins><span class="cx"> {
</span><del>-    Heap::writeBarrier(cell);
</del><ins>+    VM&amp; vm = exec-&gt;vm();
+    vm.heap.writeBarrier(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::LLInt
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArgumentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Arguments.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Arguments.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/Arguments.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><ins>+#include &quot;WriteBarrierInlines.h&quot;
</ins><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSWeakMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSWeakMap.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSWeakMap.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/JSWeakMap.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;SlotVisitorInlines.h&quot;
</span><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><ins>+#include &quot;WriteBarrierInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeMapDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/MapData.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/MapData.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/MapData.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -208,7 +208,7 @@
</span><span class="cx">         replaceAndPackBackingStore(newEntries, requiredSize);
</span><span class="cx">     else
</span><span class="cx">         replaceBackingStore(newEntries, requiredSize);
</span><del>-    Heap::writeBarrier(this);
</del><ins>+    callFrame-&gt;heap()-&gt;writeBarrier(this);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyTablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyTable.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyTable.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/PropertyTable.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     iterator end = this-&gt;end();
</span><span class="cx">     for (iterator iter = begin(); iter != end; ++iter) {
</span><span class="cx">         iter-&gt;key-&gt;ref();
</span><del>-        Heap::writeBarrier(owner, iter-&gt;specificValue.get());
</del><ins>+        vm.heap.writeBarrier(owner, iter-&gt;specificValue.get());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Copy the m_deletedOffsets vector.
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx">         ASSERT(canInsert());
</span><span class="cx">         reinsert(*iter);
</span><span class="cx">         iter-&gt;key-&gt;ref();
</span><del>-        Heap::writeBarrier(owner, iter-&gt;specificValue.get());
</del><ins>+        vm.heap.writeBarrier(owner, iter-&gt;specificValue.get());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Copy the m_deletedOffsets vector.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/Structure.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #include &quot;JSTypeInfo.h&quot;
</span><span class="cx"> #include &quot;Watchpoint.h&quot;
</span><span class="cx"> #include &quot;Weak.h&quot;
</span><ins>+#include &quot;WriteBarrierInlines.h&quot;
</ins><span class="cx"> #include &lt;wtf/CompilationThread.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeWriteBarrierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/WriteBarrier.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/WriteBarrier.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/JavaScriptCore/runtime/WriteBarrier.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -71,13 +71,7 @@
</span><span class="cx"> // We have a separate base class with no constructors for use in Unions.
</span><span class="cx"> template &lt;typename T&gt; class WriteBarrierBase {
</span><span class="cx"> public:
</span><del>-    void set(VM&amp; vm, const JSCell* owner, T* value)
-    {
-        ASSERT(value);
-        ASSERT(!Options::enableConcurrentJIT() || !isCompilationThread());
-        validateCell(value);
-        setEarlyValue(vm, owner, value);
-    }
</del><ins>+    void set(VM&amp;, const JSCell* owner, T* value);
</ins><span class="cx">     
</span><span class="cx">     // This is meant to be used like operator=, but is called copyFrom instead, in
</span><span class="cx">     // order to kindly inform the C++ compiler that its advice is not appreciated.
</span><span class="lines">@@ -86,20 +80,11 @@
</span><span class="cx">         m_cell = other.m_cell;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void setMayBeNull(VM&amp; vm, const JSCell* owner, T* value)
-    {
-        if (value)
-            validateCell(value);
-        setEarlyValue(vm, owner, value);
-    }
</del><ins>+    void setMayBeNull(VM&amp;, const JSCell* owner, T* value);
</ins><span class="cx"> 
</span><span class="cx">     // Should only be used by JSCell during early initialisation
</span><span class="cx">     // when some basic types aren't yet completely instantiated
</span><del>-    void setEarlyValue(VM&amp;, const JSCell* owner, T* value)
-    {
-        this-&gt;m_cell = reinterpret_cast&lt;JSCell*&gt;(value);
-        Heap::writeBarrier(owner, this-&gt;m_cell);
-    }
</del><ins>+    void setEarlyValue(VM&amp;, const JSCell* owner, T* value);
</ins><span class="cx">     
</span><span class="cx">     T* get() const
</span><span class="cx">     {
</span><span class="lines">@@ -151,13 +136,7 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt; class WriteBarrierBase&lt;Unknown&gt; {
</span><span class="cx"> public:
</span><del>-    void set(VM&amp;, const JSCell* owner, JSValue value)
-    {
-        ASSERT(!Options::enableConcurrentJIT() || !isCompilationThread());
-        m_value = JSValue::encode(value);
-        Heap::writeBarrier(owner, value);
-    }
-
</del><ins>+    void set(VM&amp;, const JSCell* owner, JSValue);
</ins><span class="cx">     void setWithoutWriteBarrier(JSValue value)
</span><span class="cx">     {
</span><span class="cx">         m_value = JSValue::encode(value);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeWriteBarrierInlinesh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/WriteBarrierInlines.h (0 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/WriteBarrierInlines.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/WriteBarrierInlines.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WriteBarrierInlines_h
+#define WriteBarrierInlines_h
+
+#include &quot;VM.h&quot;
+#include &quot;WriteBarrier.h&quot;
+
+namespace JSC {
+
+template &lt;typename T&gt;
+inline void WriteBarrierBase&lt;T&gt;::set(VM&amp; vm, const JSCell* owner, T* value)
+{
+    ASSERT(value);
+    ASSERT(!Options::enableConcurrentJIT() || !isCompilationThread());
+    validateCell(value);
+    setEarlyValue(vm, owner, value);
+}
+
+template &lt;typename T&gt;
+inline void WriteBarrierBase&lt;T&gt;::setMayBeNull(VM&amp; vm, const JSCell* owner, T* value)
+{
+    if (value)
+        validateCell(value);
+    setEarlyValue(vm, owner, value);
+}
+
+template &lt;typename T&gt;
+inline void WriteBarrierBase&lt;T&gt;::setEarlyValue(VM&amp; vm, const JSCell* owner, T* value)
+{
+    this-&gt;m_cell = reinterpret_cast&lt;JSCell*&gt;(value);
+    vm.heap.writeBarrier(owner, this-&gt;m_cell);
+}
+
+inline void WriteBarrierBase&lt;Unknown&gt;::set(VM&amp; vm, const JSCell* owner, JSValue value)
+{
+    ASSERT(!Options::enableConcurrentJIT() || !isCompilationThread());
+    m_value = JSValue::encode(value);
+    vm.heap.writeBarrier(owner, value);
+}
+
+} // namespace JSC 
+
+#endif // WriteBarrierInlines_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/WebCore/ChangeLog        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-02-05  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        Heap::writeBarrier shouldn't be static
+        https://bugs.webkit.org/show_bug.cgi?id=127807
+
+        Reviewed by Geoffrey Garen.
+
+        Currently it looks up the Heap in which to fire the write barrier by using 
+        the cell passed to it. Almost every call site already has a reference to the 
+        VM or the Heap itself. It seems wasteful to look it up all over again.
+
+        * bindings/js/JSEventListener.cpp:
+        (WebCore::JSEventListener::JSEventListener):
+        * bindings/js/JSEventListener.h:
+        (WebCore::JSEventListener::jsFunction):
+
</ins><span class="cx"> 2014-02-06  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         IDB: storage/indexeddb/mozilla/clear.html fails
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSEventListenercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSEventListener.cpp (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSEventListener.cpp        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/WebCore/bindings/js/JSEventListener.cpp        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx">     , m_isolatedWorld(&amp;isolatedWorld)
</span><span class="cx"> {
</span><span class="cx">     if (wrapper) {
</span><del>-        JSC::Heap::writeBarrier(wrapper, function);
</del><ins>+        JSC::Heap::heap(wrapper)-&gt;writeBarrier(wrapper, function);
</ins><span class="cx">         m_jsFunction = JSC::Weak&lt;JSC::JSObject&gt;(function);
</span><span class="cx">     } else
</span><span class="cx">         ASSERT(!function);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSEventListenerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSEventListener.h (163541 => 163542)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSEventListener.h        2014-02-06 17:55:15 UTC (rev 163541)
+++ trunk/Source/WebCore/bindings/js/JSEventListener.h        2014-02-06 17:59:05 UTC (rev 163542)
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (!m_jsFunction) {
</span><span class="cx">             JSC::JSObject* function = initializeJSFunction(scriptExecutionContext);
</span><del>-            JSC::Heap::writeBarrier(m_wrapper.get(), function);
</del><ins>+            JSC::Heap::heap(m_wrapper.get())-&gt;writeBarrier(m_wrapper.get(), function);
</ins><span class="cx">             m_jsFunction = JSC::Weak&lt;JSC::JSObject&gt;(function);
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>