<!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>[204393] 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/204393">204393</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-08-11 17:22:20 -0700 (Thu, 11 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>[JSC] Revert most of <a href="http://trac.webkit.org/projects/webkit/changeset/203808">r203808</a>
https://bugs.webkit.org/show_bug.cgi?id=160784
Patch by Benjamin Poulain <bpoulain@apple.com> on 2016-08-11
Reviewed by Geoffrey Garen.
Switching to fastMalloc() caused regressions on Jetstream and Octane
on MacBook Air. I was able to get back some of it in the following
patches but the tests that never go to FTL are still regressed.
This patch revert <a href="http://trac.webkit.org/projects/webkit/changeset/203808">r203808</a> except of the node index.
Nodes are allocated with the custom allocator like before but they are
now also kept in a table, addressed by the node index.
* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* b3/B3SparseCollection.h:
(JSC::B3::SparseCollection::packIndices): Deleted.
* dfg/DFGAllocator.h: Added.
(JSC::DFG::Allocator::Region::size):
(JSC::DFG::Allocator::Region::headerSize):
(JSC::DFG::Allocator::Region::numberOfThingsPerRegion):
(JSC::DFG::Allocator::Region::data):
(JSC::DFG::Allocator::Region::isInThisRegion):
(JSC::DFG::Allocator::Region::regionFor):
(JSC::DFG::Allocator<T>::Allocator):
(JSC::DFG::Allocator<T>::~Allocator):
(JSC::DFG::Allocator<T>::allocate):
(JSC::DFG::Allocator<T>::free):
(JSC::DFG::Allocator<T>::freeAll):
(JSC::DFG::Allocator<T>::reset):
(JSC::DFG::Allocator<T>::indexOf):
(JSC::DFG::Allocator<T>::allocatorOf):
(JSC::DFG::Allocator<T>::bumpAllocate):
(JSC::DFG::Allocator<T>::freeListAllocate):
(JSC::DFG::Allocator<T>::allocateSlow):
(JSC::DFG::Allocator<T>::freeRegionsStartingAt):
(JSC::DFG::Allocator<T>::startBumpingIn):
* dfg/DFGDriver.cpp:
(JSC::DFG::compileImpl):
* dfg/DFGGraph.cpp:
(JSC::DFG::Graph::Graph):
(JSC::DFG::Graph::~Graph):
(JSC::DFG::Graph::addNodeToMapByIndex):
(JSC::DFG::Graph::deleteNode):
(JSC::DFG::Graph::packNodeIndices):
* dfg/DFGGraph.h:
(JSC::DFG::Graph::addNode):
(JSC::DFG::Graph::maxNodeCount):
(JSC::DFG::Graph::nodeAt):
* dfg/DFGLongLivedState.cpp: Added.
(JSC::DFG::LongLivedState::LongLivedState):
(JSC::DFG::LongLivedState::~LongLivedState):
(JSC::DFG::LongLivedState::shrinkToFit):
* dfg/DFGLongLivedState.h: Added.
* dfg/DFGNode.h:
* dfg/DFGNodeAllocator.h: Added.
(operator new ):
* dfg/DFGPlan.cpp:
(JSC::DFG::Plan::compileInThread):
(JSC::DFG::Plan::compileInThreadImpl):
* dfg/DFGPlan.h:
* dfg/DFGWorklist.cpp:
(JSC::DFG::Worklist::runThread):
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3SparseCollectionh">trunk/Source/JavaScriptCore/b3/B3SparseCollection.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDrivercpp">trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGGraphcpp">trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGGraphh">trunk/Source/JavaScriptCore/dfg/DFGGraph.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPlancpp">trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPlanh">trunk/Source/JavaScriptCore/dfg/DFGPlan.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGWorklistcpp">trunk/Source/JavaScriptCore/dfg/DFGWorklist.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>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoredfgDFGAllocatorh">trunk/Source/JavaScriptCore/dfg/DFGAllocator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGLongLivedStatecpp">trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGLongLivedStateh">trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeAllocatorh">trunk/Source/JavaScriptCore/dfg/DFGNodeAllocator.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -312,6 +312,7 @@
</span><span class="cx"> dfg/DFGLazyJSValue.cpp
</span><span class="cx"> dfg/DFGLazyNode.cpp
</span><span class="cx"> dfg/DFGLivenessAnalysisPhase.cpp
</span><ins>+ dfg/DFGLongLivedState.cpp
</ins><span class="cx"> dfg/DFGLoopPreHeaderCreationPhase.cpp
</span><span class="cx"> dfg/DFGMaximalFlushInsertionPhase.cpp
</span><span class="cx"> dfg/DFGMayExit.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -1,3 +1,72 @@
</span><ins>+2016-08-11 Benjamin Poulain <bpoulain@apple.com>
+
+ [JSC] Revert most of r203808
+ https://bugs.webkit.org/show_bug.cgi?id=160784
+
+ Reviewed by Geoffrey Garen.
+
+ Switching to fastMalloc() caused regressions on Jetstream and Octane
+ on MacBook Air. I was able to get back some of it in the following
+ patches but the tests that never go to FTL are still regressed.
+
+ This patch revert r203808 except of the node index.
+ Nodes are allocated with the custom allocator like before but they are
+ now also kept in a table, addressed by the node index.
+
+ * CMakeLists.txt:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * b3/B3SparseCollection.h:
+ (JSC::B3::SparseCollection::packIndices): Deleted.
+ * dfg/DFGAllocator.h: Added.
+ (JSC::DFG::Allocator::Region::size):
+ (JSC::DFG::Allocator::Region::headerSize):
+ (JSC::DFG::Allocator::Region::numberOfThingsPerRegion):
+ (JSC::DFG::Allocator::Region::data):
+ (JSC::DFG::Allocator::Region::isInThisRegion):
+ (JSC::DFG::Allocator::Region::regionFor):
+ (JSC::DFG::Allocator<T>::Allocator):
+ (JSC::DFG::Allocator<T>::~Allocator):
+ (JSC::DFG::Allocator<T>::allocate):
+ (JSC::DFG::Allocator<T>::free):
+ (JSC::DFG::Allocator<T>::freeAll):
+ (JSC::DFG::Allocator<T>::reset):
+ (JSC::DFG::Allocator<T>::indexOf):
+ (JSC::DFG::Allocator<T>::allocatorOf):
+ (JSC::DFG::Allocator<T>::bumpAllocate):
+ (JSC::DFG::Allocator<T>::freeListAllocate):
+ (JSC::DFG::Allocator<T>::allocateSlow):
+ (JSC::DFG::Allocator<T>::freeRegionsStartingAt):
+ (JSC::DFG::Allocator<T>::startBumpingIn):
+ * dfg/DFGDriver.cpp:
+ (JSC::DFG::compileImpl):
+ * dfg/DFGGraph.cpp:
+ (JSC::DFG::Graph::Graph):
+ (JSC::DFG::Graph::~Graph):
+ (JSC::DFG::Graph::addNodeToMapByIndex):
+ (JSC::DFG::Graph::deleteNode):
+ (JSC::DFG::Graph::packNodeIndices):
+ * dfg/DFGGraph.h:
+ (JSC::DFG::Graph::addNode):
+ (JSC::DFG::Graph::maxNodeCount):
+ (JSC::DFG::Graph::nodeAt):
+ * dfg/DFGLongLivedState.cpp: Added.
+ (JSC::DFG::LongLivedState::LongLivedState):
+ (JSC::DFG::LongLivedState::~LongLivedState):
+ (JSC::DFG::LongLivedState::shrinkToFit):
+ * dfg/DFGLongLivedState.h: Added.
+ * dfg/DFGNode.h:
+ * dfg/DFGNodeAllocator.h: Added.
+ (operator new ):
+ * dfg/DFGPlan.cpp:
+ (JSC::DFG::Plan::compileInThread):
+ (JSC::DFG::Plan::compileInThreadImpl):
+ * dfg/DFGPlan.h:
+ * dfg/DFGWorklist.cpp:
+ (JSC::DFG::Worklist::runThread):
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+ * runtime/VM.h:
+
</ins><span class="cx"> 2016-08-11 Mark Lam <mark.lam@apple.com>
</span><span class="cx">
</span><span class="cx"> The jsc shell's Element host constructor should throw if it fails to construct an object.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -885,6 +885,8 @@
</span><span class="cx">                 0FEFC9AB1681A3B600567F53 /* DFGOSRExitJumpPlaceholder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FEFC9A81681A3B000567F53 /* DFGOSRExitJumpPlaceholder.h */; };
</span><span class="cx">                 0FF054F91AC35B4400E5BE57 /* ExecutableAllocationFuzz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FF054F71AC35B4400E5BE57 /* ExecutableAllocationFuzz.cpp */; };
</span><span class="cx">                 0FF054FA1AC35B4400E5BE57 /* ExecutableAllocationFuzz.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FF054F81AC35B4400E5BE57 /* ExecutableAllocationFuzz.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0FF0F19916B729F6005DF95B /* DFGLongLivedState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4B51C16B62772003F696B /* DFGLongLivedState.cpp */; };
+                0FF0F19B16B729FA005DF95B /* DFGLongLivedState.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4B51D16B62772003F696B /* DFGLongLivedState.h */; };
</ins><span class="cx">                 0FF0F19C16B72A03005DF95B /* DFGNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4B51E16B62772003F696B /* DFGNode.cpp */; };
</span><span class="cx">                 0FF0F19D16B72A08005DF95B /* DFGCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4B51A16B62772003F696B /* DFGCommon.cpp */; };
</span><span class="cx">                 0FF0F19E16B72A0B005DF95B /* DFGEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4B51B16B62772003F696B /* DFGEdge.cpp */; };
</span><span class="lines">@@ -937,7 +939,9 @@
</span><span class="cx">                 0FFA549816B8835300B3A982 /* A64DOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 652A3A231651C69700A80AFE /* A64DOpcode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0FFB6C381AF48DDC00DB1BF7 /* TypeofType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FFB6C361AF48DDC00DB1BF7 /* TypeofType.cpp */; };
</span><span class="cx">                 0FFB6C391AF48DDC00DB1BF7 /* TypeofType.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FFB6C371AF48DDC00DB1BF7 /* TypeofType.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0FFB921816D02EB20055A5DB /* DFGAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4B51916B62772003F696B /* DFGAllocator.h */; };
</ins><span class="cx">                 0FFB921A16D02EC50055A5DB /* DFGBasicBlockInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD5652216AB780A00197653 /* DFGBasicBlockInlines.h */; };
</span><ins>+                0FFB921B16D02F010055A5DB /* DFGNodeAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4B51F16B62772003F696B /* DFGNodeAllocator.h */; };
</ins><span class="cx">                 0FFB921C16D02F110055A5DB /* DFGOSRExitCompilationInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 65987F2C167FE84B003C2F8D /* DFGOSRExitCompilationInfo.h */; };
</span><span class="cx">                 0FFB921D16D02F300055A5DB /* DFGSlowPathGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F1E3A501537C2CB000F9456 /* DFGSlowPathGenerator.h */; };
</span><span class="cx">                 0FFB922016D033B70055A5DB /* NodeConstructors.h in Headers */ = {isa = PBXBuildFile; fileRef = 930DAD030FB1EB1A0082D205 /* NodeConstructors.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2793,9 +2797,13 @@
</span><span class="cx">                 0FB387911BFD31A100E3AB1E /* FTLCompile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLCompile.cpp; path = ftl/FTLCompile.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0FB438A219270B1D00E1FBC9 /* StructureSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureSet.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0FB4B51016B3A964003F696B /* DFGMinifiedID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGMinifiedID.h; path = dfg/DFGMinifiedID.h; sourceTree = "<group>"; };
</span><ins>+                0FB4B51916B62772003F696B /* DFGAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGAllocator.h; path = dfg/DFGAllocator.h; sourceTree = "<group>"; };
</ins><span class="cx">                 0FB4B51A16B62772003F696B /* DFGCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGCommon.cpp; path = dfg/DFGCommon.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0FB4B51B16B62772003F696B /* DFGEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGEdge.cpp; path = dfg/DFGEdge.cpp; sourceTree = "<group>"; };
</span><ins>+                0FB4B51C16B62772003F696B /* DFGLongLivedState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGLongLivedState.cpp; path = dfg/DFGLongLivedState.cpp; sourceTree = "<group>"; };
+                0FB4B51D16B62772003F696B /* DFGLongLivedState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGLongLivedState.h; path = dfg/DFGLongLivedState.h; sourceTree = "<group>"; };
</ins><span class="cx">                 0FB4B51E16B62772003F696B /* DFGNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGNode.cpp; path = dfg/DFGNode.cpp; sourceTree = "<group>"; };
</span><ins>+                0FB4B51F16B62772003F696B /* DFGNodeAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGNodeAllocator.h; path = dfg/DFGNodeAllocator.h; sourceTree = "<group>"; };
</ins><span class="cx">                 0FB4B52116B6278D003F696B /* FunctionExecutableDump.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionExecutableDump.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0FB4B52216B6278D003F696B /* FunctionExecutableDump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionExecutableDump.h; sourceTree = "<group>"; };
</span><span class="cx">                 0FB4FB701BC843140025CA5A /* FTLLazySlowPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLLazySlowPath.cpp; path = ftl/FTLLazySlowPath.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -6193,6 +6201,7 @@
</span><span class="cx">                                 0F18D3CD1B55A6E0002C5C9F /* DFGAdaptiveStructureWatchpoint.cpp */,
</span><span class="cx">                                 0F18D3CE1B55A6E0002C5C9F /* DFGAdaptiveStructureWatchpoint.h */,
</span><span class="cx">                                 0F66E16814DF3F1300B7B2E4 /* DFGAdjacencyList.h */,
</span><ins>+                                0FB4B51916B62772003F696B /* DFGAllocator.h */,
</ins><span class="cx">                                 0F1E3A431534CBAD000F9456 /* DFGArgumentPosition.h */,
</span><span class="cx">                                 0F2DD80C1AB3D8BE00BBB8E8 /* DFGArgumentsEliminationPhase.cpp */,
</span><span class="cx">                                 0F2DD80D1AB3D8BE00BBB8E8 /* DFGArgumentsEliminationPhase.h */,
</span><span class="lines">@@ -6342,6 +6351,8 @@
</span><span class="cx">                                 79C4B15C1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h */,
</span><span class="cx">                                 A7D89CEC17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.cpp */,
</span><span class="cx">                                 A7D89CED17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.h */,
</span><ins>+                                0FB4B51C16B62772003F696B /* DFGLongLivedState.cpp */,
+                                0FB4B51D16B62772003F696B /* DFGLongLivedState.h */,
</ins><span class="cx">                                 A767B5B317A0B9650063D940 /* DFGLoopPreHeaderCreationPhase.cpp */,
</span><span class="cx">                                 A767B5B417A0B9650063D940 /* DFGLoopPreHeaderCreationPhase.h */,
</span><span class="cx">                                 79F8FC1C1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp */,
</span><span class="lines">@@ -6361,6 +6372,7 @@
</span><span class="cx">                                 A737810B1799EA2E00817533 /* DFGNaturalLoops.h */,
</span><span class="cx">                                 0FB4B51E16B62772003F696B /* DFGNode.cpp */,
</span><span class="cx">                                 86ECA3E9132DEF1C002B2AD7 /* DFGNode.h */,
</span><ins>+                                0FB4B51F16B62772003F696B /* DFGNodeAllocator.h */,
</ins><span class="cx">                                 0FA581B7150E952A00B9A2D9 /* DFGNodeFlags.cpp */,
</span><span class="cx">                                 0FA581B8150E952A00B9A2D9 /* DFGNodeFlags.h */,
</span><span class="cx">                                 0F5D085C1B8CF99D001143B4 /* DFGNodeOrigin.cpp */,
</span><span class="lines">@@ -7298,6 +7310,7 @@
</span><span class="cx">                                 998ED6751BED768C00DD8017 /* RemoteControllableTarget.h in Headers */,
</span><span class="cx">                                 0F33FCF81C136E2500323F67 /* B3StackmapGenerationParams.h in Headers */,
</span><span class="cx">                                 0F66E16B14DF3F1600B7B2E4 /* DFGAdjacencyList.h in Headers */,
</span><ins>+                                0FFB921816D02EB20055A5DB /* DFGAllocator.h in Headers */,
</ins><span class="cx">                                 0F1E3A461534CBAF000F9456 /* DFGArgumentPosition.h in Headers */,
</span><span class="cx">                                 0F2DD8121AB3D8BE00BBB8E8 /* DFGArgumentsEliminationPhase.h in Headers */,
</span><span class="cx">                                 0F2DD8141AB3D8BE00BBB8E8 /* DFGArgumentsUtilities.h in Headers */,
</span><span class="lines">@@ -7395,6 +7408,7 @@
</span><span class="cx">                                 99D6A1161BEAD34D00E25C37 /* RemoteAutomationTarget.h in Headers */,
</span><span class="cx">                                 79C4B15E1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h in Headers */,
</span><span class="cx">                                 A7D89CFC17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.h in Headers */,
</span><ins>+                                0FF0F19B16B729FA005DF95B /* DFGLongLivedState.h in Headers */,
</ins><span class="cx">                                 0F338DF21BE93AD10013C88F /* B3StackmapValue.h in Headers */,
</span><span class="cx">                                 A767B5B617A0B9650063D940 /* DFGLoopPreHeaderCreationPhase.h in Headers */,
</span><span class="cx">                                 79F8FC1F1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.h in Headers */,
</span><span class="lines">@@ -7407,6 +7421,7 @@
</span><span class="cx">                                 0FF2CD5C1B61A4F8004955A8 /* DFGMultiGetByOffsetData.h in Headers */,
</span><span class="cx">                                 A737810E1799EA2E00817533 /* DFGNaturalLoops.h in Headers */,
</span><span class="cx">                                 86ECA3EA132DEF1C002B2AD7 /* DFGNode.h in Headers */,
</span><ins>+                                0FFB921B16D02F010055A5DB /* DFGNodeAllocator.h in Headers */,
</ins><span class="cx">                                 70B791931C024A28002481E2 /* GeneratorFrame.h in Headers */,
</span><span class="cx">                                 0FA581BB150E953000B9A2D9 /* DFGNodeFlags.h in Headers */,
</span><span class="cx">                                 0F300B7818AB051100A6D72E /* DFGNodeOrigin.h in Headers */,
</span><span class="lines">@@ -8972,6 +8987,7 @@
</span><span class="cx">                                 A7D9A29717A0BC7400EE2618 /* DFGLICMPhase.cpp in Sources */,
</span><span class="cx">                                 79C4B15D1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.cpp in Sources */,
</span><span class="cx">                                 A7D89CFB17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.cpp in Sources */,
</span><ins>+                                0FF0F19916B729F6005DF95B /* DFGLongLivedState.cpp in Sources */,
</ins><span class="cx">                                 A767B5B517A0B9650063D940 /* DFGLoopPreHeaderCreationPhase.cpp in Sources */,
</span><span class="cx">                                 79F8FC1E1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp in Sources */,
</span><span class="cx">                                 0F5874ED194FEB1200AAB2C1 /* DFGMayExit.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3SparseCollectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3SparseCollection.h (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3SparseCollection.h        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/b3/B3SparseCollection.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> #ifndef B3SparseCollection_h
</span><span class="cx"> #define B3SparseCollection_h
</span><span class="cx">
</span><ins>+#if ENABLE(B3_JIT)
+
</ins><span class="cx"> #include <wtf/StdLibExtras.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx">
</span><span class="lines">@@ -74,42 +76,6 @@
</span><span class="cx"> m_vector[value->m_index] = nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void packIndices()
- {
- if (m_indexFreeList.isEmpty())
- return;
-
- unsigned holeIndex = 0;
- unsigned endIndex = m_vector.size();
-
- while (true) {
- while (holeIndex < endIndex && m_vector[holeIndex])
- ++holeIndex;
-
- if (holeIndex == endIndex)
- break;
- ASSERT(holeIndex < m_vector.size());
- ASSERT(!m_vector[holeIndex]);
-
- do {
- --endIndex;
- } while (!m_vector[endIndex] && endIndex > holeIndex);
-
- if (holeIndex == endIndex)
- break;
- ASSERT(endIndex > holeIndex);
- ASSERT(m_vector[endIndex]);
-
- auto& value = m_vector[endIndex];
- value->m_index = holeIndex;
- m_vector[holeIndex] = WTFMove(value);
- ++holeIndex;
- }
-
- m_indexFreeList.resize(0);
- m_vector.resize(endIndex);
- }
-
</del><span class="cx"> unsigned size() const { return m_vector.size(); }
</span><span class="cx"> bool isEmpty() const { return m_vector.isEmpty(); }
</span><span class="cx">
</span><span class="lines">@@ -174,5 +140,7 @@
</span><span class="cx">
</span><span class="cx"> } } // namespace JSC::B3
</span><span class="cx">
</span><ins>+#endif // ENABLE(B3_JIT)
+
</ins><span class="cx"> #endif // B3SparseCollection_h
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGAllocatorh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/dfg/DFGAllocator.h (0 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGAllocator.h         (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGAllocator.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -0,0 +1,239 @@
</span><ins>+/*
+ * Copyright (C) 2013 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. ``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
+ * 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 DFGAllocator_h
+#define DFGAllocator_h
+
+#if ENABLE(DFG_JIT)
+
+#include "DFGCommon.h"
+#include <wtf/StdLibExtras.h>
+
+namespace JSC { namespace DFG {
+
+// Custom pool allocator for exactly one type (type T). It has fast (O(1), only a few
+// instructions) allocator, and a similarly fast free(). Recycling works if either of
+// the following is true:
+// - T has a trivial destructor. In that case you don't have to ever call free() on
+// anything. You can just call freeAll() instead.
+// - You call free() on all T's that you allocated, and never use freeAll().
+
+template<typename T>
+class Allocator {
+public:
+ Allocator();
+ ~Allocator();
+
+ void* allocate(); // Use placement new to allocate, and avoid using this method.
+ void free(T*); // Call this method to delete; never use 'delete' directly.
+
+ void freeAll(); // Only call this if you've either freed everything or if T has a trivial destructor.
+ void reset(); // Like freeAll(), but also returns all memory to the OS.
+
+ unsigned indexOf(const T*);
+
+ static Allocator* allocatorOf(const T*);
+
+private:
+ void* bumpAllocate();
+ void* freeListAllocate();
+ void* allocateSlow();
+
+ struct Region {
+ static size_t size() { return 64 * KB; }
+ static size_t headerSize() { return std::max(sizeof(Region), sizeof(T)); }
+ static unsigned numberOfThingsPerRegion() { return (size() - headerSize()) / sizeof(T); }
+ T* data() { return bitwise_cast<T*>(bitwise_cast<char*>(this) + headerSize()); }
+ bool isInThisRegion(const T* pointer) { return static_cast<unsigned>(pointer - data()) < numberOfThingsPerRegion(); }
+ static Region* regionFor(const T* pointer) { return bitwise_cast<Region*>(bitwise_cast<uintptr_t>(pointer) & ~(size() - 1)); }
+
+ void* m_allocation;
+ Allocator* m_allocator;
+ Region* m_next;
+ };
+
+ void freeRegionsStartingAt(Region*);
+ void startBumpingIn(Region*);
+
+ Region* m_regionHead;
+ void** m_freeListHead;
+ T* m_bumpEnd;
+ unsigned m_bumpRemaining;
+};
+
+template<typename T>
+inline Allocator<T>::Allocator()
+ : m_regionHead(0)
+ , m_freeListHead(0)
+ , m_bumpRemaining(0)
+{
+}
+
+template<typename T>
+inline Allocator<T>::~Allocator()
+{
+ reset();
+}
+
+template<typename T>
+ALWAYS_INLINE void* Allocator<T>::allocate()
+{
+ void* result = bumpAllocate();
+ if (LIKELY(!!result))
+ return result;
+ return freeListAllocate();
+}
+
+template<typename T>
+void Allocator<T>::free(T* object)
+{
+ object->~T();
+
+ void** cell = bitwise_cast<void**>(object);
+ *cell = m_freeListHead;
+ m_freeListHead = cell;
+}
+
+template<typename T>
+void Allocator<T>::freeAll()
+{
+ if (!m_regionHead) {
+ ASSERT(!m_bumpRemaining);
+ ASSERT(!m_freeListHead);
+ return;
+ }
+
+ // Since the caller is opting out of calling the destructor for any allocated thing,
+ // we have two choices, plus a continuum between: we can either just delete all regions
+ // (i.e. call reset()), or we can make all regions available for reuse. We do something
+ // that optimizes for (a) speed of freeAll(), (b) the assumption that if the user calls
+ // freeAll() then they will probably be calling allocate() in the near future. Namely,
+ // we free all but one region, and make the remaining region a bump allocation region.
+
+ freeRegionsStartingAt(m_regionHead->m_next);
+
+ m_regionHead->m_next = 0;
+ m_freeListHead = 0;
+ startBumpingIn(m_regionHead);
+}
+
+template<typename T>
+void Allocator<T>::reset()
+{
+ freeRegionsStartingAt(m_regionHead);
+
+ m_regionHead = 0;
+ m_freeListHead = 0;
+ m_bumpRemaining = 0;
+}
+
+template<typename T>
+unsigned Allocator<T>::indexOf(const T* object)
+{
+ unsigned numRegions = 0;
+ for (Region* region = m_regionHead; region; region = region->m_next)
+ numRegions++;
+ unsigned regionIndex = 0;
+ for (Region* region = m_regionHead; region; region = region->m_next) {
+ if (region->isInThisRegion(object))
+ return (numRegions - 1 - regionIndex) * Region::numberOfThingsPerRegion() + (object - region->data());
+ regionIndex++;
+ }
+ CRASH();
+ return 0;
+}
+
+template<typename T>
+Allocator<T>* Allocator<T>::allocatorOf(const T* object)
+{
+ return Region::regionFor(object)->m_allocator;
+}
+
+template<typename T>
+ALWAYS_INLINE void* Allocator<T>::bumpAllocate()
+{
+ if (unsigned remaining = m_bumpRemaining) {
+ remaining--;
+ m_bumpRemaining = remaining;
+ return m_bumpEnd - (remaining + 1);
+ }
+ return 0;
+}
+
+template<typename T>
+void* Allocator<T>::freeListAllocate()
+{
+ void** result = m_freeListHead;
+ if (UNLIKELY(!result))
+ return allocateSlow();
+ m_freeListHead = bitwise_cast<void**>(*result);
+ return result;
+}
+
+template<typename T>
+void* Allocator<T>::allocateSlow()
+{
+ ASSERT(!m_freeListHead);
+ ASSERT(!m_bumpRemaining);
+
+ if (logCompilationChanges())
+ dataLog("Allocating another allocator region.\n");
+
+ void* allocation = fastAlignedMalloc(Region::size(), Region::size());
+ Region* region = static_cast<Region*>(allocation);
+ region->m_allocation = allocation;
+ region->m_allocator = this;
+ startBumpingIn(region);
+ region->m_next = m_regionHead;
+ m_regionHead = region;
+
+ void* result = bumpAllocate();
+ ASSERT(result);
+ return result;
+}
+
+template<typename T>
+void Allocator<T>::freeRegionsStartingAt(typename Allocator<T>::Region* region)
+{
+ while (region) {
+ Region* nextRegion = region->m_next;
+ fastAlignedFree(region->m_allocation);
+ region = nextRegion;
+ }
+}
+
+template<typename T>
+void Allocator<T>::startBumpingIn(typename Allocator<T>::Region* region)
+{
+ m_bumpEnd = region->data() + Region::numberOfThingsPerRegion();
+ m_bumpRemaining = Region::numberOfThingsPerRegion();
+}
+
+} } // namespace JSC::DFG
+
+#endif // ENABLE(DFG_JIT)
+
+#endif // DFGAllocator_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDrivercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -108,7 +108,7 @@
</span><span class="cx"> return CompilationDeferred;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- plan->compileInThread(nullptr);
</del><ins>+ plan->compileInThread(*vm.dfgState, 0);
</ins><span class="cx"> return plan->finalizeWithoutNotifyingCallback();
</span><span class="cx"> }
</span><span class="cx"> #else // ENABLE(DFG_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGGraphcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -66,11 +66,12 @@
</span><span class="cx"> #undef STRINGIZE_DFG_OP_ENUM
</span><span class="cx"> };
</span><span class="cx">
</span><del>-Graph::Graph(VM& vm, Plan& plan)
</del><ins>+Graph::Graph(VM& vm, Plan& plan, LongLivedState& longLivedState)
</ins><span class="cx"> : m_vm(vm)
</span><span class="cx"> , m_plan(plan)
</span><span class="cx"> , m_codeBlock(m_plan.codeBlock)
</span><span class="cx"> , m_profiledBlock(m_codeBlock->alternative())
</span><ins>+ , m_allocator(longLivedState.m_allocator)
</ins><span class="cx"> , m_cfg(std::make_unique<CFG>(*this))
</span><span class="cx"> , m_nextMachineLocal(0)
</span><span class="cx"> , m_fixpointState(BeforeFixpoint)
</span><span class="lines">@@ -86,6 +87,17 @@
</span><span class="cx">
</span><span class="cx"> Graph::~Graph()
</span><span class="cx"> {
</span><ins>+ for (BlockIndex blockIndex = numBlocks(); blockIndex--;) {
+ BasicBlock* block = this->block(blockIndex);
+ if (!block)
+ continue;
+
+ for (unsigned phiIndex = block->phis.size(); phiIndex--;)
+ m_allocator.free(block->phis[phiIndex]);
+ for (unsigned nodeIndex = block->size(); nodeIndex--;)
+ m_allocator.free(block->at(nodeIndex));
+ }
+ m_allocator.freeAll();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char *Graph::opName(NodeType op)
</span><span class="lines">@@ -567,6 +579,19 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void Graph::addNodeToMapByIndex(Node* node)
+{
+ if (m_nodeIndexFreeList.isEmpty()) {
+ node->m_index = m_nodesByIndex.size();
+ m_nodesByIndex.append(node);
+ return;
+ }
+ unsigned index = m_nodeIndexFreeList.takeLast();
+ node->m_index = index;
+ ASSERT(!m_nodesByIndex[index]);
+ m_nodesByIndex[index] = node;
+}
+
</ins><span class="cx"> void Graph::deleteNode(Node* node)
</span><span class="cx"> {
</span><span class="cx"> if (validationEnabled() && m_form == SSA) {
</span><span class="lines">@@ -575,12 +600,49 @@
</span><span class="cx"> DFG_ASSERT(*this, node, !block->ssa->liveAtTail.contains(node));
</span><span class="cx"> }
</span><span class="cx"> }
</span><del>- m_nodes.remove(node);
</del><ins>+
+ RELEASE_ASSERT(m_nodesByIndex[node->m_index] == node);
+ unsigned nodeIndex = node->m_index;
+ m_nodesByIndex[nodeIndex] = nullptr;
+ m_nodeIndexFreeList.append(nodeIndex);
+
+ m_allocator.free(node);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void Graph::packNodeIndices()
</span><span class="cx"> {
</span><del>- m_nodes.packIndices();
</del><ins>+ if (m_nodeIndexFreeList.isEmpty())
+ return;
+
+ unsigned holeIndex = 0;
+ unsigned endIndex = m_nodesByIndex.size();
+
+ while (true) {
+ while (holeIndex < endIndex && m_nodesByIndex[holeIndex])
+ ++holeIndex;
+
+ if (holeIndex == endIndex)
+ break;
+ ASSERT(holeIndex < m_nodesByIndex.size());
+ ASSERT(!m_nodesByIndex[holeIndex]);
+
+ do {
+ --endIndex;
+ } while (!m_nodesByIndex[endIndex] && endIndex > holeIndex);
+
+ if (holeIndex == endIndex)
+ break;
+ ASSERT(endIndex > holeIndex);
+ ASSERT(m_nodesByIndex[endIndex]);
+
+ auto& value = m_nodesByIndex[endIndex];
+ value->m_index = holeIndex;
+ m_nodesByIndex[holeIndex] = WTFMove(value);
+ ++holeIndex;
+ }
+
+ m_nodeIndexFreeList.resize(0);
+ m_nodesByIndex.resize(endIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void Graph::dethread()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGGraphh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGGraph.h (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGGraph.h        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGGraph.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -29,13 +29,14 @@
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx">
</span><span class="cx"> #include "AssemblyHelpers.h"
</span><del>-#include "B3SparseCollection.h"
</del><span class="cx"> #include "BytecodeLivenessAnalysisInlines.h"
</span><span class="cx"> #include "CodeBlock.h"
</span><span class="cx"> #include "DFGArgumentPosition.h"
</span><span class="cx"> #include "DFGBasicBlock.h"
</span><span class="cx"> #include "DFGFrozenValue.h"
</span><ins>+#include "DFGLongLivedState.h"
</ins><span class="cx"> #include "DFGNode.h"
</span><ins>+#include "DFGNodeAllocator.h"
</ins><span class="cx"> #include "DFGPlan.h"
</span><span class="cx"> #include "DFGPropertyTypeKey.h"
</span><span class="cx"> #include "DFGScannable.h"
</span><span class="lines">@@ -123,7 +124,7 @@
</span><span class="cx"> // Nodes that are 'dead' remain in the vector with refCount 0.
</span><span class="cx"> class Graph : public virtual Scannable {
</span><span class="cx"> public:
</span><del>- Graph(VM&, Plan&);
</del><ins>+ Graph(VM&, Plan&, LongLivedState&);
</ins><span class="cx"> ~Graph();
</span><span class="cx">
</span><span class="cx"> void changeChild(Edge& edge, Node* newNode)
</span><span class="lines">@@ -183,20 +184,22 @@
</span><span class="cx"> template<typename... Params>
</span><span class="cx"> Node* addNode(Params... params)
</span><span class="cx"> {
</span><del>- Node* node = new Node(params...);
- m_nodes.add(std::unique_ptr<Node>(node));
</del><ins>+ Node* node = new (m_allocator) Node(params...);
+ addNodeToMapByIndex(node);
</ins><span class="cx"> return node;
</span><span class="cx"> }
</span><span class="cx"> template<typename... Params>
</span><span class="cx"> Node* addNode(SpeculatedType type, Params... params)
</span><span class="cx"> {
</span><del>- Node* node = addNode(params...);
</del><ins>+ Node* node = new (m_allocator) Node(params...);
</ins><span class="cx"> node->predict(type);
</span><ins>+ addNodeToMapByIndex(node);
</ins><span class="cx"> return node;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> void deleteNode(Node*);
</span><del>- unsigned maxNodeCount() const { return m_nodes.size(); }
- Node* nodeAt(unsigned index) const { return m_nodes[index]; }
</del><ins>+ unsigned maxNodeCount() const { return m_nodesByIndex.size(); }
+ Node* nodeAt(unsigned index) const { return m_nodesByIndex[index]; }
</ins><span class="cx"> void packNodeIndices();
</span><span class="cx">
</span><span class="cx"> Vector<AbstractValue, 0, UnsafeVectorOverflow>& abstractValuesCache() { return m_abstractValuesCache; }
</span><span class="lines">@@ -834,6 +837,8 @@
</span><span class="cx"> Plan& m_plan;
</span><span class="cx"> CodeBlock* m_codeBlock;
</span><span class="cx"> CodeBlock* m_profiledBlock;
</span><ins>+
+ NodeAllocator& m_allocator;
</ins><span class="cx">
</span><span class="cx"> Vector< RefPtr<BasicBlock> , 8> m_blocks;
</span><span class="cx"> Vector<Edge, 16> m_varArgChildren;
</span><span class="lines">@@ -922,7 +927,7 @@
</span><span class="cx"> bool m_hasDebuggerEnabled;
</span><span class="cx"> bool m_hasExceptionHandlers { false };
</span><span class="cx"> private:
</span><del>- void adoptNodeOutOfLine(Node&);
</del><ins>+ void addNodeToMapByIndex(Node*);
</ins><span class="cx">
</span><span class="cx"> bool isStringPrototypeMethodSane(JSGlobalObject*, UniquedStringImpl*);
</span><span class="cx">
</span><span class="lines">@@ -956,7 +961,8 @@
</span><span class="cx"> return bytecodeCanTruncateInteger(add->arithNodeFlags()) ? SpeculateInt32AndTruncateConstants : DontSpeculateInt32;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- B3::SparseCollection<Node> m_nodes;
</del><ins>+ Vector<Node*, 0, UnsafeVectorOverflow> m_nodesByIndex;
+ Vector<unsigned, 0, UnsafeVectorOverflow> m_nodeIndexFreeList;
</ins><span class="cx"> Vector<AbstractValue, 0, UnsafeVectorOverflow> m_abstractValuesCache;
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGLongLivedStatecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.cpp (0 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.cpp         (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+/*
+ * Copyright (C) 2013 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. ``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
+ * 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.
+ */
+
+#include "config.h"
+#include "DFGLongLivedState.h"
+
+#if ENABLE(DFG_JIT)
+
+#include "JSCInlines.h"
+
+namespace JSC { namespace DFG {
+
+LongLivedState::LongLivedState()
+{
+}
+
+LongLivedState::~LongLivedState()
+{
+}
+
+void LongLivedState::shrinkToFit()
+{
+ m_allocator.reset();
+}
+
+} } // namespace JSC::DFG
+
+#endif // ENABLE(DFG_JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGLongLivedStateh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.h (0 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.h         (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGLongLivedState.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+/*
+ * Copyright (C) 2013 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. ``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
+ * 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 DFGLongLivedState_h
+#define DFGLongLivedState_h
+
+#if ENABLE(DFG_JIT)
+
+#include "DFGNodeAllocator.h"
+#include <wtf/FastMalloc.h>
+#include <wtf/Noncopyable.h>
+
+namespace JSC { namespace DFG {
+
+class LongLivedState {
+ WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(LongLivedState);
+public:
+ LongLivedState();
+ ~LongLivedState();
+
+ void shrinkToFit();
+
+ NodeAllocator m_allocator;
+};
+
+} } // namespace JSC::DFG
+
+#endif // ENABLE(DFG_JIT)
+
+#endif // DFGLongLivedState_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx">
</span><del>-#include "B3SparseCollection.h"
</del><span class="cx"> #include "BasicBlockLocation.h"
</span><span class="cx"> #include "CodeBlock.h"
</span><span class="cx"> #include "DFGAbstractValue.h"
</span><span class="lines">@@ -231,7 +230,6 @@
</span><span class="cx"> //
</span><span class="cx"> // Node represents a single operation in the data flow graph.
</span><span class="cx"> struct Node {
</span><del>- WTF_MAKE_FAST_ALLOCATED;
</del><span class="cx"> public:
</span><span class="cx"> enum VarArgTag { VarArg };
</span><span class="cx">
</span><span class="lines">@@ -2346,7 +2344,7 @@
</span><span class="cx"> AdjacencyList children;
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- friend class B3::SparseCollection<Node>;
</del><ins>+ friend class Graph;
</ins><span class="cx">
</span><span class="cx"> unsigned m_index { std::numeric_limits<unsigned>::max() };
</span><span class="cx"> unsigned m_op : 10; // real type is NodeType
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeAllocatorh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/dfg/DFGNodeAllocator.h (0 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNodeAllocator.h         (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGNodeAllocator.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+/*
+ * Copyright (C) 2013 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. ``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
+ * 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 DFGNodeAllocator_h
+#define DFGNodeAllocator_h
+
+#if ENABLE(DFG_JIT)
+
+#include "DFGAllocator.h"
+#include "DFGNode.h"
+
+namespace JSC { namespace DFG {
+
+typedef Allocator<Node> NodeAllocator;
+
+} } // namespace JSC::DFG
+
+inline void* operator new (size_t size, JSC::DFG::NodeAllocator& allocator)
+{
+ ASSERT_UNUSED(size, size == sizeof(JSC::DFG::Node));
+ return allocator.allocate();
+}
+
+#endif // ENABLE(DFG_JIT)
+
+#endif // DFGNodeAllocator_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPlancpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -170,7 +170,7 @@
</span><span class="cx"> || (Options::reportFTLCompileTimes() && isFTL(mode));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Plan::compileInThread(ThreadData* threadData)
</del><ins>+void Plan::compileInThread(LongLivedState& longLivedState, ThreadData* threadData)
</ins><span class="cx"> {
</span><span class="cx"> this->threadData = threadData;
</span><span class="cx">
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx"> if (logCompilationChanges(mode))
</span><span class="cx"> dataLog("DFG(Plan) compiling ", *codeBlock, " with ", mode, ", number of instructions = ", codeBlock->instructionCount(), "\n");
</span><span class="cx">
</span><del>- CompilationPath path = compileInThreadImpl();
</del><ins>+ CompilationPath path = compileInThreadImpl(longLivedState);
</ins><span class="cx">
</span><span class="cx"> RELEASE_ASSERT(path == CancelPath || finalizer);
</span><span class="cx"> RELEASE_ASSERT((path == CancelPath) == (stage == Cancelled));
</span><span class="lines">@@ -236,7 +236,7 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Plan::CompilationPath Plan::compileInThreadImpl()
</del><ins>+Plan::CompilationPath Plan::compileInThreadImpl(LongLivedState& longLivedState)
</ins><span class="cx"> {
</span><span class="cx"> cleanMustHandleValuesIfNecessary();
</span><span class="cx">
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx"> dataLog("\n");
</span><span class="cx"> }
</span><span class="cx">
</span><del>- Graph dfg(*vm, *this);
</del><ins>+ Graph dfg(*vm, *this, longLivedState);
</ins><span class="cx">
</span><span class="cx"> if (!parse(dfg)) {
</span><span class="cx"> finalizer = std::make_unique<FailedFinalizer>(*this);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPlanh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPlan.h (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPlan.h        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGPlan.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx">
</span><span class="cx"> namespace DFG {
</span><span class="cx">
</span><ins>+class LongLivedState;
</ins><span class="cx"> class ThreadData;
</span><span class="cx">
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx"> const Operands<JSValue>& mustHandleValues);
</span><span class="cx"> ~Plan();
</span><span class="cx">
</span><del>- void compileInThread(ThreadData*);
</del><ins>+ void compileInThread(LongLivedState&, ThreadData*);
</ins><span class="cx">
</span><span class="cx"> CompilationResult finalizeWithoutNotifyingCallback();
</span><span class="cx"> void finalizeAndNotifyCallback();
</span><span class="lines">@@ -120,7 +121,7 @@
</span><span class="cx"> bool reportCompileTimes() const;
</span><span class="cx">
</span><span class="cx"> enum CompilationPath { FailPath, DFGPath, FTLPath, CancelPath };
</span><del>- CompilationPath compileInThreadImpl();
</del><ins>+ CompilationPath compileInThreadImpl(LongLivedState&);
</ins><span class="cx">
</span><span class="cx"> bool isStillValid();
</span><span class="cx"> void reallyAdd(CommonData*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGWorklistcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -29,8 +29,9 @@
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx">
</span><span class="cx"> #include "CodeBlock.h"
</span><ins>+#include "DFGLongLivedState.h"
+#include "DFGSafepoint.h"
</ins><span class="cx"> #include "DeferGC.h"
</span><del>-#include "DFGSafepoint.h"
</del><span class="cx"> #include "JSCInlines.h"
</span><span class="cx"> #include <mutex>
</span><span class="cx">
</span><span class="lines">@@ -361,6 +362,8 @@
</span><span class="cx"> if (Options::verboseCompilationQueue())
</span><span class="cx"> dataLog(*this, ": Thread started\n");
</span><span class="cx">
</span><ins>+ LongLivedState longLivedState;
+
</ins><span class="cx"> for (;;) {
</span><span class="cx"> RefPtr<Plan> plan;
</span><span class="cx"> {
</span><span class="lines">@@ -396,7 +399,7 @@
</span><span class="cx"> dataLog(*this, ": Compiling ", plan->key(), " asynchronously\n");
</span><span class="cx">
</span><span class="cx"> RELEASE_ASSERT(!plan->vm->heap.isCollecting());
</span><del>- plan->compileInThread(data);
</del><ins>+ plan->compileInThread(longLivedState, data);
</ins><span class="cx"> RELEASE_ASSERT(plan->stage == Plan::Cancelled || !plan->vm->heap.isCollecting());
</span><span class="cx">
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include "CommonIdentifiers.h"
</span><span class="cx"> #include "CommonSlowPaths.h"
</span><span class="cx"> #include "CustomGetterSetter.h"
</span><ins>+#include "DFGLongLivedState.h"
</ins><span class="cx"> #include "DFGWorklist.h"
</span><span class="cx"> #include "Disassembler.h"
</span><span class="cx"> #include "ErrorInstance.h"
</span><span class="lines">@@ -290,6 +291,11 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> callFrameForCatch = nullptr;
</span><ins>+
+#if ENABLE(DFG_JIT)
+ if (canUseJIT())
+ dfgState = std::make_unique<DFG::LongLivedState>();
+#endif
</ins><span class="cx">
</span><span class="cx"> // Initialize this last, as a free way of asserting that VM initialization itself
</span><span class="cx"> // won't use this.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (204392 => 204393)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2016-08-12 00:08:50 UTC (rev 204392)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2016-08-12 00:22:20 UTC (rev 204393)
</span><span class="lines">@@ -120,6 +120,11 @@
</span><span class="cx"> class Watchpoint;
</span><span class="cx"> class WatchpointSet;
</span><span class="cx">
</span><ins>+#if ENABLE(DFG_JIT)
+namespace DFG {
+class LongLivedState;
+}
+#endif // ENABLE(DFG_JIT)
</ins><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx"> namespace FTL {
</span><span class="cx"> class Thunks;
</span><span class="lines">@@ -267,6 +272,10 @@
</span><span class="cx"> // destructed after all the objects that reference it.
</span><span class="cx"> Heap heap;
</span><span class="cx">
</span><ins>+#if ENABLE(DFG_JIT)
+ std::unique_ptr<DFG::LongLivedState> dfgState;
+#endif // ENABLE(DFG_JIT)
+
</ins><span class="cx"> VMType vmType;
</span><span class="cx"> ClientData* clientData;
</span><span class="cx"> VMEntryFrame* topVMEntryFrame;
</span></span></pre>
</div>
</div>
</body>
</html>