<!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>[188714] trunk/Source/JavaScriptCore</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/188714">188714</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2015-08-20 15:53:24 -0700 (Thu, 20 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>forEachCodeBlock should wait for all CodeBlocks automatically
https://bugs.webkit.org/show_bug.cgi?id=148255

Reviewed by Saam Barati.

Previously, all clients needed to wait manually before calling
forEachCodeBlock. That's easy to get wrong, and at least one place
got it wrong. Let's do this automatically instead.

* debugger/Debugger.cpp:
(JSC::Debugger::Debugger):
(JSC::Debugger::setSteppingMode):
(JSC::Debugger::toggleBreakpoint): No need to wait manually;
forEachCodeBlock will do it automatically now.

(JSC::Debugger::recompileAllJSFunctions): We still need to wait manually
here because this is an iteration of the heap, which does not wait
automatically. Use the new helper function for waiting.

(JSC::Debugger::clearBreakpoints):
(JSC::Debugger::clearDebuggerRequests):
(JSC::Debugger::setBreakpointsActivated):
(JSC::Debugger::forEachCodeBlock): Deleted. No need to wait manually.

* debugger/Debugger.h:

* dfg/DFGWorklist.cpp:
(JSC::DFG::completeAllPlansForVM):
* dfg/DFGWorklist.h:
(JSC::DFG::completeAllPlansForVM): Added a helper function that replaces
vm.prepareToDeleteCode. This new function is clearer because we need
to call it sometimes even if we are not going to delete code.

* heap/HeapInlines.h:
(JSC::Heap::forEachCodeBlock): Moved.

* inspector/agents/InspectorRuntimeAgent.cpp:
(Inspector::recompileAllJSFunctionsForTypeProfiling): Use the new helper
function.

* runtime/JSCInlines.h:
(JSC::Heap::forEachCodeBlock): Do the waiting automatically.

* runtime/VM.cpp:
(JSC::VM::stopSampling):
(JSC::VM::deleteAllCode):
(JSC::VM::setEnabledProfiler):
(JSC::VM::prepareToDeleteCode): Deleted.
* runtime/VM.h: No need to wait manually.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggercpp">trunk/Source/JavaScriptCore/debugger/Debugger.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerh">trunk/Source/JavaScriptCore/debugger/Debugger.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGWorklistcpp">trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGWorklisth">trunk/Source/JavaScriptCore/dfg/DFGWorklist.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapInlinesh">trunk/Source/JavaScriptCore/heap/HeapInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorRuntimeAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCInlinesh">trunk/Source/JavaScriptCore/runtime/JSCInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMcpp">trunk/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMh">trunk/Source/JavaScriptCore/runtime/VM.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -1,3 +1,55 @@
</span><ins>+2015-08-20  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        forEachCodeBlock should wait for all CodeBlocks automatically
+        https://bugs.webkit.org/show_bug.cgi?id=148255
+
+        Reviewed by Saam Barati.
+
+        Previously, all clients needed to wait manually before calling
+        forEachCodeBlock. That's easy to get wrong, and at least one place
+        got it wrong. Let's do this automatically instead.
+
+        * debugger/Debugger.cpp:
+        (JSC::Debugger::Debugger):
+        (JSC::Debugger::setSteppingMode):
+        (JSC::Debugger::toggleBreakpoint): No need to wait manually;
+        forEachCodeBlock will do it automatically now.
+
+        (JSC::Debugger::recompileAllJSFunctions): We still need to wait manually
+        here because this is an iteration of the heap, which does not wait
+        automatically. Use the new helper function for waiting.
+
+        (JSC::Debugger::clearBreakpoints):
+        (JSC::Debugger::clearDebuggerRequests):
+        (JSC::Debugger::setBreakpointsActivated):
+        (JSC::Debugger::forEachCodeBlock): Deleted. No need to wait manually.
+
+        * debugger/Debugger.h:
+
+        * dfg/DFGWorklist.cpp:
+        (JSC::DFG::completeAllPlansForVM):
+        * dfg/DFGWorklist.h:
+        (JSC::DFG::completeAllPlansForVM): Added a helper function that replaces
+        vm.prepareToDeleteCode. This new function is clearer because we need
+        to call it sometimes even if we are not going to delete code.
+
+        * heap/HeapInlines.h:
+        (JSC::Heap::forEachCodeBlock): Moved.
+
+        * inspector/agents/InspectorRuntimeAgent.cpp:
+        (Inspector::recompileAllJSFunctionsForTypeProfiling): Use the new helper
+        function.
+
+        * runtime/JSCInlines.h:
+        (JSC::Heap::forEachCodeBlock): Do the waiting automatically.
+
+        * runtime/VM.cpp:
+        (JSC::VM::stopSampling):
+        (JSC::VM::deleteAllCode):
+        (JSC::VM::setEnabledProfiler):
+        (JSC::VM::prepareToDeleteCode): Deleted.
+        * runtime/VM.h: No need to wait manually.
+
</ins><span class="cx"> 2015-08-20  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r188675.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.cpp (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -145,13 +145,6 @@
</span><span class="cx">     Debugger&amp; m_debugger;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename Functor&gt;
-void Debugger::forEachCodeBlock(Functor&amp; functor)
-{
-    m_vm-&gt;prepareToDeleteCode();
-    m_vm-&gt;heap.forEachCodeBlock(functor);
-}
-
</del><span class="cx"> Debugger::Debugger(bool isInWorkerThread)
</span><span class="cx">     : m_vm(nullptr)
</span><span class="cx">     , m_pauseOnExceptionsState(DontPauseOnExceptions)
</span><span class="lines">@@ -248,8 +241,6 @@
</span><span class="cx">     if (mode == m_steppingMode || !m_vm)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_vm-&gt;prepareToDeleteCode();
-
</del><span class="cx">     m_steppingMode = mode;
</span><span class="cx">     SetSteppingModeFunctor functor(this, mode);
</span><span class="cx">     m_vm-&gt;heap.forEachCodeBlock(functor);
</span><span class="lines">@@ -340,7 +331,7 @@
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return;
</span><span class="cx">     ToggleBreakpointFunctor functor(this, breakpoint, enabledOrNot);
</span><del>-    forEachCodeBlock(functor);
</del><ins>+    m_vm-&gt;heap.forEachCodeBlock(functor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Debugger::recompileAllJSFunctions(VM* vm)
</span><span class="lines">@@ -358,7 +349,9 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    vm-&gt;prepareToDeleteCode();
</del><ins>+#if ENABLE(DFG_JIT)
+    DFG::completeAllPlansForVM(*m_vm);
+#endif
</ins><span class="cx"> 
</span><span class="cx">     Recompiler recompiler(this);
</span><span class="cx">     HeapIterationScope iterationScope(vm-&gt;heap);
</span><span class="lines">@@ -530,7 +523,7 @@
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return;
</span><span class="cx">     ClearCodeBlockDebuggerRequestsFunctor functor(this);
</span><del>-    forEachCodeBlock(functor);
</del><ins>+    m_vm-&gt;heap.forEachCodeBlock(functor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class Debugger::ClearDebuggerRequestsFunctor {
</span><span class="lines">@@ -555,7 +548,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_vm);
</span><span class="cx">     ClearDebuggerRequestsFunctor functor(globalObject);
</span><del>-    forEachCodeBlock(functor);
</del><ins>+    m_vm-&gt;heap.forEachCodeBlock(functor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Debugger::setBreakpointsActivated(bool activated)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.h (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.h        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.h        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -185,8 +185,6 @@
</span><span class="cx"> 
</span><span class="cx">     void clearDebuggerRequests(JSGlobalObject*);
</span><span class="cx"> 
</span><del>-    template&lt;typename Functor&gt; inline void forEachCodeBlock(Functor&amp;);
-
</del><span class="cx">     VM* m_vm;
</span><span class="cx">     HashSet&lt;JSGlobalObject*&gt; m_globalObjects;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGWorklistcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -448,6 +448,14 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void completeAllPlansForVM(VM&amp; vm)
+{
+    for (unsigned i = DFG::numberOfWorklists(); i--;) {
+        if (DFG::Worklist* worklist = DFG::worklistForIndexOrNull(i))
+            worklist-&gt;completeAllPlansForVM(vm);
+    }
+}
+
</ins><span class="cx"> } } // namespace JSC::DFG
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(DFG_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGWorklisth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGWorklist.h (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGWorklist.h        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/dfg/DFGWorklist.h        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -139,6 +139,8 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void completeAllPlansForVM(VM&amp;);
+
</ins><span class="cx"> } } // namespace JSC::DFG
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(DFG_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/HeapInlines.h (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/HeapInlines.h        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/heap/HeapInlines.h        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -203,11 +203,6 @@
</span><span class="cx">     return forEachProtectedCell(functor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename Functor&gt; inline void Heap::forEachCodeBlock(Functor&amp; functor)
-{
-    return m_codeBlocks.iterate&lt;Functor&gt;(functor);
-}
-
</del><span class="cx"> inline void* Heap::allocateWithDestructor(size_t bytes)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(ALLOCATION_LOGGING)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorRuntimeAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;InspectorRuntimeAgent.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Completion.h&quot;
</span><ins>+#include &quot;DFGWorklist.h&quot;
</ins><span class="cx"> #include &quot;HeapIterationScope.h&quot;
</span><span class="cx"> #include &quot;InjectedScript.h&quot;
</span><span class="cx"> #include &quot;InjectedScriptManager.h&quot;
</span><span class="lines">@@ -332,7 +333,9 @@
</span><span class="cx">     bool needsToRecompile = shouldRecompileFromTypeProfiler || shouldRecompileFromControlFlowProfiler;
</span><span class="cx"> 
</span><span class="cx">     if (needsToRecompile) {
</span><del>-        vm.prepareToDeleteCode();
</del><ins>+#if ENABLE(DFG_JIT)
+        DFG::completeAllPlansForVM(vm);
+#endif
</ins><span class="cx">         TypeRecompiler recompiler;
</span><span class="cx">         HeapIterationScope iterationScope(vm.heap);
</span><span class="cx">         vm.heap.objectSpace().forEachLiveCell(iterationScope, recompiler);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCInlines.h (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCInlines.h        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/runtime/JSCInlines.h        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> // header that pulls in most (all?) of the interesting things in JSC.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CallFrameInlines.h&quot;
</span><ins>+#include &quot;DFGWorklist.h&quot;
</ins><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><span class="cx"> #include &quot;GCIncomingRefCountedInlines.h&quot;
</span><span class="cx"> #include &quot;HeapInlines.h&quot;
</span><span class="lines">@@ -53,4 +54,18 @@
</span><span class="cx"> #include &quot;StructureInlines.h&quot;
</span><span class="cx"> #include &quot;WeakGCMapInlines.h&quot;
</span><span class="cx"> 
</span><ins>+namespace JSC {
+
+template&lt;typename Functor&gt; inline void Heap::forEachCodeBlock(Functor&amp; functor)
+{
+    // We don't know the full set of CodeBlocks until compilation has terminated.
+#if ENABLE(DFG_JIT)
+    DFG::completeAllPlansForVM(*m_vm);
+#endif
+
+    return m_codeBlocks.iterate&lt;Functor&gt;(functor);
+}
+
+} // namespace JSC
+
</ins><span class="cx"> #endif // JSCInlines_h
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -471,23 +471,14 @@
</span><span class="cx">     interpreter-&gt;stopSampling();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VM::prepareToDeleteCode()
-{
-#if ENABLE(DFG_JIT)
-    for (unsigned i = DFG::numberOfWorklists(); i--;) {
-        if (DFG::Worklist* worklist = DFG::worklistForIndexOrNull(i))
-            worklist-&gt;completeAllPlansForVM(*this);
-    }
-#endif // ENABLE(DFG_JIT)
-}
-
</del><span class="cx"> void VM::deleteAllCode()
</span><span class="cx"> {
</span><del>-    prepareToDeleteCode();
</del><span class="cx">     m_codeCache-&gt;clear();
</span><span class="cx">     m_regExpCache-&gt;deleteAllCode();
</span><ins>+#if ENABLE(DFG_JIT)
+    DFG::completeAllPlansForVM(*this);
+#endif
</ins><span class="cx">     heap.deleteAllCompiledCode();
</span><del>-    heap.deleteAllUnlinkedFunctionCode();
</del><span class="cx">     heap.reportAbandonedObjectGraph();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -708,7 +699,6 @@
</span><span class="cx"> {
</span><span class="cx">     m_enabledProfiler = profiler;
</span><span class="cx">     if (m_enabledProfiler) {
</span><del>-        prepareToDeleteCode();
</del><span class="cx">         SetEnabledProfilerFunctor functor;
</span><span class="cx">         heap.forEachCodeBlock(functor);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (188713 => 188714)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-20 22:51:21 UTC (rev 188713)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-20 22:53:24 UTC (rev 188714)
</span><span class="lines">@@ -533,8 +533,6 @@
</span><span class="cx">     JSLock&amp; apiLock() { return *m_apiLock; }
</span><span class="cx">     CodeCache* codeCache() { return m_codeCache.get(); }
</span><span class="cx"> 
</span><del>-    void prepareToDeleteCode();
-        
</del><span class="cx">     JS_EXPORT_PRIVATE void deleteAllCode();
</span><span class="cx"> 
</span><span class="cx">     void registerWatchpointForImpureProperty(const Identifier&amp;, Watchpoint*);
</span></span></pre>
</div>
</div>

</body>
</html>