<!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>[166837] trunk/Source</title>
</head>
<body>

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

<h3>Log Message</h3>
<pre>Enhanced GC logging
https://bugs.webkit.org/show_bug.cgi?id=131246

Reviewed by Geoff Garen.

Source/JavaScriptCore: 

Getting data on the state of the JSC Heap at runtime is currently in a sad state. 
The OBJECT_MARK_LOGGING macro enables some basic GC logging, but it requires a full 
recompile to turn it on. It would be nice if we could runtime enable our GC logging 
infrastructure while incurring minimal cost when it is disabled. 

It would also be nice to get a complete view of the Heap. Currently OBJECT_MARK_LOGGING 
provides us with the discovered roots along with parent-child relationships as objects 
are scanned. However, once an object is scanned it will never be declared as the child 
of another object during that collection. This gives us a tree-like view of the 
Heap (i.e. each scanned node only reports having a single parent), where the actual 
Heap can be an arbitrary graph.

This patch replaces OBJECT_MARK_LOGGING and gives us these nice to haves. First it enhances 
our logGC() runtime Option by changing it to be a tri-state value of None, Basic, or Verbose 
logging levels. None means no logging is done, Basic is what logGC() = true would have done 
prior to this patch, and Verbose logs all object relationships.

JSCell has new dump/dumpToStream methods, the latter of which is &quot;virtual&quot; to allow 
subclasses to override the default string representation that will be dumped. These 
methods allow JSCells to be dumped using the standard dataLog() calls similar to much of
the logging infrastructure in our compilers.

This patch also adds a GCLogging class that handles dumping the relationships between objects.
It does this by using the pre-existing visitChildren virtual methods to obtain the immediate
children of each live cell at the end of garbage collection.

This change meets our goal of being neutral on the benchmarks we track.

* JavaScriptCore.xcodeproj/project.pbxproj:
* heap/GCLogging.cpp: Added.
(JSC::GCLogging::levelAsString):
(JSC::LoggingFunctor::LoggingFunctor):
(JSC::LoggingFunctor::operator()):
(JSC::LoggingFunctor::log):
(JSC::LoggingFunctor::reviveCells):
(JSC::LoggingFunctor::returnValue):
(JSC::GCLogging::dumpObjectGraph):
* heap/GCLogging.h: Added.
* heap/GCSegmentedArray.h:
(JSC::GCSegmentedArray::begin):
(JSC::GCSegmentedArray::end):
* heap/Heap.cpp:
(JSC::Heap::markRoots):
(JSC::Heap::visitSmallStrings):
(JSC::Heap::visitConservativeRoots):
(JSC::Heap::visitCompilerWorklists):
(JSC::Heap::visitProtectedObjects):
(JSC::Heap::visitTempSortVectors):
(JSC::Heap::visitArgumentBuffers):
(JSC::Heap::visitException):
(JSC::Heap::visitStrongHandles):
(JSC::Heap::visitHandleStack):
(JSC::Heap::traceCodeBlocksAndJITStubRoutines):
(JSC::Heap::visitWeakHandles):
(JSC::Heap::updateObjectCounts):
(JSC::Heap::collect):
(JSC::Heap::didFinishCollection):
* heap/Heap.h:
* heap/MarkStack.h:
* heap/SlotVisitor.cpp:
(JSC::SlotVisitor::dump):
* heap/SlotVisitor.h:
(JSC::SlotVisitor::markStack):
* heap/SlotVisitorInlines.h:
(JSC::SlotVisitor::internalAppend):
* runtime/ClassInfo.h:
* runtime/JSCell.cpp:
(JSC::JSCell::dump):
(JSC::JSCell::dumpToStream):
(JSC::JSCell::className):
* runtime/JSCell.h:
* runtime/JSCellInlines.h:
(JSC::JSCell::visitChildren):
* runtime/JSString.cpp:
(JSC::JSString::dumpToStream):
(JSC::JSString::visitChildren):
* runtime/JSString.h:
(JSC::JSString::length):
(JSC::JSRopeString::RopeBuilder::length):
* runtime/Options.cpp:
(JSC::parse):
(JSC::Options::setOption):
(JSC::Options::dumpOption):
* runtime/Options.h:

Source/WTF: 

Remove OBJECT_MARK_LOGGING

* wtf/FeatureDefines.h:
* wtf/Platform.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="#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="#trunkSourceJavaScriptCoreheapGCSegmentedArrayh">trunk/Source/JavaScriptCore/heap/GCSegmentedArray.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeaph">trunk/Source/JavaScriptCore/heap/Heap.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkStackh">trunk/Source/JavaScriptCore/heap/MarkStack.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorcpp">trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorh">trunk/Source/JavaScriptCore/heap/SlotVisitor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorInlinesh">trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeClassInfoh">trunk/Source/JavaScriptCore/runtime/ClassInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellcpp">trunk/Source/JavaScriptCore/runtime/JSCell.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellh">trunk/Source/JavaScriptCore/runtime/JSCell.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellInlinesh">trunk/Source/JavaScriptCore/runtime/JSCellInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSStringcpp">trunk/Source/JavaScriptCore/runtime/JSString.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSStringh">trunk/Source/JavaScriptCore/runtime/JSString.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionscpp">trunk/Source/JavaScriptCore/runtime/Options.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionsh">trunk/Source/JavaScriptCore/runtime/Options.h</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfFeatureDefinesh">trunk/Source/WTF/wtf/FeatureDefines.h</a></li>
<li><a href="#trunkSourceWTFwtfPlatformh">trunk/Source/WTF/wtf/Platform.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 (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -219,6 +219,7 @@
</span><span class="cx">     heap/EdenGCActivityCallback.cpp
</span><span class="cx">     heap/FullGCActivityCallback.cpp
</span><span class="cx">     heap/GCActivityCallback.cpp
</span><ins>+    heap/GCLogging.cpp
</ins><span class="cx">     heap/GCThread.cpp
</span><span class="cx">     heap/GCThreadSharedData.cpp
</span><span class="cx">     heap/HandleSet.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -1,3 +1,95 @@
</span><ins>+2014-04-04  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        Enhanced GC logging
+        https://bugs.webkit.org/show_bug.cgi?id=131246
+
+        Reviewed by Geoff Garen.
+
+        Getting data on the state of the JSC Heap at runtime is currently in a sad state. 
+        The OBJECT_MARK_LOGGING macro enables some basic GC logging, but it requires a full 
+        recompile to turn it on. It would be nice if we could runtime enable our GC logging 
+        infrastructure while incurring minimal cost when it is disabled. 
+
+        It would also be nice to get a complete view of the Heap. Currently OBJECT_MARK_LOGGING 
+        provides us with the discovered roots along with parent-child relationships as objects 
+        are scanned. However, once an object is scanned it will never be declared as the child 
+        of another object during that collection. This gives us a tree-like view of the 
+        Heap (i.e. each scanned node only reports having a single parent), where the actual 
+        Heap can be an arbitrary graph.
+
+        This patch replaces OBJECT_MARK_LOGGING and gives us these nice to haves. First it enhances 
+        our logGC() runtime Option by changing it to be a tri-state value of None, Basic, or Verbose 
+        logging levels. None means no logging is done, Basic is what logGC() = true would have done 
+        prior to this patch, and Verbose logs all object relationships.
+
+        JSCell has new dump/dumpToStream methods, the latter of which is &quot;virtual&quot; to allow 
+        subclasses to override the default string representation that will be dumped. These 
+        methods allow JSCells to be dumped using the standard dataLog() calls similar to much of
+        the logging infrastructure in our compilers.
+
+        This patch also adds a GCLogging class that handles dumping the relationships between objects.
+        It does this by using the pre-existing visitChildren virtual methods to obtain the immediate
+        children of each live cell at the end of garbage collection.
+
+        This change meets our goal of being neutral on the benchmarks we track.
+
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * heap/GCLogging.cpp: Added.
+        (JSC::GCLogging::levelAsString):
+        (JSC::LoggingFunctor::LoggingFunctor):
+        (JSC::LoggingFunctor::operator()):
+        (JSC::LoggingFunctor::log):
+        (JSC::LoggingFunctor::reviveCells):
+        (JSC::LoggingFunctor::returnValue):
+        (JSC::GCLogging::dumpObjectGraph):
+        * heap/GCLogging.h: Added.
+        * heap/GCSegmentedArray.h:
+        (JSC::GCSegmentedArray::begin):
+        (JSC::GCSegmentedArray::end):
+        * heap/Heap.cpp:
+        (JSC::Heap::markRoots):
+        (JSC::Heap::visitSmallStrings):
+        (JSC::Heap::visitConservativeRoots):
+        (JSC::Heap::visitCompilerWorklists):
+        (JSC::Heap::visitProtectedObjects):
+        (JSC::Heap::visitTempSortVectors):
+        (JSC::Heap::visitArgumentBuffers):
+        (JSC::Heap::visitException):
+        (JSC::Heap::visitStrongHandles):
+        (JSC::Heap::visitHandleStack):
+        (JSC::Heap::traceCodeBlocksAndJITStubRoutines):
+        (JSC::Heap::visitWeakHandles):
+        (JSC::Heap::updateObjectCounts):
+        (JSC::Heap::collect):
+        (JSC::Heap::didFinishCollection):
+        * heap/Heap.h:
+        * heap/MarkStack.h:
+        * heap/SlotVisitor.cpp:
+        (JSC::SlotVisitor::dump):
+        * heap/SlotVisitor.h:
+        (JSC::SlotVisitor::markStack):
+        * heap/SlotVisitorInlines.h:
+        (JSC::SlotVisitor::internalAppend):
+        * runtime/ClassInfo.h:
+        * runtime/JSCell.cpp:
+        (JSC::JSCell::dump):
+        (JSC::JSCell::dumpToStream):
+        (JSC::JSCell::className):
+        * runtime/JSCell.h:
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::visitChildren):
+        * runtime/JSString.cpp:
+        (JSC::JSString::dumpToStream):
+        (JSC::JSString::visitChildren):
+        * runtime/JSString.h:
+        (JSC::JSString::length):
+        (JSC::JSRopeString::RopeBuilder::length):
+        * runtime/Options.cpp:
+        (JSC::parse):
+        (JSC::Options::setOption):
+        (JSC::Options::dumpOption):
+        * runtime/Options.h:
+
</ins><span class="cx"> 2014-04-05  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove bogus ASSERT in -JSVirtualMachine scanObjectGraph
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -466,6 +466,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\EdenGCActivityCallback.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\FullGCActivityCallback.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\GCActivityCallback.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\heap\GCLogging.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\heap\GCThread.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\GCThreadSharedData.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\HandleSet.cpp&quot; /&gt;
</span><span class="lines">@@ -1050,6 +1051,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\EdenGCActivityCallback.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\FullGCActivityCallback.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCActivityCallback.h&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\heap\GCLogging.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCSegmentedArray.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCSegmentedArrayInlines.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCAssertions.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -237,6 +237,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\heap\GCActivityCallback.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\heap\GCLogging.cpp&quot;&gt;
+      &lt;Filter&gt;heap&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\heap\GCThread.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -1700,6 +1703,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCActivityCallback.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\heap\GCLogging.h&quot;&gt;
+      &lt;Filter&gt;heap&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\heap\GCSegmentedArray.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -795,6 +795,7 @@
</span><span class="cx">                 2A83638918D7D0FE0000EBCC /* FullGCActivityCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */; };
</span><span class="cx">                 2A83638A18D7D0FE0000EBCC /* FullGCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                2AABCDE718EF294200002096 /* GCLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AABCDE618EF294200002096 /* GCLogging.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 2AACE63C18CA5A0300ED0191 /* GCActivityCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AACE63A18CA5A0300ED0191 /* GCActivityCallback.cpp */; };
</span><span class="cx">                 2AACE63D18CA5A0300ED0191 /* GCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AACE63B18CA5A0300ED0191 /* GCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 2AAD964A18569417001F93BE /* RecursiveAllocationScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AAD964918569417001F93BE /* RecursiveAllocationScope.h */; };
</span><span class="lines">@@ -803,6 +804,7 @@
</span><span class="cx">                 2ACCF3DE185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCF3DC185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.cpp */; };
</span><span class="cx">                 2ACCF3DF185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ACCF3DD185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.h */; };
</span><span class="cx">                 2AD8932B17E3868F00668276 /* HeapIterationScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD8932917E3868F00668276 /* HeapIterationScope.h */; };
</span><ins>+                2ADFA26318EF3540004F9FCC /* GCLogging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ADFA26218EF3540004F9FCC /* GCLogging.cpp */; };
</ins><span class="cx">                 2AF7382C18BBBF92008A5A37 /* StructureIDTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AF7382A18BBBF92008A5A37 /* StructureIDTable.cpp */; };
</span><span class="cx">                 2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AF7382B18BBBF92008A5A37 /* StructureIDTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 371D842D17C98B6E00ECF994 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 371D842C17C98B6E00ECF994 /* libz.dylib */; };
</span><span class="lines">@@ -2288,6 +2290,7 @@
</span><span class="cx">                 2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FullGCActivityCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FullGCActivityCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureIDBlob.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                2AABCDE618EF294200002096 /* GCLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCLogging.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2AACE63A18CA5A0300ED0191 /* GCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCActivityCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2AACE63B18CA5A0300ED0191 /* GCActivityCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCActivityCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2AAD964918569417001F93BE /* RecursiveAllocationScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecursiveAllocationScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2296,6 +2299,7 @@
</span><span class="cx">                 2ACCF3DC185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStoreBarrierElisionPhase.cpp; path = dfg/DFGStoreBarrierElisionPhase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2ACCF3DD185FE26B0083E2AD /* DFGStoreBarrierElisionPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGStoreBarrierElisionPhase.h; path = dfg/DFGStoreBarrierElisionPhase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2AD8932917E3868F00668276 /* HeapIterationScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapIterationScope.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                2ADFA26218EF3540004F9FCC /* GCLogging.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCLogging.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2AF7382A18BBBF92008A5A37 /* StructureIDTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureIDTable.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2AF7382B18BBBF92008A5A37 /* StructureIDTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureIDTable.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 371D842C17C98B6E00ECF994 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = &quot;compiled.mach-o.dylib&quot;; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
</span><span class="lines">@@ -3632,6 +3636,8 @@
</span><span class="cx">                                 2A83638418D7D0EE0000EBCC /* EdenGCActivityCallback.h */,
</span><span class="cx">                                 2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */,
</span><span class="cx">                                 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */,
</span><ins>+                                2AABCDE618EF294200002096 /* GCLogging.h */,
+                                2ADFA26218EF3540004F9FCC /* GCLogging.cpp */,
</ins><span class="cx">                         );
</span><span class="cx">                         path = heap;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -4952,6 +4958,7 @@
</span><span class="cx">                                 A1A009C11831A26E00CF8711 /* ARM64Assembler.h in Headers */,
</span><span class="cx">                                 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */,
</span><span class="cx">                                 A584032018BFFBE1005A0811 /* InspectorAgent.h in Headers */,
</span><ins>+                                2AABCDE718EF294200002096 /* GCLogging.h in Headers */,
</ins><span class="cx">                                 C2DA778318E259990066FCB6 /* HeapInlines.h in Headers */,
</span><span class="cx">                                 2AACE63D18CA5A0300ED0191 /* GCActivityCallback.h in Headers */,
</span><span class="cx">                                 2A83638618D7D0EE0000EBCC /* EdenGCActivityCallback.h in Headers */,
</span><span class="lines">@@ -6678,6 +6685,7 @@
</span><span class="cx">                                 0FC3141518146D7000033232 /* RegisterSet.cpp in Sources */,
</span><span class="cx">                                 A57D23ED1891B5540031C7FA /* RegularExpression.cpp in Sources */,
</span><span class="cx">                                 A5BA15E9182340B300A82E69 /* RemoteInspector.mm in Sources */,
</span><ins>+                                2ADFA26318EF3540004F9FCC /* GCLogging.cpp in Sources */,
</ins><span class="cx">                                 A594558F18245EFD00CC3843 /* RemoteInspectorDebuggable.cpp in Sources */,
</span><span class="cx">                                 A5BA15EC182340B400A82E69 /* RemoteInspectorDebuggableConnection.mm in Sources */,
</span><span class="cx">                                 A5BA15EE182340B400A82E69 /* RemoteInspectorXPCConnection.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapGCSegmentedArrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/GCSegmentedArray.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/GCSegmentedArray.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/GCSegmentedArray.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx"> template &lt;typename T&gt;
</span><span class="cx"> class GCSegmentedArray {
</span><span class="cx">     friend class GCSegmentedArrayIterator&lt;T&gt;;
</span><ins>+    friend class GCSegmentedArrayIterator&lt;const T&gt;;
</ins><span class="cx"> public:
</span><span class="cx">     GCSegmentedArray(BlockAllocator&amp;);
</span><span class="cx">     ~GCSegmentedArray();
</span><span class="lines">@@ -81,8 +82,8 @@
</span><span class="cx">     void clear();
</span><span class="cx"> 
</span><span class="cx">     typedef GCSegmentedArrayIterator&lt;T&gt; iterator;
</span><del>-    iterator begin() { return GCSegmentedArrayIterator&lt;T&gt;(m_segments.head(), m_top); }
-    iterator end() { return GCSegmentedArrayIterator&lt;T&gt;(); }
</del><ins>+    iterator begin() const { return GCSegmentedArrayIterator&lt;T&gt;(m_segments.head(), m_top); }
+    iterator end() const { return GCSegmentedArrayIterator&lt;T&gt;(); }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     template &lt;size_t size&gt; struct CapacityFromSize {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -474,17 +474,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Heap::markRoots()
</del><ins>+void Heap::markRoots(double gcStartTime)
</ins><span class="cx"> {
</span><span class="cx">     SamplingRegion samplingRegion(&quot;Garbage Collection: Marking&quot;);
</span><span class="cx"> 
</span><span class="cx">     GCPHASE(MarkRoots);
</span><span class="cx">     ASSERT(isValidThreadState(m_vm));
</span><span class="cx"> 
</span><del>-#if ENABLE(OBJECT_MARK_LOGGING)
-    double gcStartTime = WTF::monotonicallyIncreasingTime();
-#endif
-
</del><span class="cx"> #if ENABLE(GGC)
</span><span class="cx">     Vector&lt;const JSCell*&gt; rememberedSet(m_slotVisitor.markStack().size());
</span><span class="cx">     m_slotVisitor.markStack().fillVector(rememberedSet);
</span><span class="lines">@@ -535,7 +531,7 @@
</span><span class="cx"> 
</span><span class="cx">     clearRememberedSet(rememberedSet);
</span><span class="cx">     m_sharedData.didFinishMarking();
</span><del>-    updateObjectCounts();
</del><ins>+    updateObjectCounts(gcStartTime);
</ins><span class="cx">     resetVisitors();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -599,13 +595,21 @@
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitSmallStrings);
</span><span class="cx">     m_vm-&gt;smallStrings.visitStrongReferences(m_slotVisitor);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Small strings:\n&quot;, m_slotVisitor);
+
+    m_slotVisitor.donateAndDrain();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitConservativeRoots(ConservativeRoots&amp; roots)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitConservativeRoots);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Conservative Roots&quot;);
</del><span class="cx">     m_slotVisitor.append(roots);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Conservative Roots:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -613,29 +617,34 @@
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx">     GCPHASE(VisitDFGWorklists);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;DFG Worklists&quot;);
</del><span class="cx">     for (unsigned i = DFG::numberOfWorklists(); i--;) {
</span><span class="cx">         if (DFG::Worklist* worklist = DFG::worklistForIndexOrNull(i))
</span><span class="cx">             worklist-&gt;visitChildren(m_slotVisitor, m_codeBlocks);
</span><span class="cx">     }
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;DFG Worklists:\n&quot;, m_slotVisitor);
+
+    m_slotVisitor.donateAndDrain();
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitProtectedObjects(HeapRootVisitor&amp; heapRootVisitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitProtectedObjects);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Protected Objects&quot;);
</del><span class="cx"> 
</span><span class="cx">     for (auto&amp; pair : m_protectedValues)
</span><span class="cx">         heapRootVisitor.visit(&amp;pair.key);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Protected Objects:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitTempSortVectors(HeapRootVisitor&amp; heapRootVisitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitTempSortVectors);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Temp Sort Vectors&quot;);
-
</del><span class="cx">     typedef Vector&lt;Vector&lt;ValueStringPair, 0, UnsafeVectorOverflow&gt;*&gt; VectorOfValueStringVectors;
</span><span class="cx"> 
</span><span class="cx">     for (auto* vector : m_tempSortingVectors) {
</span><span class="lines">@@ -644,53 +653,72 @@
</span><span class="cx">                 heapRootVisitor.visit(&amp;valueStringPair.first);
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Temp Sort Vectors:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitArgumentBuffers(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(MarkingArgumentBuffers);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Argument Buffers&quot;);
</del><span class="cx">     if (!m_markListSet || !m_markListSet-&gt;size())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     MarkedArgumentBuffer::markLists(visitor, *m_markListSet);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Argument Buffers:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitException(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(MarkingException);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Exceptions&quot;);
</del><span class="cx">     if (!m_vm-&gt;exception())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     visitor.visit(m_vm-&gt;addressOfException());
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Exceptions:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitStrongHandles(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitStrongHandles);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Strong Handles&quot;);
</del><span class="cx">     m_handleSet.visitStrongHandles(visitor);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Strong Handles:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitHandleStack(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitHandleStack);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Handle Stack&quot;);
</del><span class="cx">     m_handleStack.visit(visitor);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Handle Stack:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::traceCodeBlocksAndJITStubRoutines()
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(TraceCodeBlocksAndJITStubRoutines);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Trace Code Blocks and JIT Stub Routines&quot;);
</del><span class="cx">     m_codeBlocks.traceMarked(m_slotVisitor);
</span><span class="cx">     m_jitStubRoutines.traceMarkedStubRoutines(m_slotVisitor);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        dataLog(&quot;Code Blocks and JIT Stub Routines:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">     m_slotVisitor.donateAndDrain();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -705,12 +733,15 @@
</span><span class="cx"> void Heap::visitWeakHandles(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(VisitingLiveWeakHandles);
</span><del>-    MARK_LOG_ROOT(m_slotVisitor, &quot;Live Weak Handles&quot;);
</del><span class="cx">     while (true) {
</span><span class="cx">         m_objectSpace.visitWeakSets(visitor);
</span><span class="cx">         harvestWeakReferences();
</span><span class="cx">         if (m_slotVisitor.isEmpty())
</span><span class="cx">             break;
</span><ins>+
+        if (Options::logGC() == GCLogging::Verbose)
+            dataLog(&quot;Live Weak Handles:\n&quot;, m_slotVisitor);
+
</ins><span class="cx">         {
</span><span class="cx">             ParallelModeEnabler enabler(m_slotVisitor);
</span><span class="cx">             m_slotVisitor.donateAndDrain();
</span><span class="lines">@@ -734,17 +765,17 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Heap::updateObjectCounts()
</del><ins>+void Heap::updateObjectCounts(double gcStartTime)
</ins><span class="cx"> {
</span><span class="cx">     GCCOUNTER(VisitedValueCount, m_slotVisitor.visitCount());
</span><span class="cx"> 
</span><del>-#if ENABLE(OBJECT_MARK_LOGGING)
-    size_t visitCount = m_slotVisitor.visitCount();
</del><ins>+    if (Options::logGC() == GCLogging::Verbose) {
+        size_t visitCount = m_slotVisitor.visitCount();
</ins><span class="cx"> #if ENABLE(PARALLEL_GC)
</span><del>-    visitCount += m_sharedData.childVisitCount();
</del><ins>+        visitCount += m_sharedData.childVisitCount();
</ins><span class="cx"> #endif
</span><del>-    MARK_LOG_MESSAGE2(&quot;\nNumber of live Objects after full GC %lu, took %.6f secs\n&quot;, visitCount, WTF::monotonicallyIncreasingTime() - gcStartTime);
-#endif
</del><ins>+        dataLogF(&quot;\nNumber of live Objects after GC %lu, took %.6f secs\n&quot;, visitCount, WTF::monotonicallyIncreasingTime() - gcStartTime);
+    }
</ins><span class="cx"> 
</span><span class="cx">     if (m_operationInProgress == EdenCollection) {
</span><span class="cx">         m_totalBytesVisited += m_slotVisitor.bytesVisited();
</span><span class="lines">@@ -951,7 +982,7 @@
</span><span class="cx">     stopAllocation();
</span><span class="cx">     flushWriteBarrierBuffer();
</span><span class="cx"> 
</span><del>-    markRoots();
</del><ins>+    markRoots(gcStartTime);
</ins><span class="cx"> 
</span><span class="cx">     JAVASCRIPTCORE_GC_MARKED();
</span><span class="cx"> 
</span><span class="lines">@@ -1178,6 +1209,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (Options::showObjectStatistics())
</span><span class="cx">         HeapStatistics::showObjectStatistics(this);
</span><ins>+
+    if (Options::logGC() == GCLogging::Verbose)
+        GCLogging::dumpObjectGraph(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::resumeCompilerThreads()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/Heap.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -222,6 +222,7 @@
</span><span class="cx">     friend class DeferGCForAWhile;
</span><span class="cx">     friend class DelayedReleaseScope;
</span><span class="cx">     friend class GCAwareJITStubRoutine;
</span><ins>+    friend class GCLogging;
</ins><span class="cx">     friend class HandleSet;
</span><span class="cx">     friend class JITStubRoutine;
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="lines">@@ -261,7 +262,7 @@
</span><span class="cx">     void flushWriteBarrierBuffer();
</span><span class="cx">     void stopAllocation();
</span><span class="cx"> 
</span><del>-    void markRoots();
</del><ins>+    void markRoots(double gcStartTime);
</ins><span class="cx">     void gatherStackRoots(ConservativeRoots&amp;, void** dummy);
</span><span class="cx">     void gatherJSStackRoots(ConservativeRoots&amp;);
</span><span class="cx">     void gatherScratchBufferRoots(ConservativeRoots&amp;);
</span><span class="lines">@@ -279,7 +280,7 @@
</span><span class="cx">     void converge();
</span><span class="cx">     void visitWeakHandles(HeapRootVisitor&amp;);
</span><span class="cx">     void clearRememberedSet(Vector&lt;const JSCell*&gt;&amp;);
</span><del>-    void updateObjectCounts();
</del><ins>+    void updateObjectCounts(double gcStartTime);
</ins><span class="cx">     void resetVisitors();
</span><span class="cx"> 
</span><span class="cx">     void reapWeakHandles();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkStackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkStack.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkStack.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/MarkStack.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -26,30 +26,6 @@
</span><span class="cx"> #ifndef MarkStack_h
</span><span class="cx"> #define MarkStack_h
</span><span class="cx"> 
</span><del>-#if ENABLE(OBJECT_MARK_LOGGING)
-#define MARK_LOG_MESSAGE0(message) dataLogF(message)
-#define MARK_LOG_MESSAGE1(message, arg1) dataLogF(message, arg1)
-#define MARK_LOG_MESSAGE2(message, arg1, arg2) dataLogF(message, arg1, arg2)
-#define MARK_LOG_ROOT(visitor, rootName) \
-    dataLogF(&quot;\n%s: &quot;, rootName); \
-    (visitor).resetChildCount()
-#define MARK_LOG_PARENT(visitor, parent) \
-    dataLogF(&quot;\n%p (%s): &quot;, parent, parent-&gt;className() ? parent-&gt;className() : &quot;unknown&quot;); \
-    (visitor).resetChildCount()
-#define MARK_LOG_CHILD(visitor, child) \
-    if ((visitor).childCount()) \
-    dataLogFString(&quot;, &quot;); \
-    dataLogF(&quot;%p&quot;, child); \
-    (visitor).incrementChildCount()
-#else
-#define MARK_LOG_MESSAGE0(message) do { } while (false)
-#define MARK_LOG_MESSAGE1(message, arg1) do { } while (false)
-#define MARK_LOG_MESSAGE2(message, arg1, arg2) do { } while (false)
-#define MARK_LOG_ROOT(visitor, rootName) do { } while (false)
-#define MARK_LOG_PARENT(visitor, parent) do { } while (false)
-#define MARK_LOG_CHILD(visitor, child) do { } while (false)
-#endif
-
</del><span class="cx"> #include &quot;GCSegmentedArrayInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitor.cpp        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -373,4 +373,10 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void SlotVisitor::dump(PrintStream&amp;) const
+{
+    for (const JSCell* cell : markStack())
+        dataLog(*cell, &quot;\n&quot;);
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitor.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx">     ~SlotVisitor();
</span><span class="cx"> 
</span><span class="cx">     MarkStackArray&amp; markStack() { return m_stack; }
</span><ins>+    const MarkStackArray&amp; markStack() const { return m_stack; }
</ins><span class="cx"> 
</span><span class="cx">     VM&amp; vm();
</span><span class="cx">     const VM&amp; vm() const;
</span><span class="lines">@@ -109,12 +110,12 @@
</span><span class="cx">     void addWeakReferenceHarvester(WeakReferenceHarvester*);
</span><span class="cx">     void addUnconditionalFinalizer(UnconditionalFinalizer*);
</span><span class="cx"> 
</span><del>-#if ENABLE(OBJECT_MARK_LOGGING)
</del><span class="cx">     inline void resetChildCount() { m_logChildCount = 0; }
</span><span class="cx">     inline unsigned childCount() { return m_logChildCount; }
</span><span class="cx">     inline void incrementChildCount() { m_logChildCount++; }
</span><del>-#endif
</del><span class="cx"> 
</span><ins>+    void dump(PrintStream&amp;) const;
+
</ins><span class="cx"> private:
</span><span class="cx">     friend class ParallelModeEnabler;
</span><span class="cx">     
</span><span class="lines">@@ -148,9 +149,7 @@
</span><span class="cx">     typedef HashMap&lt;StringImpl*, JSValue&gt; UniqueStringMap;
</span><span class="cx">     UniqueStringMap m_uniqueStrings;
</span><span class="cx"> 
</span><del>-#if ENABLE(OBJECT_MARK_LOGGING)
</del><span class="cx">     unsigned m_logChildCount;
</span><del>-#endif
</del><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx"> #if !ASSERT_DISABLED
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -116,8 +116,6 @@
</span><span class="cx">     cell-&gt;setMarked();
</span><span class="cx">     m_bytesVisited += MarkedBlock::blockFor(cell)-&gt;cellSize();
</span><span class="cx">         
</span><del>-    MARK_LOG_CHILD(*this, cell);
-
</del><span class="cx">     unconditionallyAppend(cell);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeClassInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ClassInfo.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -96,6 +96,9 @@
</span><span class="cx">     
</span><span class="cx">     typedef PassRefPtr&lt;ArrayBufferView&gt; (*GetTypedArrayImpl)(JSArrayBufferView*);
</span><span class="cx">     GetTypedArrayImpl getTypedArrayImpl;
</span><ins>+
+    typedef void (*DumpToStreamFunctionPtr)(const JSCell*, PrintStream&amp;);
+    DumpToStreamFunctionPtr dumpToStream;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #define CREATE_MEMBER_CHECKER(member) \
</span><span class="lines">@@ -138,7 +141,8 @@
</span><span class="cx">         &amp;ClassName::customHasInstance, \
</span><span class="cx">         &amp;ClassName::defineOwnProperty, \
</span><span class="cx">         &amp;ClassName::slowDownAndWasteMemory, \
</span><del>-        &amp;ClassName::getTypedArrayImpl \
</del><ins>+        &amp;ClassName::getTypedArrayImpl, \
+        &amp;ClassName::dumpToStream \
</ins><span class="cx">     }, \
</span><span class="cx">     ClassName::TypedArrayStorageType
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.cpp (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.cpp        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.cpp        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -41,6 +41,16 @@
</span><span class="cx">     cell-&gt;JSCell::~JSCell();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void JSCell::dump(PrintStream&amp; out) const
+{
+    methodTable()-&gt;dumpToStream(this, out);
+}
+
+void JSCell::dumpToStream(const JSCell* cell, PrintStream&amp; out)
+{
+    out.printf(&quot;&lt;%p, %s&gt;&quot;, cell, cell-&gt;className());
+}
+
</ins><span class="cx"> void JSCell::copyBackingStore(JSCell*, CopyVisitor&amp;, CopyToken)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -192,7 +202,7 @@
</span><span class="cx">     return String();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const char* JSCell::className()
</del><ins>+const char* JSCell::className() const
</ins><span class="cx"> {
</span><span class="cx">     return classInfo()-&gt;className;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx"> 
</span><span class="cx">     TypeInfo::InlineTypeFlags inlineTypeFlags() const { return m_flags; }
</span><span class="cx"> 
</span><del>-    const char* className();
</del><ins>+    const char* className() const;
</ins><span class="cx"> 
</span><span class="cx">     // Extracting the value.
</span><span class="cx">     JS_EXPORT_PRIVATE bool getString(ExecState*, String&amp;) const;
</span><span class="lines">@@ -123,6 +123,8 @@
</span><span class="cx">     JS_EXPORT_PRIVATE double toNumber(ExecState*) const;
</span><span class="cx">     JS_EXPORT_PRIVATE JSObject* toObject(ExecState*, JSGlobalObject*) const;
</span><span class="cx"> 
</span><ins>+    void dump(PrintStream&amp;) const;
+    JS_EXPORT_PRIVATE static void dumpToStream(const JSCell*, PrintStream&amp;);
</ins><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx">     JS_EXPORT_PRIVATE static void copyBackingStore(JSCell*, CopyVisitor&amp;, CopyToken);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCellInlines.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -106,8 +106,6 @@
</span><span class="cx"> 
</span><span class="cx"> inline void JSCell::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    MARK_LOG_PARENT(visitor, cell);
-
</del><span class="cx">     Structure* structure = cell-&gt;structure(visitor.vm());
</span><span class="cx">     visitor.appendUnbarrieredPointer(&amp;structure);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSString.cpp (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSString.cpp        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/JSString.cpp        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -49,24 +49,27 @@
</span><span class="cx">     thisObject-&gt;JSString::~JSString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void JSString::dumpToStream(const JSCell* cell, PrintStream&amp; out)
+{
+    const JSString* thisObject = jsCast&lt;const JSString*&gt;(cell);
+    out.printf(&quot;&lt;%p, %s, [%u], &quot;, thisObject, thisObject-&gt;className(), thisObject-&gt;length()); 
+    if (thisObject-&gt;isRope())
+        out.printf(&quot;[rope]&quot;);
+    else {
+        WTF::StringImpl* ourImpl = thisObject-&gt;m_value.impl();
+        if (ourImpl-&gt;is8Bit())
+            out.printf(&quot;[8 %p]&quot;, ourImpl-&gt;characters8());
+        else
+            out.printf(&quot;[16 %p]&quot;, ourImpl-&gt;characters16());
+    }
+    out.printf(&quot;&gt;&quot;);
+}
+
</ins><span class="cx"> void JSString::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     JSString* thisObject = jsCast&lt;JSString*&gt;(cell);
</span><span class="cx">     Base::visitChildren(thisObject, visitor);
</span><span class="cx">     
</span><del>-    MARK_LOG_MESSAGE1(&quot;[%u]: &quot;, thisObject-&gt;length());
-
-#if ENABLE(OBJECT_MARK_LOGGING)
-    if (!thisObject-&gt;isRope()) {
-        WTF::StringImpl* ourImpl = thisObject-&gt;m_value.impl();
-        if (ourImpl-&gt;is8Bit())
-            MARK_LOG_MESSAGE1(&quot;[8 %p]&quot;, ourImpl-&gt;characters8());
-        else
-            MARK_LOG_MESSAGE1(&quot;[16 %p]&quot;, ourImpl-&gt;characters16());
-    } else
-        MARK_LOG_MESSAGE0(&quot;[rope]: &quot;);
-#endif
-
</del><span class="cx">     if (thisObject-&gt;isRope())
</span><span class="cx">         static_cast&lt;JSRopeString*&gt;(thisObject)-&gt;visitFibers(visitor);
</span><span class="cx">     else {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSStringh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSString.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSString.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/JSString.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx">         const String&amp; value(ExecState*) const;
</span><span class="cx">         const String&amp; tryGetValue() const;
</span><span class="cx">         const StringImpl* tryGetValueImpl() const;
</span><del>-        unsigned length() { return m_length; }
</del><ins>+        unsigned length() const { return m_length; }
</ins><span class="cx"> 
</span><span class="cx">         JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
</span><span class="cx">         JS_EXPORT_PRIVATE bool toBoolean() const;
</span><span class="lines">@@ -167,6 +167,7 @@
</span><span class="cx"> 
</span><span class="cx">         DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><ins>+        static void dumpToStream(const JSCell*, PrintStream&amp;);
</ins><span class="cx">         static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx">         enum {
</span><span class="lines">@@ -241,7 +242,7 @@
</span><span class="cx">                 return tmp;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            unsigned length() { return m_jsString-&gt;m_length; }
</del><ins>+            unsigned length() const { return m_jsString-&gt;m_length; }
</ins><span class="cx"> 
</span><span class="cx">         private:
</span><span class="cx">             void expand();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.cpp (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.cpp        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/Options.cpp        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -76,6 +76,26 @@
</span><span class="cx">     return value.init(string);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool parse(const char* string, GCLogging::Level&amp; value)
+{
+    if (!strcasecmp(string, &quot;none&quot;) || !strcasecmp(string, &quot;no&quot;) || !strcasecmp(string, &quot;false&quot;) || !strcmp(string, &quot;0&quot;)) {
+        value = GCLogging::None;
+        return true;
+    }
+
+    if (!strcasecmp(string, &quot;basic&quot;) || !strcasecmp(string, &quot;yes&quot;) || !strcasecmp(string, &quot;true&quot;) || !strcmp(string, &quot;1&quot;)) {
+        value = GCLogging::Basic;
+        return true;
+    }
+
+    if (!strcasecmp(string, &quot;verbose&quot;) || !strcmp(string, &quot;2&quot;)) {
+        value = GCLogging::Verbose;
+        return true;
+    }
+
+    return false;
+}
+
</ins><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> bool overrideOptionWithHeuristic(T&amp; variable, const char* name)
</span><span class="cx"> {
</span><span class="lines">@@ -284,7 +304,7 @@
</span><span class="cx"> #define FOR_EACH_OPTION(type_, name_, defaultValue_)    \
</span><span class="cx">     if (!strncmp(arg, #name_, equalStr - arg)) {        \
</span><span class="cx">         type_ value;                                    \
</span><del>-        value = 0;                                      \
</del><ins>+        value = (defaultValue_);                        \
</ins><span class="cx">         bool success = parse(valueStr, value);          \
</span><span class="cx">         if (success) {                                  \
</span><span class="cx">             name_() = value;                            \
</span><span class="lines">@@ -330,6 +350,9 @@
</span><span class="cx">     case optionRangeType:
</span><span class="cx">         fprintf(stream, &quot;%s&quot;, s_options[id].u.optionRangeVal.rangeString());
</span><span class="cx">         break;
</span><ins>+    case gcLogLevelType:
+        fprintf(stream, &quot;%s&quot;, GCLogging::levelAsString(s_options[id].u.gcLogLevelVal));
+        break;
</ins><span class="cx">     }
</span><span class="cx">     fprintf(stream, &quot;%s&quot;, footer);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/JavaScriptCore/runtime/Options.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef Options_h
</span><span class="cx"> #define Options_h
</span><span class="cx"> 
</span><ins>+#include &quot;GCLogging.h&quot;
</ins><span class="cx"> #include &quot;JSExportMacros.h&quot;
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> #include &lt;stdio.h&gt;
</span><span class="lines">@@ -258,7 +259,7 @@
</span><span class="cx">     v(bool, objectsAreImmortal, false) \
</span><span class="cx">     v(bool, showObjectStatistics, false) \
</span><span class="cx">     \
</span><del>-    v(bool, logGC, false) \
</del><ins>+    v(gcLogLevel, logGC, GCLogging::None) \
</ins><span class="cx">     v(bool, disableGC, false) \
</span><span class="cx">     v(unsigned, gcMaxHeapSize, 0) \
</span><span class="cx">     v(bool, recordGCPauseTimes, false) \
</span><span class="lines">@@ -303,6 +304,7 @@
</span><span class="cx">         doubleType,
</span><span class="cx">         int32Type,
</span><span class="cx">         optionRangeType,
</span><ins>+        gcLogLevelType,
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     // For storing for an option value:
</span><span class="lines">@@ -313,6 +315,7 @@
</span><span class="cx">             double doubleVal;
</span><span class="cx">             int32 int32Val;
</span><span class="cx">             OptionRange optionRangeVal;
</span><ins>+            GCLogging::Level gcLogLevelVal;
</ins><span class="cx">         } u;
</span><span class="cx">         bool didOverride;
</span><span class="cx">     };
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/WTF/ChangeLog        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-04-04  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        Enhanced GC logging
+        https://bugs.webkit.org/show_bug.cgi?id=131246
+
+        Reviewed by Geoff Garen.
+
+        Remove OBJECT_MARK_LOGGING
+
+        * wtf/FeatureDefines.h:
+        * wtf/Platform.h:
+
</ins><span class="cx"> 2014-04-03  Zsolt Borbely  &lt;zsborbely.u-szeged@partner.samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL] Enable CSS JIT again, it works fine after r166666.
</span></span></pre></div>
<a id="trunkSourceWTFwtfFeatureDefinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/FeatureDefines.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/FeatureDefines.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/WTF/wtf/FeatureDefines.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -622,10 +622,6 @@
</span><span class="cx"> #define ENABLE_NOTIFICATIONS 0
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if !defined(ENABLE_OBJECT_MARK_LOGGING)
-#define ENABLE_OBJECT_MARK_LOGGING 0
-#endif
-
</del><span class="cx"> #if !defined(ENABLE_OPENCL)
</span><span class="cx"> #define ENABLE_OPENCL 0
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWTFwtfPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Platform.h (166836 => 166837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Platform.h        2014-04-05 19:57:00 UTC (rev 166836)
+++ trunk/Source/WTF/wtf/Platform.h        2014-04-05 20:05:04 UTC (rev 166837)
</span><span class="lines">@@ -940,7 +940,7 @@
</span><span class="cx"> #define ENABLE_COMPARE_AND_SWAP 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if !defined(ENABLE_PARALLEL_GC) &amp;&amp; !ENABLE(OBJECT_MARK_LOGGING) &amp;&amp; (OS(DARWIN) || PLATFORM(EFL) || PLATFORM(GTK)) &amp;&amp; ENABLE(COMPARE_AND_SWAP)
</del><ins>+#if !defined(ENABLE_PARALLEL_GC) &amp;&amp; (OS(DARWIN) || PLATFORM(EFL) || PLATFORM(GTK)) &amp;&amp; ENABLE(COMPARE_AND_SWAP)
</ins><span class="cx"> #define ENABLE_PARALLEL_GC 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>