<!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>[183124] 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/183124">183124</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2015-04-22 13:05:06 -0700 (Wed, 22 Apr 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Give the heap object iterators the ability to return early.
https://bugs.webkit.org/show_bug.cgi?id=144011
Reviewed by Michael Saboff.
JSDollarVMPrototype::isValidCell() uses a heap object iterator to validate
candidate cell pointers, and, when in use, is called a lot more often than
the normal way those iterators are used. As a result, I see my instrumented
VM killed with a SIGXCPU (CPU time limit exceeded). This patch gives the
callback functor the ability to tell the iterators to return early when the
functor no longer needs to continue iterating. With this, my instrumented
VM is useful again for debugging.
Since heap iteration is not something that we do in a typical fast path,
I don't expect this to have any noticeable impact on performance.
I also renamed ObjectAddressCheckFunctor to CellAddressCheckFunctor since
it checks JSCell addresses, not just JSObjects.
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* debugger/Debugger.cpp:
* heap/GCLogging.cpp:
(JSC::LoggingFunctor::operator()):
* heap/Heap.cpp:
(JSC::Zombify::visit):
(JSC::Zombify::operator()):
* heap/HeapStatistics.cpp:
(JSC::StorageStatistics::visit):
(JSC::StorageStatistics::operator()):
* heap/HeapVerifier.cpp:
(JSC::GatherLiveObjFunctor::visit):
(JSC::GatherLiveObjFunctor::operator()):
* heap/MarkedBlock.cpp:
(JSC::SetNewlyAllocatedFunctor::operator()):
* heap/MarkedBlock.h:
(JSC::MarkedBlock::forEachCell):
(JSC::MarkedBlock::forEachLiveCell):
(JSC::MarkedBlock::forEachDeadCell):
* heap/MarkedSpace.h:
(JSC::MarkedSpace::forEachLiveCell):
(JSC::MarkedSpace::forEachDeadCell):
* inspector/agents/InspectorRuntimeAgent.cpp:
(Inspector::TypeRecompiler::visit):
(Inspector::TypeRecompiler::operator()):
* runtime/IterationStatus.h: Added.
* runtime/JSGlobalObject.cpp:
* runtime/VM.cpp:
(JSC::StackPreservingRecompiler::visit):
(JSC::StackPreservingRecompiler::operator()):
* tools/JSDollarVMPrototype.cpp:
(JSC::CellAddressCheckFunctor::CellAddressCheckFunctor):
(JSC::CellAddressCheckFunctor::operator()):
(JSC::JSDollarVMPrototype::isValidCell):
(JSC::ObjectAddressCheckFunctor::ObjectAddressCheckFunctor): Deleted.
(JSC::ObjectAddressCheckFunctor::operator()): Deleted.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggercpp">trunk/Source/JavaScriptCore/debugger/Debugger.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapGCLoggingcpp">trunk/Source/JavaScriptCore/heap/GCLogging.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapStatisticscpp">trunk/Source/JavaScriptCore/heap/HeapStatistics.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapVerifiercpp">trunk/Source/JavaScriptCore/heap/HeapVerifier.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedBlockcpp">trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedBlockh">trunk/Source/JavaScriptCore/heap/MarkedBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpaceh">trunk/Source/JavaScriptCore/heap/MarkedSpace.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorRuntimeAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMcpp">trunk/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoretoolsJSDollarVMPrototypecpp">trunk/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreruntimeIterationStatush">trunk/Source/JavaScriptCore/runtime/IterationStatus.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -1,3 +1,63 @@
</span><ins>+2015-04-22 Mark Lam <mark.lam@apple.com>
+
+ Give the heap object iterators the ability to return early.
+ https://bugs.webkit.org/show_bug.cgi?id=144011
+
+ Reviewed by Michael Saboff.
+
+ JSDollarVMPrototype::isValidCell() uses a heap object iterator to validate
+ candidate cell pointers, and, when in use, is called a lot more often than
+ the normal way those iterators are used. As a result, I see my instrumented
+ VM killed with a SIGXCPU (CPU time limit exceeded). This patch gives the
+ callback functor the ability to tell the iterators to return early when the
+ functor no longer needs to continue iterating. With this, my instrumented
+ VM is useful again for debugging.
+
+ Since heap iteration is not something that we do in a typical fast path,
+ I don't expect this to have any noticeable impact on performance.
+
+ I also renamed ObjectAddressCheckFunctor to CellAddressCheckFunctor since
+ it checks JSCell addresses, not just JSObjects.
+
+ * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+ * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * debugger/Debugger.cpp:
+ * heap/GCLogging.cpp:
+ (JSC::LoggingFunctor::operator()):
+ * heap/Heap.cpp:
+ (JSC::Zombify::visit):
+ (JSC::Zombify::operator()):
+ * heap/HeapStatistics.cpp:
+ (JSC::StorageStatistics::visit):
+ (JSC::StorageStatistics::operator()):
+ * heap/HeapVerifier.cpp:
+ (JSC::GatherLiveObjFunctor::visit):
+ (JSC::GatherLiveObjFunctor::operator()):
+ * heap/MarkedBlock.cpp:
+ (JSC::SetNewlyAllocatedFunctor::operator()):
+ * heap/MarkedBlock.h:
+ (JSC::MarkedBlock::forEachCell):
+ (JSC::MarkedBlock::forEachLiveCell):
+ (JSC::MarkedBlock::forEachDeadCell):
+ * heap/MarkedSpace.h:
+ (JSC::MarkedSpace::forEachLiveCell):
+ (JSC::MarkedSpace::forEachDeadCell):
+ * inspector/agents/InspectorRuntimeAgent.cpp:
+ (Inspector::TypeRecompiler::visit):
+ (Inspector::TypeRecompiler::operator()):
+ * runtime/IterationStatus.h: Added.
+ * runtime/JSGlobalObject.cpp:
+ * runtime/VM.cpp:
+ (JSC::StackPreservingRecompiler::visit):
+ (JSC::StackPreservingRecompiler::operator()):
+ * tools/JSDollarVMPrototype.cpp:
+ (JSC::CellAddressCheckFunctor::CellAddressCheckFunctor):
+ (JSC::CellAddressCheckFunctor::operator()):
+ (JSC::JSDollarVMPrototype::isValidCell):
+ (JSC::ObjectAddressCheckFunctor::ObjectAddressCheckFunctor): Deleted.
+ (JSC::ObjectAddressCheckFunctor::operator()): Deleted.
+
</ins><span class="cx"> 2015-04-22 Yusuke Suzuki <utatane.tea@gmail.com>
</span><span class="cx">
</span><span class="cx"> [[Set]] should be properly executed in JS builtins
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -1525,6 +1525,7 @@
</span><span class="cx"> <ClInclude Include="..\runtime\IntendedStructureChain.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\InternalFunction.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\Intrinsic.h" />
</span><ins>+ <ClInclude Include="..\runtime\IterationStatus.h" />
</ins><span class="cx"> <ClInclude Include="..\runtime\IteratorOperations.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSAPIValueWrapper.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSLexicalEnvironment.h" />
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -2678,6 +2678,9 @@
</span><span class="cx"> <ClInclude Include="..\runtime\Intrinsic.h">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><ins>+ <ClInclude Include="..\runtime\IterationStatus.h">
+ <Filter>runtime</Filter>
+ </ClInclude>
</ins><span class="cx"> <ClInclude Include="..\runtime\IteratorOperations.h">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -1654,12 +1654,13 @@
</span><span class="cx">                 FE0D4A091ABA2437002F54BF /* GlobalContextWithFinalizerTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE0D4A071ABA2437002F54BF /* GlobalContextWithFinalizerTest.cpp */; };
</span><span class="cx">                 FE20CE9D15F04A9500DF3430 /* LLIntCLoop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE20CE9B15F04A9500DF3430 /* LLIntCLoop.cpp */; };
</span><span class="cx">                 FE20CE9E15F04A9500DF3430 /* LLIntCLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = FE20CE9C15F04A9500DF3430 /* LLIntCLoop.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                FE4BFF2B1AD476E700088F87 /* FunctionOverrides.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE4BFF291AD476E700088F87 /* FunctionOverrides.cpp */; };
-                FE4BFF2C1AD476E700088F87 /* FunctionOverrides.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4BFF2A1AD476E700088F87 /* FunctionOverrides.h */; };
</del><span class="cx">                 FE384EE51ADDB7AD0055DE2C /* JSDollarVM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE384EE11ADDB7AD0055DE2C /* JSDollarVM.cpp */; };
</span><span class="cx">                 FE384EE61ADDB7AD0055DE2C /* JSDollarVM.h in Headers */ = {isa = PBXBuildFile; fileRef = FE384EE21ADDB7AD0055DE2C /* JSDollarVM.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 FE384EE71ADDB7AD0055DE2C /* JSDollarVMPrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE384EE31ADDB7AD0055DE2C /* JSDollarVMPrototype.cpp */; };
</span><span class="cx">                 FE384EE81ADDB7AD0055DE2C /* JSDollarVMPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = FE384EE41ADDB7AD0055DE2C /* JSDollarVMPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                FE4BFF2B1AD476E700088F87 /* FunctionOverrides.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE4BFF291AD476E700088F87 /* FunctionOverrides.cpp */; };
+                FE4BFF2C1AD476E700088F87 /* FunctionOverrides.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4BFF2A1AD476E700088F87 /* FunctionOverrides.h */; };
+                FE4D55B81AE716CA0052E459 /* IterationStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4D55B71AE716CA0052E459 /* IterationStatus.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 FE5932A7183C5A2600A1ECCC /* VMEntryScope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5932A5183C5A2600A1ECCC /* VMEntryScope.cpp */; };
</span><span class="cx">                 FE5932A8183C5A2600A1ECCC /* VMEntryScope.h in Headers */ = {isa = PBXBuildFile; fileRef = FE5932A6183C5A2600A1ECCC /* VMEntryScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 FE7BA60F1A1A7CEC00F1F7B4 /* HeapVerifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE7BA60D1A1A7CEC00F1F7B4 /* HeapVerifier.cpp */; };
</span><span class="lines">@@ -3446,12 +3447,13 @@
</span><span class="cx">                 FE0D4A081ABA2437002F54BF /* GlobalContextWithFinalizerTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GlobalContextWithFinalizerTest.h; path = API/tests/GlobalContextWithFinalizerTest.h; sourceTree = "<group>"; };
</span><span class="cx">                 FE20CE9B15F04A9500DF3430 /* LLIntCLoop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LLIntCLoop.cpp; path = llint/LLIntCLoop.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 FE20CE9C15F04A9500DF3430 /* LLIntCLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LLIntCLoop.h; path = llint/LLIntCLoop.h; sourceTree = "<group>"; };
</span><del>-                FE4BFF291AD476E700088F87 /* FunctionOverrides.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionOverrides.cpp; sourceTree = "<group>"; };
-                FE4BFF2A1AD476E700088F87 /* FunctionOverrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionOverrides.h; sourceTree = "<group>"; };
</del><span class="cx">                 FE384EE11ADDB7AD0055DE2C /* JSDollarVM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDollarVM.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 FE384EE21ADDB7AD0055DE2C /* JSDollarVM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDollarVM.h; sourceTree = "<group>"; };
</span><span class="cx">                 FE384EE31ADDB7AD0055DE2C /* JSDollarVMPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDollarVMPrototype.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 FE384EE41ADDB7AD0055DE2C /* JSDollarVMPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDollarVMPrototype.h; sourceTree = "<group>"; };
</span><ins>+                FE4BFF291AD476E700088F87 /* FunctionOverrides.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionOverrides.cpp; sourceTree = "<group>"; };
+                FE4BFF2A1AD476E700088F87 /* FunctionOverrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionOverrides.h; sourceTree = "<group>"; };
+                FE4D55B71AE716CA0052E459 /* IterationStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IterationStatus.h; sourceTree = "<group>"; };
</ins><span class="cx">                 FE5932A5183C5A2600A1ECCC /* VMEntryScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMEntryScope.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 FE5932A6183C5A2600A1ECCC /* VMEntryScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VMEntryScope.h; sourceTree = "<group>"; };
</span><span class="cx">                 FE7BA60D1A1A7CEC00F1F7B4 /* HeapVerifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HeapVerifier.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -4451,6 +4453,7 @@
</span><span class="cx">                                 86BF642A148DB2B5004DE36A /* Intrinsic.h */,
</span><span class="cx">                                 70113D491A8DB093003848C4 /* IteratorOperations.cpp */,
</span><span class="cx">                                 70113D4A1A8DB093003848C4 /* IteratorOperations.h */,
</span><ins>+                                FE4D55B71AE716CA0052E459 /* IterationStatus.h */,
</ins><span class="cx">                                 93ADFCE60CCBD7AC00D30B08 /* JSArray.cpp */,
</span><span class="cx">                                 938772E5038BFE19008635CE /* JSArray.h */,
</span><span class="cx">                                 0F2B66B417B6B5AB00A7AE3F /* JSArrayBuffer.cpp */,
</span><span class="lines">@@ -5588,6 +5591,7 @@
</span><span class="cx">                                 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */,
</span><span class="cx">                                 0FE050281AA9095600D33B33 /* ScopedArguments.h in Headers */,
</span><span class="cx">                                 52C0611F1AA51E1C00B4ADBA /* RuntimeType.h in Headers */,
</span><ins>+                                FE4D55B81AE716CA0052E459 /* IterationStatus.h in Headers */,
</ins><span class="cx">                                 C442CB251A6CDB8C005D3D7C /* JSInputs.json in Headers */,
</span><span class="cx">                                 52678F911A04177C006A306D /* ControlFlowProfiler.h in Headers */,
</span><span class="cx">                                 52678F8F1A031009006A306D /* BasicBlockLocation.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -44,12 +44,14 @@
</span><span class="cx"> public:
</span><span class="cx"> Recompiler(JSC::Debugger*);
</span><span class="cx"> ~Recompiler();
</span><del>- void operator()(JSCell*);
</del><ins>+ IterationStatus operator()(JSCell*);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> typedef HashSet<FunctionExecutable*> FunctionExecutableSet;
</span><span class="cx"> typedef HashMap<SourceProvider*, ExecState*> SourceProviderMap;
</span><span class="cx">
</span><ins>+ void visit(JSCell*);
+
</ins><span class="cx"> JSC::Debugger* m_debugger;
</span><span class="cx"> FunctionExecutableSet m_functionExecutables;
</span><span class="cx"> SourceProviderMap m_sourceProviders;
</span><span class="lines">@@ -69,7 +71,7 @@
</span><span class="cx"> m_debugger->sourceParsed(iter->value, iter->key, -1, String());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline void Recompiler::operator()(JSCell* cell)
</del><ins>+inline void Recompiler::visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->inherits(JSFunction::info()))
</span><span class="cx"> return;
</span><span class="lines">@@ -92,6 +94,12 @@
</span><span class="cx"> m_sourceProviders.add(executable->source().provider(), exec);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+inline IterationStatus Recompiler::operator()(JSCell* cell)
+{
+ visit(cell);
+ return IterationStatus::Continue;
+}
+
</ins><span class="cx"> } // namespace
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapGCLoggingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/GCLogging.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/GCLogging.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/GCLogging.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -63,10 +63,11 @@
</span><span class="cx"> reviveCells();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void operator()(JSCell* cell)
</del><ins>+ IterationStatus operator()(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> m_liveCells.append(cell);
</span><span class="cx"> MarkedBlock::blockFor(cell)->clearMarked(cell);
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void log()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -240,12 +240,17 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> struct MarkObject : public MarkedBlock::VoidFunctor {
</span><del>- void operator()(JSCell* cell)
</del><ins>+ inline void visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (cell->isZapped())
</span><span class="cx"> return;
</span><span class="cx"> Heap::heap(cell)->setMarked(cell);
</span><span class="cx"> }
</span><ins>+ IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> struct Count : public MarkedBlock::CountFunctor {
</span><span class="lines">@@ -253,13 +258,19 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> struct CountIfGlobalObject : MarkedBlock::CountFunctor {
</span><del>- void operator()(JSCell* cell) {
</del><ins>+ inline void visit(JSCell* cell)
+ {
</ins><span class="cx"> if (!cell->isObject())
</span><span class="cx"> return;
</span><span class="cx"> if (!asObject(cell)->isGlobalObject())
</span><span class="cx"> return;
</span><span class="cx"> count(1);
</span><span class="cx"> }
</span><ins>+ IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> class RecordType {
</span><span class="lines">@@ -267,7 +278,7 @@
</span><span class="cx"> typedef std::unique_ptr<TypeCountSet> ReturnType;
</span><span class="cx">
</span><span class="cx"> RecordType();
</span><del>- void operator()(JSCell*);
</del><ins>+ IterationStatus operator()(JSCell*);
</ins><span class="cx"> ReturnType returnValue();
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="lines">@@ -288,9 +299,10 @@
</span><span class="cx"> return info->className;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline void RecordType::operator()(JSCell* cell)
</del><ins>+inline IterationStatus RecordType::operator()(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> m_typeCountSet->add(typeName(cell));
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> inline std::unique_ptr<TypeCountSet> RecordType::returnValue()
</span><span class="lines">@@ -1422,7 +1434,7 @@
</span><span class="cx">
</span><span class="cx"> class Zombify : public MarkedBlock::VoidFunctor {
</span><span class="cx"> public:
</span><del>- void operator()(JSCell* cell)
</del><ins>+ inline void visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> void** current = reinterpret_cast<void**>(cell);
</span><span class="cx">
</span><span class="lines">@@ -1435,6 +1447,11 @@
</span><span class="cx"> for (; current < limit; current++)
</span><span class="cx"> *current = zombifiedBits;
</span><span class="cx"> }
</span><ins>+ IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> void Heap::zombifyDeadObjects()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapStatisticscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/HeapStatistics.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/HeapStatistics.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/HeapStatistics.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx"> public:
</span><span class="cx"> StorageStatistics();
</span><span class="cx">
</span><del>- void operator()(JSCell*);
</del><ins>+ IterationStatus operator()(JSCell*);
</ins><span class="cx">
</span><span class="cx"> size_t objectWithOutOfLineStorageCount();
</span><span class="cx"> size_t objectCount();
</span><span class="lines">@@ -176,6 +176,8 @@
</span><span class="cx"> size_t storageCapacity();
</span><span class="cx">
</span><span class="cx"> private:
</span><ins>+ void visit(JSCell*);
+
</ins><span class="cx"> size_t m_objectWithOutOfLineStorageCount;
</span><span class="cx"> size_t m_objectCount;
</span><span class="cx"> size_t m_storageSize;
</span><span class="lines">@@ -190,7 +192,7 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-inline void StorageStatistics::operator()(JSCell* cell)
</del><ins>+inline void StorageStatistics::visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->isObject())
</span><span class="cx"> return;
</span><span class="lines">@@ -209,6 +211,12 @@
</span><span class="cx"> m_storageCapacity += object->structure()->totalStorageCapacity() * sizeof(WriteBarrierBase<Unknown>);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+inline IterationStatus StorageStatistics::operator()(JSCell* cell)
+{
+ visit(cell);
+ return IterationStatus::Continue;
+}
+
</ins><span class="cx"> inline size_t StorageStatistics::objectWithOutOfLineStorageCount()
</span><span class="cx"> {
</span><span class="cx"> return m_objectWithOutOfLineStorageCount;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapVerifiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/HeapVerifier.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/HeapVerifier.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/HeapVerifier.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -122,7 +122,7 @@
</span><span class="cx"> ASSERT(!list.liveObjects.size());
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void operator()(JSCell* cell)
</del><ins>+ inline void visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->isObject())
</span><span class="cx"> return;
</span><span class="lines">@@ -130,6 +130,12 @@
</span><span class="cx"> m_list.liveObjects.append(data);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
+
</ins><span class="cx"> LiveObjectList& m_list;
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -157,10 +157,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void operator()(JSCell* cell)
</del><ins>+ IterationStatus operator()(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(MarkedBlock::blockFor(cell) == m_block);
</span><span class="cx"> m_block->setNewlyAllocated(cell);
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedBlock.h (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedBlock.h        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/MarkedBlock.h        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include "HeapBlock.h"
</span><span class="cx">
</span><span class="cx"> #include "HeapOperation.h"
</span><ins>+#include "IterationStatus.h"
</ins><span class="cx"> #include "WeakSet.h"
</span><span class="cx"> #include <wtf/Bitmap.h>
</span><span class="cx"> #include <wtf/DataLog.h>
</span><span class="lines">@@ -179,9 +180,9 @@
</span><span class="cx"> void didRetireBlock(const FreeList&);
</span><span class="cx"> void willRemoveBlock();
</span><span class="cx">
</span><del>- template <typename Functor> void forEachCell(Functor&);
- template <typename Functor> void forEachLiveCell(Functor&);
- template <typename Functor> void forEachDeadCell(Functor&);
</del><ins>+ template <typename Functor> IterationStatus forEachCell(Functor&);
+ template <typename Functor> IterationStatus forEachLiveCell(Functor&);
+ template <typename Functor> IterationStatus forEachDeadCell(Functor&);
</ins><span class="cx">
</span><span class="cx"> static ptrdiff_t offsetOfMarks() { return OBJECT_OFFSETOF(MarkedBlock, m_marks); }
</span><span class="cx">
</span><span class="lines">@@ -444,34 +445,40 @@
</span><span class="cx"> return isLive(static_cast<const JSCell*>(p));
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template <typename Functor> inline void MarkedBlock::forEachCell(Functor& functor)
</del><ins>+ template <typename Functor> inline IterationStatus MarkedBlock::forEachCell(Functor& functor)
</ins><span class="cx"> {
</span><span class="cx"> for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
</span><span class="cx"> JSCell* cell = reinterpret_cast_ptr<JSCell*>(&atoms()[i]);
</span><del>- functor(cell);
</del><ins>+ if (functor(cell) == IterationStatus::Done)
+ return IterationStatus::Done;
</ins><span class="cx"> }
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- template <typename Functor> inline void MarkedBlock::forEachLiveCell(Functor& functor)
</del><ins>+ template <typename Functor> inline IterationStatus MarkedBlock::forEachLiveCell(Functor& functor)
</ins><span class="cx"> {
</span><span class="cx"> for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
</span><span class="cx"> JSCell* cell = reinterpret_cast_ptr<JSCell*>(&atoms()[i]);
</span><span class="cx"> if (!isLive(cell))
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- functor(cell);
</del><ins>+ if (functor(cell) == IterationStatus::Done)
+ return IterationStatus::Done;
</ins><span class="cx"> }
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- template <typename Functor> inline void MarkedBlock::forEachDeadCell(Functor& functor)
</del><ins>+ template <typename Functor> inline IterationStatus MarkedBlock::forEachDeadCell(Functor& functor)
</ins><span class="cx"> {
</span><span class="cx"> for (size_t i = firstAtom(); i < m_endAtom; i += m_atomsPerCell) {
</span><span class="cx"> JSCell* cell = reinterpret_cast_ptr<JSCell*>(&atoms()[i]);
</span><span class="cx"> if (isLive(cell))
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- functor(cell);
</del><ins>+ if (functor(cell) == IterationStatus::Done)
+ return IterationStatus::Done;
</ins><span class="cx"> }
</span><ins>+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> inline bool MarkedBlock::needsSweeping()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.h (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -179,8 +179,10 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isIterating());
</span><span class="cx"> BlockIterator end = m_blocks.set().end();
</span><del>- for (BlockIterator it = m_blocks.set().begin(); it != end; ++it)
- (*it)->forEachLiveCell(functor);
</del><ins>+ for (BlockIterator it = m_blocks.set().begin(); it != end; ++it) {
+ if ((*it)->forEachLiveCell(functor) == IterationStatus::Done)
+ break;
+ }
</ins><span class="cx"> return functor.returnValue();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -194,8 +196,10 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isIterating());
</span><span class="cx"> BlockIterator end = m_blocks.set().end();
</span><del>- for (BlockIterator it = m_blocks.set().begin(); it != end; ++it)
- (*it)->forEachDeadCell(functor);
</del><ins>+ for (BlockIterator it = m_blocks.set().begin(); it != end; ++it) {
+ if ((*it)->forEachDeadCell(functor) == IterationStatus::Done)
+ break;
+ }
</ins><span class="cx"> return functor.returnValue();
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorRuntimeAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorRuntimeAgent.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -309,7 +309,7 @@
</span><span class="cx">
</span><span class="cx"> class TypeRecompiler : public MarkedBlock::VoidFunctor {
</span><span class="cx"> public:
</span><del>- inline void operator()(JSCell* cell)
</del><ins>+ inline void visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->inherits(FunctionExecutable::info()))
</span><span class="cx"> return;
</span><span class="lines">@@ -318,6 +318,11 @@
</span><span class="cx"> executable->clearCodeIfNotCompiling();
</span><span class="cx"> executable->clearUnlinkedCodeForRecompilationIfNotCompiling();
</span><span class="cx"> }
</span><ins>+ inline IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> static void recompileAllJSFunctionsForTypeProfiling(VM& vm, bool shouldEnableTypeProfiling)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeIterationStatush"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/IterationStatus.h (0 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/IterationStatus.h         (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/IterationStatus.h        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+/*
+ * Copyright (C) 2015 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 IterationStatus_h
+#define IterationStatus_h
+
+namespace JSC {
+
+enum class IterationStatus {
+ Continue,
+ Done
+};
+
+} // namespace JSC
+
+#endif // IterationStatus_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -539,9 +539,11 @@
</span><span class="cx"> class ObjectsWithBrokenIndexingFinder : public MarkedBlock::VoidFunctor {
</span><span class="cx"> public:
</span><span class="cx"> ObjectsWithBrokenIndexingFinder(MarkedArgumentBuffer&, JSGlobalObject*);
</span><del>- void operator()(JSCell*);
</del><ins>+ IterationStatus operator()(JSCell*);
</ins><span class="cx">
</span><span class="cx"> private:
</span><ins>+ void visit(JSCell*);
+
</ins><span class="cx"> MarkedArgumentBuffer& m_foundObjects;
</span><span class="cx"> JSGlobalObject* m_globalObject;
</span><span class="cx"> };
</span><span class="lines">@@ -562,7 +564,7 @@
</span><span class="cx"> return hasUndecided(type) || hasInt32(type) || hasDouble(type) || hasContiguous(type) || hasArrayStorage(type);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjectsWithBrokenIndexingFinder::operator()(JSCell* cell)
</del><ins>+inline void ObjectsWithBrokenIndexingFinder::visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->isObject())
</span><span class="cx"> return;
</span><span class="lines">@@ -594,6 +596,12 @@
</span><span class="cx"> m_foundObjects.append(object);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+IterationStatus ObjectsWithBrokenIndexingFinder::operator()(JSCell* cell)
+{
+ visit(cell);
+ return IterationStatus::Continue;
+}
+
</ins><span class="cx"> } // end private namespace for helpers for JSGlobalObject::haveABadTime()
</span><span class="cx">
</span><span class="cx"> void JSGlobalObject::haveABadTime(VM& vm)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -491,7 +491,7 @@
</span><span class="cx">
</span><span class="cx"> struct StackPreservingRecompiler : public MarkedBlock::VoidFunctor {
</span><span class="cx"> HashSet<FunctionExecutable*> currentlyExecutingFunctions;
</span><del>- void operator()(JSCell* cell)
</del><ins>+ inline void visit(JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx"> if (!cell->inherits(FunctionExecutable::info()))
</span><span class="cx"> return;
</span><span class="lines">@@ -500,6 +500,11 @@
</span><span class="cx"> return;
</span><span class="cx"> executable->clearCodeIfNotCompiling();
</span><span class="cx"> }
</span><ins>+ IterationStatus operator()(JSCell* cell)
+ {
+ visit(cell);
+ return IterationStatus::Continue;
+ }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> void VM::releaseExecutableMemory()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretoolsJSDollarVMPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp (183123 => 183124)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp        2015-04-22 19:33:52 UTC (rev 183123)
+++ trunk/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp        2015-04-22 20:05:06 UTC (rev 183124)
</span><span class="lines">@@ -152,16 +152,19 @@
</span><span class="cx"> return heap->storageSpace().contains(candidate);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-struct ObjectAddressCheckFunctor : MarkedBlock::CountFunctor {
- ObjectAddressCheckFunctor(JSCell* candidate)
</del><ins>+struct CellAddressCheckFunctor : MarkedBlock::CountFunctor {
+ CellAddressCheckFunctor(JSCell* candidate)
</ins><span class="cx"> : candidate(candidate)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void operator()(JSCell* cell)
</del><ins>+ IterationStatus operator()(JSCell* cell)
</ins><span class="cx"> {
</span><del>- if (cell == candidate)
</del><ins>+ if (cell == candidate) {
</ins><span class="cx"> found = true;
</span><ins>+ return IterationStatus::Done;
+ }
+ return IterationStatus::Continue;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> JSCell* candidate;
</span><span class="lines">@@ -171,7 +174,7 @@
</span><span class="cx"> bool JSDollarVMPrototype::isValidCell(Heap* heap, JSCell* candidate)
</span><span class="cx"> {
</span><span class="cx"> HeapIterationScope iterationScope(*heap);
</span><del>- ObjectAddressCheckFunctor functor(candidate);
</del><ins>+ CellAddressCheckFunctor functor(candidate);
</ins><span class="cx"> heap->objectSpace().forEachLiveCell(iterationScope, functor);
</span><span class="cx"> return functor.found;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>