<!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>[188339] 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/188339">188339</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2015-08-12 11:28:20 -0700 (Wed, 12 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Remove VM::releaseExecutableMemory
https://bugs.webkit.org/show_bug.cgi?id=147915

Reviewed by Saam Barati.

releaseExecutableMemory() was only used in one place, where discardAllCode()
would work just as well.

It's confusing to have two slightly different ways to discard code. Also,
releaseExecutableMemory() is unused in any production code, and it seems
to have bit-rotted.

* jit/ExecutableAllocator.h:
* jsc.cpp:
(GlobalObject::finishCreation):
(functionAddressOf):
(functionVersion):
(functionReleaseExecutableMemory): Deleted.
* runtime/VM.cpp:
(JSC::StackPreservingRecompiler::operator()):
(JSC::VM::throwException):
(JSC::VM::updateFTLLargestStackSize):
(JSC::VM::gatherConservativeRoots):
(JSC::VM::releaseExecutableMemory): Deleted.
(JSC::releaseExecutableMemory): Deleted.
* runtime/VM.h:
(JSC::VM::isCollectorBusy):
* runtime/Watchdog.cpp:
(JSC::Watchdog::setTimeLimit):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorejitExecutableAllocatorh">trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</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>
<li><a href="#trunkSourceJavaScriptCoreruntimeWatchdogcpp">trunk/Source/JavaScriptCore/runtime/Watchdog.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2015-08-11  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Remove VM::releaseExecutableMemory
+        https://bugs.webkit.org/show_bug.cgi?id=147915
+
+        Reviewed by Saam Barati.
+
+        releaseExecutableMemory() was only used in one place, where discardAllCode()
+        would work just as well.
+
+        It's confusing to have two slightly different ways to discard code. Also,
+        releaseExecutableMemory() is unused in any production code, and it seems
+        to have bit-rotted.
+
+        * jit/ExecutableAllocator.h:
+        * jsc.cpp:
+        (GlobalObject::finishCreation):
+        (functionAddressOf):
+        (functionVersion):
+        (functionReleaseExecutableMemory): Deleted.
+        * runtime/VM.cpp:
+        (JSC::StackPreservingRecompiler::operator()):
+        (JSC::VM::throwException):
+        (JSC::VM::updateFTLLargestStackSize):
+        (JSC::VM::gatherConservativeRoots):
+        (JSC::VM::releaseExecutableMemory): Deleted.
+        (JSC::releaseExecutableMemory): Deleted.
+        * runtime/VM.h:
+        (JSC::VM::isCollectorBusy):
+        * runtime/Watchdog.cpp:
+        (JSC::Watchdog::setTimeLimit):
+
</ins><span class="cx"> 2015-08-12  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a JSC option to enable the watchdog for testing.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitExecutableAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -67,7 +67,6 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class VM;
</span><del>-void releaseExecutableMemory(VM&amp;);
</del><span class="cx"> 
</span><span class="cx"> static const unsigned jitAllocationGranule = 32;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -463,7 +463,6 @@
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionDeleteAllCompiledCode(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionAddressOf(ExecState*);
</span><span class="cx"> #ifndef NDEBUG
</span><del>-static EncodedJSValue JSC_HOST_CALL functionReleaseExecutableMemory(ExecState*);
</del><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionDumpCallFrame(ExecState*);
</span><span class="cx"> #endif
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionVersion(ExecState*);
</span><span class="lines">@@ -612,7 +611,6 @@
</span><span class="cx">         addFunction(vm, &quot;addressOf&quot;, functionAddressOf, 1);
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">         addFunction(vm, &quot;dumpCallFrame&quot;, functionDumpCallFrame, 0);
</span><del>-        addFunction(vm, &quot;releaseExecutableMemory&quot;, functionReleaseExecutableMemory, 0);
</del><span class="cx"> #endif
</span><span class="cx">         addFunction(vm, &quot;version&quot;, functionVersion, 1);
</span><span class="cx">         addFunction(vm, &quot;run&quot;, functionRun, 1);
</span><span class="lines">@@ -909,16 +907,6 @@
</span><span class="cx">     return returnValue;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-#ifndef NDEBUG
-EncodedJSValue JSC_HOST_CALL functionReleaseExecutableMemory(ExecState* exec)
-{
-    JSLockHolder lock(exec);
-    exec-&gt;vm().releaseExecutableMemory();
-    return JSValue::encode(jsUndefined());
-}
-#endif
-
</del><span class="cx"> EncodedJSValue JSC_HOST_CALL functionVersion(ExecState*)
</span><span class="cx"> {
</span><span class="cx">     // We need this function for compatibility with the Mozilla JS tests but for now
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -510,58 +510,6 @@
</span><span class="cx">     sourceProviderCacheMap.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-struct StackPreservingRecompiler : public MarkedBlock::VoidFunctor {
-    HashSet&lt;FunctionExecutable*&gt; currentlyExecutingFunctions;
-    inline void visit(JSCell* cell)
-    {
-        if (!cell-&gt;inherits(FunctionExecutable::info()))
-            return;
-        FunctionExecutable* executable = jsCast&lt;FunctionExecutable*&gt;(cell);
-        if (currentlyExecutingFunctions.contains(executable))
-            return;
-        executable-&gt;clearCode();
-    }
-    IterationStatus operator()(JSCell* cell)
-    {
-        visit(cell);
-        return IterationStatus::Continue;
-    }
-};
-
-void VM::releaseExecutableMemory()
-{
-    prepareToDiscardCode();
-    
-    if (entryScope) {
-        StackPreservingRecompiler recompiler;
-        HeapIterationScope iterationScope(heap);
-        HashSet&lt;JSCell*&gt; roots;
-        heap.getConservativeRegisterRoots(roots);
-        HashSet&lt;JSCell*&gt;::iterator end = roots.end();
-        for (HashSet&lt;JSCell*&gt;::iterator ptr = roots.begin(); ptr != end; ++ptr) {
-            ScriptExecutable* executable = 0;
-            JSCell* cell = *ptr;
-            if (cell-&gt;inherits(ScriptExecutable::info()))
-                executable = static_cast&lt;ScriptExecutable*&gt;(*ptr);
-            else if (cell-&gt;inherits(JSFunction::info())) {
-                JSFunction* function = jsCast&lt;JSFunction*&gt;(*ptr);
-                if (function-&gt;isHostFunction())
-                    continue;
-                executable = function-&gt;jsExecutable();
-            } else
-                continue;
-            ASSERT(executable-&gt;inherits(ScriptExecutable::info()));
-            executable-&gt;unlinkCalls();
-            if (executable-&gt;inherits(FunctionExecutable::info()))
-                recompiler.currentlyExecutingFunctions.add(static_cast&lt;FunctionExecutable*&gt;(executable));
-                
-        }
-        heap.objectSpace().forEachLiveCell&lt;StackPreservingRecompiler&gt;(iterationScope, recompiler);
-    }
-    m_regExpCache-&gt;invalidateCode();
-    heap.collectAllGarbage();
-}
-
</del><span class="cx"> void VM::throwException(ExecState* exec, Exception* exception)
</span><span class="cx"> {
</span><span class="cx">     if (Options::breakOnThrow()) {
</span><span class="lines">@@ -669,11 +617,6 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void releaseExecutableMemory(VM&amp; vm)
-{
-    vm.releaseExecutableMemory();
-}
-
</del><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx"> void VM::gatherConservativeRoots(ConservativeRoots&amp; conservativeRoots)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -514,7 +514,6 @@
</span><span class="cx">     JS_EXPORT_PRIVATE void dumpRegExpTrace();
</span><span class="cx"> 
</span><span class="cx">     bool isCollectorBusy() { return heap.isBusy(); }
</span><del>-    JS_EXPORT_PRIVATE void releaseExecutableMemory();
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(GC_VALIDATION)
</span><span class="cx">     bool isInitializingObject() const; 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeWatchdogcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Watchdog.cpp (188338 => 188339)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Watchdog.cpp        2015-08-12 18:14:02 UTC (rev 188338)
+++ trunk/Source/JavaScriptCore/runtime/Watchdog.cpp        2015-08-12 18:28:20 UTC (rev 188339)
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     if (!hadTimeLimit) {
</span><span class="cx">         // And if we've previously compiled any functions, we need to revert
</span><span class="cx">         // them because they don't have the needed polling checks yet.
</span><del>-        vm.releaseExecutableMemory();
</del><ins>+        vm.discardAllCode();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_hasEnteredVM &amp;&amp; hasTimeLimit())
</span></span></pre>
</div>
</div>

</body>
</html>