<!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>[211345] trunk</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/211345">211345</a></dd>
<dt>Author</dt> <dd>mattbaker@apple.com</dd>
<dt>Date</dt> <dd>2017-01-28 17:02:22 -0800 (Sat, 28 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
https://bugs.webkit.org/show_bug.cgi?id=165633
&lt;rdar://problem/29738502&gt;

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

This patch limits the memory used by the Inspector backend to store async
stack trace data.

Asynchronous stack traces are stored as a disjoint set of parent pointer
trees. Tree nodes represent asynchronous operations, and hold a copy of
the stack trace at the time the operation was scheduled. Each tree can
be regarded as a set of stack traces, stored as singly linked lists that
share part of their structure (specifically their tails). Traces belonging
to the same tree will at least share a common root. A stack trace begins
at a leaf node and follows the chain of parent pointers to the root of
of the tree. Leaf nodes always contain pending asynchronous calls.

When an asynchronous operation is scheduled with requestAnimationFrame,
setInterval, etc, a node is created containing the current call stack and
some bookkeeping data for the operation. An unique identifier comprised
of an operation type and callback identifier is mapped to the node. If
scheduling the callback was itself the result of an asynchronous call,
the node becomes a child of the node associated with that call, otherwise
it becomes the root of a new tree.

A node is either `pending`, `active`, `dispatched`, or `canceled`. Nodes
start out as pending. After a callback for a pending node is dispatched
the node is marked as such, unless it is a repeating callback such as
setInterval, in which case it remains pending. Once a node is no longer
pending it is removed, as long as it has no children. Since nodes are
reference counted, it is a property of the stack trace tree that nodes
that are no longer pending and have no children pointing to them will be
automatically pruned from the tree.

If an async operation is canceled (e.g. cancelTimeout), the associated
node is marked as such. If the callback is not being dispatched at the
time, and has no children, it is removed.

Because async operations can be chained indefinitely, stack traces are
limited to a maximum depth. The depth of a stack trace is equal to the
sum of the depths of its nodes, with a node's depth equal to the number
of frames in its associated call stack. For any stack trace,

    S = { sšŸ¶, sšŸ·, ā€¦, sš‘˜ }, with endpoints sšŸ¶, sš‘˜
    depth(S) = depth(sšŸ¶) + depth(sšŸ·) + ā€¦ + depth(sš‘˜)

A stack trace is truncated when it exceeds the maximum depth. Truncation
occurs on node boundaries, not call frames, consequently the maximum depth
is more of a target than a guarantee:

    d = maximum stack trace depth
    for all S, depth(S) ā‰¤ d + depth(sš‘˜)

Because nodes can belong to multiple stack traces, it may be necessary
to clone the tail of a stack trace being truncated to prevent other traces
from being effected.

* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* inspector/AsyncStackTrace.cpp: Added.
(Inspector::AsyncStackTrace::create):
(Inspector::AsyncStackTrace::AsyncStackTrace):
(Inspector::AsyncStackTrace::~AsyncStackTrace):
(Inspector::AsyncStackTrace::isPending):
(Inspector::AsyncStackTrace::isLocked):
(Inspector::AsyncStackTrace::willDispatchAsyncCall):
(Inspector::AsyncStackTrace::didDispatchAsyncCall):
(Inspector::AsyncStackTrace::didCancelAsyncCall):
(Inspector::AsyncStackTrace::buildInspectorObject):
(Inspector::AsyncStackTrace::truncate):
(Inspector::AsyncStackTrace::remove):
* inspector/AsyncStackTrace.h:
* inspector/agents/InspectorDebuggerAgent.cpp:
(Inspector::InspectorDebuggerAgent::didScheduleAsyncCall):
(Inspector::InspectorDebuggerAgent::didCancelAsyncCall):
(Inspector::InspectorDebuggerAgent::willDispatchAsyncCall):
(Inspector::InspectorDebuggerAgent::didDispatchAsyncCall):
(Inspector::InspectorDebuggerAgent::didPause):
(Inspector::InspectorDebuggerAgent::clearAsyncStackTraceData):
(Inspector::InspectorDebuggerAgent::buildAsyncStackTrace): Deleted.
(Inspector::InspectorDebuggerAgent::refAsyncCallData): Deleted.
(Inspector::InspectorDebuggerAgent::derefAsyncCallData): Deleted.
* inspector/agents/InspectorDebuggerAgent.h:
* inspector/protocol/Console.json:

Source/WebInspectorUI:

* Localizations/en.lproj/localizedStrings.js:
Text for &quot;Truncated&quot; marker tree element.

* UserInterface/Models/StackTrace.js:
(WebInspector.StackTrace):
(WebInspector.StackTrace.fromPayload):
(WebInspector.StackTrace.prototype.get truncated):
Plumbing for new Console.StackTrace property `truncated`.

* UserInterface/Views/ThreadTreeElement.css:
(.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames):
(.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames .icon):
Styles for &quot;Truncated&quot; marker tree element.

* UserInterface/Views/ThreadTreeElement.js:
(WebInspector.ThreadTreeElement.prototype.refresh):
Append &quot;Truncated&quot; marker tree element if necessary.

* Versions/Inspector-iOS-10.3.json:

LayoutTests:

Add truncation test cases and cleanup call frame logging.

* inspector/debugger/async-stack-trace-expected.txt:
* inspector/debugger/async-stack-trace.html:
* inspector/debugger/resources/log-active-stack-trace.js: Added.
(TestPage.registerInitializer.window.getActiveStackTrace):
(TestPage.registerInitializer.logStackTrace.logCallFrame):
(TestPage.registerInitializer.):
(TestPage.registerInitializer.window.logActiveStackTrace):
(TestPage.registerInitializer):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerasyncstacktraceexpectedtxt">trunk/LayoutTests/inspector/debugger/async-stack-trace-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerasyncstacktracehtml">trunk/LayoutTests/inspector/debugger/async-stack-trace.html</a></li>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgenth">trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolConsolejson">trunk/Source/JavaScriptCore/inspector/protocol/Console.json</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs">trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsStackTracejs">trunk/Source/WebInspectorUI/UserInterface/Models/StackTrace.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementcss">trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIVersionsInspectoriOS103json">trunk/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectordebuggerresourceslogactivestacktracejs">trunk/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorAsyncStackTracecpp">trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorAsyncStackTraceh">trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/LayoutTests/ChangeLog        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2017-01-28  Matt Baker  &lt;mattbaker@apple.com&gt;
+
+        Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+        https://bugs.webkit.org/show_bug.cgi?id=165633
+        &lt;rdar://problem/29738502&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        Add truncation test cases and cleanup call frame logging.
+
+        * inspector/debugger/async-stack-trace-expected.txt:
+        * inspector/debugger/async-stack-trace.html:
+        * inspector/debugger/resources/log-active-stack-trace.js: Added.
+        (TestPage.registerInitializer.window.getActiveStackTrace):
+        (TestPage.registerInitializer.logStackTrace.logCallFrame):
+        (TestPage.registerInitializer.):
+        (TestPage.registerInitializer.window.logActiveStackTrace):
+        (TestPage.registerInitializer):
+
</ins><span class="cx"> 2017-01-28  Yoav Weiss  &lt;yoav@yoav.ws&gt;
</span><span class="cx"> 
</span><span class="cx">         Add Link Preload as an off-by-default experimental feature menu item.
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerasyncstacktraceexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/async-stack-trace-expected.txt (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/async-stack-trace-expected.txt        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/LayoutTests/inspector/debugger/async-stack-trace-expected.txt        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -6,57 +6,64 @@
</span><span class="cx"> PAUSE #1
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] pauseThenFinishTest
</span><del>--- [N] requestAnimationFrame ----
-1: [F] testRequestAnimationFrame
-2: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- requestAnimationFrame ---
+2: [F] testRequestAnimationFrame
+3: [P] Global Code
</ins><span class="cx"> 
</span><span class="cx"> -- Running test case: CheckAsyncStackTrace.SetTimeout
</span><span class="cx"> PAUSE #1
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] pauseThenFinishTest
</span><del>--- [N] setTimeout ----
-1: [F] testSetTimeout
-2: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- setTimeout ---
+2: [F] testSetTimeout
+3: [P] Global Code
</ins><span class="cx"> 
</span><span class="cx"> -- Running test case: CheckAsyncStackTrace.SetInterval
</span><span class="cx"> PAUSE #1
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] intervalFired
</span><del>--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
</ins><span class="cx"> PAUSE #2
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] intervalFired
</span><del>--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
</ins><span class="cx"> PAUSE #3
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] intervalFired
</span><del>--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
</ins><span class="cx"> 
</span><span class="cx"> -- Running test case: CheckAsyncStackTrace.ChainedRequestAnimationFrame
</span><span class="cx"> PAUSE #1
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] pauseThenFinishTest
</span><del>--- [N] requestAnimationFrame ----
-1: [F] testRequestAnimationFrame
--- [N] requestAnimationFrame ----
-2: [F] testChainedRequestAnimationFrame
-3: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- requestAnimationFrame ---
+2: [F] testRequestAnimationFrame
+3: --- requestAnimationFrame ---
+4: [F] testChainedRequestAnimationFrame
+5: [P] Global Code
</ins><span class="cx"> 
</span><span class="cx"> -- Running test case: CheckAsyncStackTrace.ReferenceCounting
</span><span class="cx"> PAUSE #1
</span><span class="cx"> CALL STACK:
</span><span class="cx"> 0: [F] pauseThenFinishTest
</span><del>--- [N] setTimeout ----
-1: [F] intervalFired
--- [N] setInterval ----
-2: [F] testReferenceCounting
-3: [P] Global Code
</del><ins>+ASYNC CALL STACK:
+1: --- setTimeout ---
+2: [F] intervalFired
+3: --- setInterval ---
+4: [F] testReferenceCounting
+5: [P] Global Code
</ins><span class="cx"> -- Running test setup.
</span><span class="cx"> Save DebuggerManager.asyncStackTraceDepth
</span><span class="cx"> 
</span><span class="lines">@@ -67,8 +74,44 @@
</span><span class="cx"> -- Running test setup.
</span><span class="cx"> Save DebuggerManager.asyncStackTraceDepth
</span><span class="cx"> 
</span><del>--- Running test case: AsyncStackTrace.SetStackTraceDepth
-PASS: Number of call frames should be equal to the depth setting.
</del><ins>+-- Running test case: AsyncStackTrace.ForceTruncationOnCallStackBoundary
+Set Debugger.asyncStackTraceDepth equal to 4
+PASS: Non-root StackTrace should not be truncated.
+PASS: Non-root StackTrace should not be truncated.
+PASS: StackTrace root should be truncated.
+PASS: StackTrace should be truncated to the nearest call stack.
+CALL STACK:
+0: [F] pauseThenFinishTest
+1: [F] repeat
+ASYNC CALL STACK:
+2: --- requestAnimationFrame ---
+3: [F] repeat
+4: --- requestAnimationFrame ---
+5: [F] repeat
+(remaining call frames truncated)
</ins><span class="cx"> -- Running test teardown.
</span><span class="cx"> Restore DebuggerManager.asyncStackTraceDepth
</span><ins>+-- Running test setup.
+Save DebuggerManager.asyncStackTraceDepth
</ins><span class="cx"> 
</span><ins>+-- Running test case: AsyncStackTrace.ForceTruncationWithinCallStack
+Set Debugger.asyncStackTraceDepth equal to 5
+PASS: Non-root StackTrace should not be truncated.
+PASS: Non-root StackTrace should not be truncated.
+PASS: Non-root StackTrace should not be truncated.
+PASS: StackTrace root should be truncated.
+PASS: StackTrace should be truncated to the nearest call stack.
+CALL STACK:
+0: [F] pauseThenFinishTest
+1: [F] repeat
+ASYNC CALL STACK:
+2: --- requestAnimationFrame ---
+3: [F] repeat
+4: --- requestAnimationFrame ---
+5: [F] repeat
+6: --- requestAnimationFrame ---
+7: [F] repeat
+(remaining call frames truncated)
+-- Running test teardown.
+Restore DebuggerManager.asyncStackTraceDepth
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerasyncstacktracehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/async-stack-trace.html (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/async-stack-trace.html        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/LayoutTests/inspector/debugger/async-stack-trace.html        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx"> &lt;html&gt;
</span><span class="cx"> &lt;head&gt;
</span><span class="cx"> &lt;script src=&quot;../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
</span><ins>+&lt;script src=&quot;resources/log-active-stack-trace.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx"> &lt;script&gt;
</span><span class="cx"> const timerDelay = 20;
</span><span class="cx"> 
</span><span class="lines">@@ -48,55 +49,22 @@
</span><span class="cx">     testFunction();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function repeatingRequestAnimationFrame(repeatCount) {
+    let count = 0;
+    function repeat() {
+        if (count++ === repeatCount) {
+            pauseThenFinishTest();
+            return;
+        }
+        requestAnimationFrame(repeat);
+    }
+    requestAnimationFrame(repeat);
+}
+
</ins><span class="cx"> function test()
</span><span class="cx"> {
</span><span class="cx">     let suite = InspectorTest.createAsyncSuite(&quot;AsyncStackTrace&quot;);
</span><span class="cx"> 
</span><del>-    function activeTargetData() {
-        InspectorTest.assert(WebInspector.debuggerManager.activeCallFrame, &quot;Active call frame should exist.&quot;);
-        if (!WebInspector.debuggerManager.activeCallFrame)
-            return null;
-
-        let targetData = WebInspector.debuggerManager.dataForTarget(WebInspector.debuggerManager.activeCallFrame.target);
-        InspectorTest.assert(targetData, &quot;Data for active call frame target should exist.&quot;);
-        return targetData;
-    }
-
-    function logCallStack() {
-        function callFrameString(callFrame) {
-            let code = callFrame.nativeCode ? &quot;N&quot; : (callFrame.programCode ? &quot;P&quot; : &quot;F&quot;);
-            return `[${code}] ${callFrame.functionName}`;
-        }
-
-        function logCallFrames(callFrames) {
-            for (let callFrame of callFrames) {
-                InspectorTest.log(`${callFrameIndex++}: ${callFrameString(callFrame)}`);
-                // Skip remaining call frames after the test harness entry point.
-                if (callFrame.programCode)
-                    break;
-            }
-        }
-
-        let {callFrames, asyncStackTrace} = activeTargetData();
-        InspectorTest.assert(callFrames);
-        InspectorTest.assert(asyncStackTrace);
-
-        let callFrameIndex = 0;
-        logCallFrames(callFrames);
-
-        while (asyncStackTrace) {
-            let callFrames = asyncStackTrace.callFrames;
-            let topCallFrameIsBoundary = asyncStackTrace.topCallFrameIsBoundary;
-            asyncStackTrace = asyncStackTrace.parentStackTrace;
-            if (!callFrames || !callFrames.length)
-                continue;
-
-            let boundaryLabel = topCallFrameIsBoundary ? callFrameString(callFrames.shift()) : &quot;(async)&quot;;
-            InspectorTest.log(`-- ${boundaryLabel} ----`);
-            logCallFrames(callFrames);
-        }
-    }
-
</del><span class="cx">     function addSimpleTestCase(name, expression) {
</span><span class="cx">         suite.addTestCase({
</span><span class="cx">             name: `CheckAsyncStackTrace.${name}`,
</span><span class="lines">@@ -104,8 +72,7 @@
</span><span class="cx">                 let pauseCount = 0;
</span><span class="cx">                 function handlePaused() {
</span><span class="cx">                     InspectorTest.log(`PAUSE #${++pauseCount}`);
</span><del>-                    InspectorTest.log(&quot;CALL STACK:&quot;);
-                    logCallStack();
</del><ins>+                    logActiveStackTrace();
</ins><span class="cx">                     WebInspector.debuggerManager.resume();
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="lines">@@ -146,8 +113,9 @@
</span><span class="cx">         test(resolve, reject) {
</span><span class="cx">             WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
</span><span class="cx">             .then((event) =&gt; {
</span><del>-                let stackTrace = activeTargetData().asyncStackTrace;
-                InspectorTest.expectNull(stackTrace, &quot;Async stack trace should be null.&quot;);
</del><ins>+                let stackTrace = getActiveStackTrace();
+                let asyncStackTrace = stackTrace.parentStackTrace;
+                InspectorTest.expectNull(asyncStackTrace, &quot;Async stack trace should be null.&quot;);
</ins><span class="cx">                 WebInspector.debuggerManager.resume().then(resolve, reject);
</span><span class="cx">             });
</span><span class="cx"> 
</span><span class="lines">@@ -156,29 +124,56 @@
</span><span class="cx">         }
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    suite.addTestCase({
-        name: &quot;AsyncStackTrace.SetStackTraceDepth&quot;,
-        setup,
-        teardown,
-        test(resolve, reject) {
-            WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
-            .then((event) =&gt; {
-                let stackTrace = activeTargetData().asyncStackTrace;
-                InspectorTest.assert(stackTrace &amp;&amp; stackTrace.callFrames);
-                if (!stackTrace || !stackTrace.callFrames)
-                    reject();
</del><ins>+    function addTruncateTestCase(name, asyncStackTraceDepth) {
+        suite.addTestCase({
+            name: `AsyncStackTrace.${name}`,
+            setup,
+            teardown,
+            test(resolve, reject) {
+                // When repeatingRequestAnimationFrame calls rAF, the backend will store a call stack with length 2:
+                // one frame for the caller and one for the asynchronous boundary. As a result, the parity of
+                // Debugger.asyncStackTraceDepth determines whether the trace is truncated on a call stack boundary
+                // (even) or call frame boundary (odd). Since truncation doesn't remove individual call frames,
+                // the depth of the resulting stack trace may exceed the depth setting:
+                //     S = { sšŸ¶, sšŸ·, ā€¦, sš‘˜ }
+                //     T = truncate(S)
+                //     depth(T) ā‰¤ d + depth(tš‘˜)
+                const framesPerCallStack = 2;
+                const expectedStackTraceDepth = asyncStackTraceDepth + (asyncStackTraceDepth % framesPerCallStack);
</ins><span class="cx"> 
</span><del>-                InspectorTest.expectEqual(stackTrace.callFrames.length, maxStackDepth, &quot;Number of call frames should be equal to the depth setting.&quot;);
-                WebInspector.debuggerManager.resume().then(resolve, reject);
-            });
</del><ins>+                WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
+                .then((event) =&gt; {
+                    let stackTrace = getActiveStackTrace();
+                    InspectorTest.assert(stackTrace &amp;&amp; stackTrace.callFrames);
+                    if (!stackTrace || !stackTrace.callFrames)
+                        reject();
</ins><span class="cx"> 
</span><del>-            const maxStackDepth = 2;
-            const functionCallCount = maxStackDepth * 2;
-            WebInspector.debuggerManager.asyncStackTraceDepth = maxStackDepth;
-            InspectorTest.evaluateInPage(`recursiveCallThenTest(testRequestAnimationFrame, ${functionCallCount})`);
-        }
-    });
</del><ins>+                    let stackTraceDepth = 0;
+                    while (stackTrace.parentStackTrace) {
+                        InspectorTest.expectFalse(stackTrace.truncated, &quot;Non-root StackTrace should not be truncated.&quot;);
+                        stackTrace = stackTrace.parentStackTrace;
+                        stackTraceDepth += stackTrace.callFrames.length;
+                    }
</ins><span class="cx"> 
</span><ins>+                    InspectorTest.expectThat(stackTrace.truncated, &quot;StackTrace root should be truncated.&quot;);
+                    InspectorTest.expectEqual(stackTraceDepth, expectedStackTraceDepth, &quot;StackTrace should be truncated to the nearest call stack.&quot;);
+
+                    logActiveStackTrace();
+                    WebInspector.debuggerManager.resume().then(resolve, reject);
+                });
+
+                InspectorTest.log(`Set Debugger.asyncStackTraceDepth equal to ${asyncStackTraceDepth}`);
+                WebInspector.debuggerManager.asyncStackTraceDepth = asyncStackTraceDepth;
+
+                let repeatCount = Math.floor(asyncStackTraceDepth / framesPerCallStack) + 1;
+                InspectorTest.evaluateInPage(`repeatingRequestAnimationFrame(${repeatCount})`);
+            }
+        });
+    }
+
+    addTruncateTestCase(&quot;ForceTruncationOnCallStackBoundary&quot;, 4);
+    addTruncateTestCase(&quot;ForceTruncationWithinCallStack&quot;, 5);
+
</ins><span class="cx">     suite.runTestCasesAndFinish();
</span><span class="cx"> }
</span><span class="cx"> &lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerresourceslogactivestacktracejs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js (0 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+TestPage.registerInitializer(() =&gt; {
+    window.getActiveStackTrace = function() {
+        InspectorTest.assert(WebInspector.debuggerManager.activeCallFrame, &quot;Active call frame should exist.&quot;);
+        if (!WebInspector.debuggerManager.activeCallFrame)
+            return null;
+
+        let targetData = WebInspector.debuggerManager.dataForTarget(WebInspector.debuggerManager.activeCallFrame.target);
+        InspectorTest.assert(targetData, &quot;Data for active call frame target should exist.&quot;);
+        if (!targetData)
+            return null;
+
+        const topCallFrameIsBoundary = false;
+        const truncated = false;
+        return new WebInspector.StackTrace(targetData.callFrames, topCallFrameIsBoundary, truncated, targetData.asyncStackTrace);
+    }
+
+    window.logActiveStackTrace = function() {
+        function logStackTrace(stackTrace) {
+            let foundAsyncBoundary = false;
+            let callFrameIndex = 0;
+
+            function logCallFrame(callFrame, isAsyncBoundary) {
+                let label = callFrame.functionName;
+                if (isAsyncBoundary)
+                    InspectorTest.log(`${callFrameIndex}: --- ${label} ---`);
+                else {
+                    let code = callFrame.nativeCode ? &quot;N&quot; : (callFrame.programCode ? &quot;P&quot; : &quot;F&quot;);
+                    InspectorTest.log(`${callFrameIndex}: [${code}] ${label}`);
+                }
+                callFrameIndex++;
+            }
+
+            InspectorTest.log(&quot;CALL STACK:&quot;);
+
+            while (stackTrace) {
+                let callFrames = stackTrace.callFrames;
+                let topCallFrameIsBoundary = stackTrace.topCallFrameIsBoundary;
+                let truncated = stackTrace.truncated;
+                stackTrace = stackTrace.parentStackTrace;
+                if (!callFrames || !callFrames.length)
+                    continue;
+
+                if (topCallFrameIsBoundary) {
+                    if (!foundAsyncBoundary) {
+                        InspectorTest.log(&quot;ASYNC CALL STACK:&quot;);
+                        foundAsyncBoundary = true;
+                    }
+                    logCallFrame(callFrames[0], true);
+                }
+
+                for (let i = topCallFrameIsBoundary ? 1 : 0; i &lt; callFrames.length; ++i) {
+                    let callFrame = callFrames[i];
+                    logCallFrame(callFrame);
+
+                    // Skip call frames after the test harness entry point.
+                    if (callFrame.programCode)
+                        break;
+                }
+
+                if (truncated)
+                    InspectorTest.log(&quot;(remaining call frames truncated)&quot;);
+            }
+        }
+
+        logStackTrace(getActiveStackTrace());
+    }
+});
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -514,6 +514,7 @@
</span><span class="cx">     heap/WeakSet.cpp
</span><span class="cx">     heap/WriteBarrierSupport.cpp
</span><span class="cx"> 
</span><ins>+    inspector/AsyncStackTrace.cpp
</ins><span class="cx">     inspector/ConsoleMessage.cpp
</span><span class="cx">     inspector/ContentSearchUtilities.cpp
</span><span class="cx">     inspector/EventLoop.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -1,3 +1,91 @@
</span><ins>+2017-01-28  Matt Baker  &lt;mattbaker@apple.com&gt;
+
+        Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+        https://bugs.webkit.org/show_bug.cgi?id=165633
+        &lt;rdar://problem/29738502&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        This patch limits the memory used by the Inspector backend to store async
+        stack trace data.
+
+        Asynchronous stack traces are stored as a disjoint set of parent pointer
+        trees. Tree nodes represent asynchronous operations, and hold a copy of
+        the stack trace at the time the operation was scheduled. Each tree can
+        be regarded as a set of stack traces, stored as singly linked lists that
+        share part of their structure (specifically their tails). Traces belonging
+        to the same tree will at least share a common root. A stack trace begins
+        at a leaf node and follows the chain of parent pointers to the root of
+        of the tree. Leaf nodes always contain pending asynchronous calls.
+
+        When an asynchronous operation is scheduled with requestAnimationFrame,
+        setInterval, etc, a node is created containing the current call stack and
+        some bookkeeping data for the operation. An unique identifier comprised
+        of an operation type and callback identifier is mapped to the node. If
+        scheduling the callback was itself the result of an asynchronous call,
+        the node becomes a child of the node associated with that call, otherwise
+        it becomes the root of a new tree.
+
+        A node is either `pending`, `active`, `dispatched`, or `canceled`. Nodes
+        start out as pending. After a callback for a pending node is dispatched
+        the node is marked as such, unless it is a repeating callback such as
+        setInterval, in which case it remains pending. Once a node is no longer
+        pending it is removed, as long as it has no children. Since nodes are
+        reference counted, it is a property of the stack trace tree that nodes
+        that are no longer pending and have no children pointing to them will be
+        automatically pruned from the tree.
+
+        If an async operation is canceled (e.g. cancelTimeout), the associated
+        node is marked as such. If the callback is not being dispatched at the
+        time, and has no children, it is removed.
+
+        Because async operations can be chained indefinitely, stack traces are
+        limited to a maximum depth. The depth of a stack trace is equal to the
+        sum of the depths of its nodes, with a node's depth equal to the number
+        of frames in its associated call stack. For any stack trace,
+
+            S = { sšŸ¶, sšŸ·, ā€¦, sš‘˜ }, with endpoints sšŸ¶, sš‘˜
+            depth(S) = depth(sšŸ¶) + depth(sšŸ·) + ā€¦ + depth(sš‘˜)
+
+        A stack trace is truncated when it exceeds the maximum depth. Truncation
+        occurs on node boundaries, not call frames, consequently the maximum depth
+        is more of a target than a guarantee:
+
+            d = maximum stack trace depth
+            for all S, depth(S) ā‰¤ d + depth(sš‘˜)
+
+        Because nodes can belong to multiple stack traces, it may be necessary
+        to clone the tail of a stack trace being truncated to prevent other traces
+        from being effected.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * inspector/AsyncStackTrace.cpp: Added.
+        (Inspector::AsyncStackTrace::create):
+        (Inspector::AsyncStackTrace::AsyncStackTrace):
+        (Inspector::AsyncStackTrace::~AsyncStackTrace):
+        (Inspector::AsyncStackTrace::isPending):
+        (Inspector::AsyncStackTrace::isLocked):
+        (Inspector::AsyncStackTrace::willDispatchAsyncCall):
+        (Inspector::AsyncStackTrace::didDispatchAsyncCall):
+        (Inspector::AsyncStackTrace::didCancelAsyncCall):
+        (Inspector::AsyncStackTrace::buildInspectorObject):
+        (Inspector::AsyncStackTrace::truncate):
+        (Inspector::AsyncStackTrace::remove):
+        * inspector/AsyncStackTrace.h:
+        * inspector/agents/InspectorDebuggerAgent.cpp:
+        (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall):
+        (Inspector::InspectorDebuggerAgent::didCancelAsyncCall):
+        (Inspector::InspectorDebuggerAgent::willDispatchAsyncCall):
+        (Inspector::InspectorDebuggerAgent::didDispatchAsyncCall):
+        (Inspector::InspectorDebuggerAgent::didPause):
+        (Inspector::InspectorDebuggerAgent::clearAsyncStackTraceData):
+        (Inspector::InspectorDebuggerAgent::buildAsyncStackTrace): Deleted.
+        (Inspector::InspectorDebuggerAgent::refAsyncCallData): Deleted.
+        (Inspector::InspectorDebuggerAgent::derefAsyncCallData): Deleted.
+        * inspector/agents/InspectorDebuggerAgent.h:
+        * inspector/protocol/Console.json:
+
</ins><span class="cx"> 2017-01-28  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remote Inspector: Listing should be updated when a target gains or loses a debugger session
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -1376,6 +1376,8 @@
</span><span class="cx">                 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65C0285B1717966800351E35 /* ARMv7DOpcode.h */; };
</span><span class="cx">                 65FB5117184EEE7000C12B70 /* ProtoCallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */; };
</span><span class="cx">                 65FB63A41C8EA09C0020719B /* YarrCanonicalizeUnicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65A946141C8E9F6F00A7209A /* YarrCanonicalizeUnicode.cpp */; };
</span><ins>+                6A38CFA91E32B5AB0060206F /* AsyncStackTrace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */; };
+                6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */; };
</ins><span class="cx">                 6AD2CB4D19B9140100065719 /* DebuggerEvalEnabler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 70113D4B1A8DB093003848C4 /* IteratorOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70113D491A8DB093003848C4 /* IteratorOperations.cpp */; };
</span><span class="cx">                 70113D4C1A8DB093003848C4 /* IteratorOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 70113D4A1A8DB093003848C4 /* IteratorOperations.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -3839,6 +3841,8 @@
</span><span class="cx">                 65EA73630BAE35D1001BB560 /* CommonIdentifiers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CommonIdentifiers.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65FB5115184EE8F800C12B70 /* ProtoCallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtoCallFrame.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProtoCallFrame.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncStackTrace.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncStackTrace.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerEvalEnabler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 6BA93C9590484C5BAD9316EA /* JSScriptFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSScriptFetcher.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 70113D491A8DB093003848C4 /* IteratorOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IteratorOperations.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5029,13 +5033,13 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 0F9327591C20BCBA00CF6564 /* dynbench */,
</span><span class="cx">                                 0FF922CF14F46B130041A24E /* JSCLLIntOffsetsExtractor */,
</span><ins>+                                141211200A48793C00480255 /* minidom */,
</ins><span class="cx">                                 0F6183431C45F62A0072450B /* testair */,
</span><ins>+                                14BD59BF0A3E8F9000BAF59C /* testapi */,
+                                0FEC85AD1BDB5CF10080FF74 /* testb3 */,
</ins><span class="cx">                                 6511230514046A4C002B101D /* testRegExp */,
</span><span class="cx">                                 932F5BD90822A1C700736975 /* JavaScriptCore.framework */,
</span><span class="cx">                                 932F5BE10822A1C700736975 /* jsc */,
</span><del>-                                141211200A48793C00480255 /* minidom */,
-                                14BD59BF0A3E8F9000BAF59C /* testapi */,
-                                0FEC85AD1BDB5CF10080FF74 /* testb3 */,
</del><span class="cx">                         );
</span><span class="cx">                         name = Products;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -5256,10 +5260,10 @@
</span><span class="cx">                                 0FEC84C01BDACDAC0080FF74 /* B3Common.h */,
</span><span class="cx">                                 0FEC84C11BDACDAC0080FF74 /* B3Commutativity.cpp */,
</span><span class="cx">                                 0FEC84C21BDACDAC0080FF74 /* B3Commutativity.h */,
</span><del>-                                7919B77F1E03559C005BEED8 /* B3Compile.h */,
-                                795F099C1E03600500BBE37F /* B3Compile.cpp */,
</del><span class="cx">                                 0F338DFF1BF0276C0013C88F /* B3Compilation.cpp */,
</span><span class="cx">                                 0F338E001BF0276C0013C88F /* B3Compilation.h */,
</span><ins>+                                795F099C1E03600500BBE37F /* B3Compile.cpp */,
+                                7919B77F1E03559C005BEED8 /* B3Compile.h */,
</ins><span class="cx">                                 0F86AE1F1C5311C5006BE8EC /* B3ComputeDivisionMagic.h */,
</span><span class="cx">                                 0FEC84C31BDACDAC0080FF74 /* B3Const32Value.cpp */,
</span><span class="cx">                                 0FEC84C41BDACDAC0080FF74 /* B3Const32Value.h */,
</span><span class="lines">@@ -6365,9 +6369,9 @@
</span><span class="cx">                                 E178633F0D9BEC0000D74E75 /* InitializeThreading.h */,
</span><span class="cx">                                 E35E035D1B7AB43E0073AD2A /* InspectorInstrumentationObject.cpp */,
</span><span class="cx">                                 E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */,
</span><del>-                                A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
</del><span class="cx">                                 A7A8AF2C17ADB5F3005AB174 /* Int16Array.h */,
</span><span class="cx">                                 A7A8AF2D17ADB5F3005AB174 /* Int32Array.h */,
</span><ins>+                                A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
</ins><span class="cx">                                 BC9BB95B0E19680600DF8855 /* InternalFunction.cpp */,
</span><span class="cx">                                 BC11667A0E199C05008066DD /* InternalFunction.h */,
</span><span class="cx">                                 A1B9E2331B4E0D6700BC7FED /* IntlCollator.cpp */,
</span><span class="lines">@@ -6462,9 +6466,9 @@
</span><span class="cx">                                 BC756FC60E2031B200DE7D12 /* JSGlobalObjectFunctions.cpp */,
</span><span class="cx">                                 BC756FC70E2031B200DE7D12 /* JSGlobalObjectFunctions.h */,
</span><span class="cx">                                 79B819921DD25CF500DDC714 /* JSGlobalObjectInlines.h */,
</span><del>-                                0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
</del><span class="cx">                                 0F2B66CA17B6B5AB00A7AE3F /* JSInt16Array.h */,
</span><span class="cx">                                 0F2B66CB17B6B5AB00A7AE3F /* JSInt32Array.h */,
</span><ins>+                                0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
</ins><span class="cx">                                 E33F507E1B8429A400413856 /* JSInternalPromise.cpp */,
</span><span class="cx">                                 E33F507F1B8429A400413856 /* JSInternalPromise.h */,
</span><span class="cx">                                 E33F50761B84225700413856 /* JSInternalPromiseConstructor.cpp */,
</span><span class="lines">@@ -6552,10 +6556,10 @@
</span><span class="cx">                                 53F256E11B87E28000B4B768 /* JSTypedArrayViewPrototype.cpp */,
</span><span class="cx">                                 53917E7C1B791106000EBD33 /* JSTypedArrayViewPrototype.h */,
</span><span class="cx">                                 6507D2970E871E4A00D7D896 /* JSTypeInfo.h */,
</span><ins>+                                0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
+                                0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
</ins><span class="cx">                                 0F2B66D217B6B5AB00A7AE3F /* JSUint8Array.h */,
</span><span class="cx">                                 0F2B66D317B6B5AB00A7AE3F /* JSUint8ClampedArray.h */,
</span><del>-                                0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
-                                0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
</del><span class="cx">                                 A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */,
</span><span class="cx">                                 A7CA3AE217DA41AE006538AF /* JSWeakMap.h */,
</span><span class="cx">                                 709FB8611AE335C60039D069 /* JSWeakSet.cpp */,
</span><span class="lines">@@ -6762,11 +6766,11 @@
</span><span class="cx">                                 0F2D4DE019832D91007D4B19 /* TypeProfilerLog.h */,
</span><span class="cx">                                 0F2D4DE319832D91007D4B19 /* TypeSet.cpp */,
</span><span class="cx">                                 0F2D4DE419832D91007D4B19 /* TypeSet.h */,
</span><del>-                                A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
-                                A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
</del><span class="cx">                                 A7A8AF3217ADB5F3005AB174 /* Uint16Array.h */,
</span><span class="cx">                                 866739D113BFDE710023D87C /* Uint16WithFraction.h */,
</span><span class="cx">                                 A7A8AF3317ADB5F3005AB174 /* Uint32Array.h */,
</span><ins>+                                A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
+                                A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
</ins><span class="cx">                                 0FE050231AA9095600D33B33 /* VarOffset.cpp */,
</span><span class="cx">                                 0FE050241AA9095600D33B33 /* VarOffset.h */,
</span><span class="cx">                                 E18E3A570DF9278C00D90B34 /* VM.cpp */,
</span><span class="lines">@@ -7553,6 +7557,8 @@
</span><span class="cx">                                 A532438D185696CA002ED692 /* protocol */,
</span><span class="cx">                                 A5BA15E01823409D00A82E69 /* remote */,
</span><span class="cx">                                 A532438E185696CE002ED692 /* scripts */,
</span><ins>+                                6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */,
+                                6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */,
</ins><span class="cx">                                 A5FD0077189B051000633231 /* ConsoleMessage.cpp */,
</span><span class="cx">                                 A5FD0078189B051000633231 /* ConsoleMessage.h */,
</span><span class="cx">                                 A57D23EF1891B5B40031C7FA /* ContentSearchUtilities.cpp */,
</span><span class="lines">@@ -7908,6 +7914,7 @@
</span><span class="cx">                                 A784A26111D16622005776AC /* ASTBuilder.h in Headers */,
</span><span class="cx">                                 5B70CFE21DB69E6600EC23F9 /* AsyncFunctionConstructor.h in Headers */,
</span><span class="cx">                                 5B70CFE01DB69E6600EC23F9 /* AsyncFunctionPrototype.h in Headers */,
</span><ins>+                                6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */,
</ins><span class="cx">                                 0F7CF9571DC125900098CC12 /* AtomicsObject.h in Headers */,
</span><span class="cx">                                 A5EA70E719F5B1010098F5EC /* AugmentableInspectorController.h in Headers */,
</span><span class="cx">                                 A5EA70E819F5B1010098F5EC /* AugmentableInspectorControllerClient.h in Headers */,
</span><span class="lines">@@ -7930,6 +7937,7 @@
</span><span class="cx">                                 0FEC850A1BDACDAC0080FF74 /* B3Common.h in Headers */,
</span><span class="cx">                                 0FEC850C1BDACDAC0080FF74 /* B3Commutativity.h in Headers */,
</span><span class="cx">                                 0F338E0C1BF0276C0013C88F /* B3Compilation.h in Headers */,
</span><ins>+                                7919B7801E03559C005BEED8 /* B3Compile.h in Headers */,
</ins><span class="cx">                                 0F86AE201C5311C5006BE8EC /* B3ComputeDivisionMagic.h in Headers */,
</span><span class="cx">                                 0FEC850E1BDACDAC0080FF74 /* B3Const32Value.h in Headers */,
</span><span class="cx">                                 0FEC85101BDACDAC0080FF74 /* B3Const64Value.h in Headers */,
</span><span class="lines">@@ -8029,7 +8037,6 @@
</span><span class="cx">                                 0FB7F39815ED8E4600F167B2 /* ButterflyInlines.h in Headers */,
</span><span class="cx">                                 C2FCAE1117A9C24E0034C735 /* BytecodeBasicBlock.h in Headers */,
</span><span class="cx">                                 0F21C27F14BEAA8200ADC64B /* BytecodeConventions.h in Headers */,
</span><del>-                                0F1FB3931E177A7200A9BE50 /* VisitingTimeout.h in Headers */,
</del><span class="cx">                                 969A07230ED1CE3300F1F681 /* BytecodeGenerator.h in Headers */,
</span><span class="cx">                                 E328DAE81D38D005001A2529 /* BytecodeGeneratorification.h in Headers */,
</span><span class="cx">                                 E328DAE91D38D005001A2529 /* BytecodeGraph.h in Headers */,
</span><span class="lines">@@ -8055,7 +8062,6 @@
</span><span class="cx">                                 FE80C1971D775CDD008510C0 /* CatchScope.h in Headers */,
</span><span class="cx">                                 0F24E54217EA9F5900ABB217 /* CCallHelpers.h in Headers */,
</span><span class="cx">                                 0F070A471D543A8B006E7232 /* CellContainer.h in Headers */,
</span><del>-                                ADE8029A1E08F1DE0058DE78 /* WebAssemblyLinkErrorConstructor.h in Headers */,
</del><span class="cx">                                 0F070A481D543A90006E7232 /* CellContainerInlines.h in Headers */,
</span><span class="cx">                                 0F1C3DDA1BBCE09E00E523E4 /* CellState.h in Headers */,
</span><span class="cx">                                 BC6AAAE50E1F426500AD87D8 /* ClassInfo.h in Headers */,
</span><span class="lines">@@ -8093,6 +8099,7 @@
</span><span class="cx">                                 A55714BE1CD8049F0004D2C6 /* ConsoleObject.h in Headers */,
</span><span class="cx">                                 A5FD0074189B038C00633231 /* ConsoleTypes.h in Headers */,
</span><span class="cx">                                 0FFC99D1184EC8AD009C10AB /* ConstantMode.h in Headers */,
</span><ins>+                                0F7DF1341E2970D70095951B /* ConstraintVolatility.h in Headers */,
</ins><span class="cx">                                 E354622B1B6065D100545386 /* ConstructAbility.h in Headers */,
</span><span class="cx">                                 BC18C3F60E16F5CD00B34460 /* ConstructData.h in Headers */,
</span><span class="cx">                                 A57D23F21891B5B40031C7FA /* ContentSearchUtilities.h in Headers */,
</span><span class="lines">@@ -8114,7 +8121,6 @@
</span><span class="cx">                                 BCD203E80E1718F4002C7E82 /* DatePrototype.lut.h in Headers */,
</span><span class="cx">                                 BC18C3FA0E16F5CD00B34460 /* Debugger.h in Headers */,
</span><span class="cx">                                 BC18C3FB0E16F5CD00B34460 /* DebuggerCallFrame.h in Headers */,
</span><del>-                                0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */,
</del><span class="cx">                                 6AD2CB4D19B9140100065719 /* DebuggerEvalEnabler.h in Headers */,
</span><span class="cx">                                 A5FC84B21D1DDAD6006B5C46 /* DebuggerLocation.h in Headers */,
</span><span class="cx">                                 A5A1A0941D8CB33E004C2EB8 /* DebuggerParseData.h in Headers */,
</span><span class="lines">@@ -8139,7 +8145,6 @@
</span><span class="cx">                                 0F2DD8141AB3D8BE00BBB8E8 /* DFGArgumentsUtilities.h in Headers */,
</span><span class="cx">                                 0F485322187750560083B687 /* DFGArithMode.h in Headers */,
</span><span class="cx">                                 0F05C3B41683CF9200BAF45B /* DFGArrayifySlowPathGenerator.h in Headers */,
</span><del>-                                0F4F82881E2FFDE00075184C /* JSSegmentedVariableObjectSubspace.h in Headers */,
</del><span class="cx">                                 0F63948515E4811B006A597C /* DFGArrayMode.h in Headers */,
</span><span class="cx">                                 A7D9A29517A0BC7400EE2618 /* DFGAtTailAbstractState.h in Headers */,
</span><span class="cx">                                 0F666EC71835672B00D017F1 /* DFGAvailability.h in Headers */,
</span><span class="lines">@@ -8164,7 +8169,6 @@
</span><span class="cx">                                 0F3B3A281544C997003ED0FF /* DFGCFGSimplificationPhase.h in Headers */,
</span><span class="cx">                                 0F9D36951AE9CC33000D4DFB /* DFGCleanUpPhase.h in Headers */,
</span><span class="cx">                                 A77A424017A0BBFD00A8DB81 /* DFGClobberize.h in Headers */,
</span><del>-                                AD7438C01E0457A400FD0C2A /* WasmSignature.h in Headers */,
</del><span class="cx">                                 A77A424217A0BBFD00A8DB81 /* DFGClobberSet.h in Headers */,
</span><span class="cx">                                 0F3C1F1B1B868E7900ABB08B /* DFGClobbersExitState.h in Headers */,
</span><span class="cx">                                 0F04396E1B03DC0B009598B7 /* DFGCombinedLiveness.h in Headers */,
</span><span class="lines">@@ -8204,7 +8208,6 @@
</span><span class="cx">                                 0F9D339717FFC4E60073C2BC /* DFGFlushedAt.h in Headers */,
</span><span class="cx">                                 A7D89CF817A0B8CC00773AD8 /* DFGFlushFormat.h in Headers */,
</span><span class="cx">                                 0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */,
</span><del>-                                0F4F828C1E31B9760075184C /* StochasticSpaceTimeMutatorScheduler.h in Headers */,
</del><span class="cx">                                 0F69CC89193AC60A0045759E /* DFGFrozenValue.h in Headers */,
</span><span class="cx">                                 86EC9DC61328DF82002B2AD7 /* DFGGenerationInfo.h in Headers */,
</span><span class="cx">                                 86EC9DC81328DF82002B2AD7 /* DFGGraph.h in Headers */,
</span><span class="lines">@@ -8258,7 +8261,6 @@
</span><span class="cx">                                 0FC0977114693AF500CF2442 /* DFGOSRExitCompiler.h in Headers */,
</span><span class="cx">                                 0F7025AA1714B0FC00382C0E /* DFGOSRExitCompilerCommon.h in Headers */,
</span><span class="cx">                                 0F392C8A1B46188400844728 /* DFGOSRExitFuzz.h in Headers */,
</span><del>-                                0F7DF13F1E2AFC4D0095951B /* JSStringSubspace.h in Headers */,
</del><span class="cx">                                 0FEFC9AB1681A3B600567F53 /* DFGOSRExitJumpPlaceholder.h in Headers */,
</span><span class="cx">                                 0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */,
</span><span class="cx">                                 0F6237981AE45CA700D402EA /* DFGPhantomInsertionPhase.h in Headers */,
</span><span class="lines">@@ -8265,6 +8267,7 @@
</span><span class="cx">                                 0FFFC95C14EF90AF00C72532 /* DFGPhase.h in Headers */,
</span><span class="cx">                                 0F2B9CEB19D0BA7D00B1D1B5 /* DFGPhiChildren.h in Headers */,
</span><span class="cx">                                 A78A977B179738B8009DF744 /* DFGPlan.h in Headers */,
</span><ins>+                                0F1FB3961E1AF7E100A9BE50 /* DFGPlanInlines.h in Headers */,
</ins><span class="cx">                                 DC00039319D8BE6F00023EB0 /* DFGPreciseLocalClobberize.h in Headers */,
</span><span class="cx">                                 0FBE0F7516C1DB0B0082C5E8 /* DFGPredictionInjectionPhase.h in Headers */,
</span><span class="cx">                                 0FFFC95E14EF90B700C72532 /* DFGPredictionPropagationPhase.h in Headers */,
</span><span class="lines">@@ -8295,6 +8298,7 @@
</span><span class="cx">                                 0F2FCCFF18A60070001A27F8 /* DFGThreadData.h in Headers */,
</span><span class="cx">                                 0FC097A2146B28CC00CF2442 /* DFGThunks.h in Headers */,
</span><span class="cx">                                 0FD8A32817D51F5700CA2C40 /* DFGTierUpCheckInjectionPhase.h in Headers */,
</span><ins>+                                ADFF2F701E319DE3001EA54E /* DFGTierUpEntryTrigger.h in Headers */,
</ins><span class="cx">                                 0FD8A32A17D51F5700CA2C40 /* DFGToFTLDeferredCompilationCallback.h in Headers */,
</span><span class="cx">                                 0FD8A32C17D51F5700CA2C40 /* DFGToFTLForOSREntryDeferredCompilationCallback.h in Headers */,
</span><span class="cx">                                 0FE7211E193B9C590031F6ED /* DFGTransition.h in Headers */,
</span><span class="lines">@@ -8312,6 +8316,7 @@
</span><span class="cx">                                 0FFFC96014EF90BD00C72532 /* DFGVirtualRegisterAllocationPhase.h in Headers */,
</span><span class="cx">                                 0FC97F4218202119002C9B26 /* DFGWatchpointCollectionPhase.h in Headers */,
</span><span class="cx">                                 0FDB2CE8174830A2007B3C1B /* DFGWorklist.h in Headers */,
</span><ins>+                                0F1FB3971E1AF7E300A9BE50 /* DFGWorklistInlines.h in Headers */,
</ins><span class="cx">                                 0FE050181AA9091100D33B33 /* DirectArguments.h in Headers */,
</span><span class="cx">                                 0FE050161AA9091100D33B33 /* DirectArgumentsOffset.h in Headers */,
</span><span class="cx">                                 969A07980ED1D3AE00F1F681 /* DirectEvalCodeCache.h in Headers */,
</span><span class="lines">@@ -8418,7 +8423,6 @@
</span><span class="cx">                                 52B310FB1974AE610080857C /* FunctionHasExecutedCache.h in Headers */,
</span><span class="cx">                                 FE4BFF2C1AD476E700088F87 /* FunctionOverrides.h in Headers */,
</span><span class="cx">                                 BC18C4050E16F5CD00B34460 /* FunctionPrototype.h in Headers */,
</span><del>-                                7919B7801E03559C005BEED8 /* B3Compile.h in Headers */,
</del><span class="cx">                                 62D2D3901ADF103F000206C1 /* FunctionRareData.h in Headers */,
</span><span class="cx">                                 FEA0C4031CDD7D1D00481991 /* FunctionWhitelist.h in Headers */,
</span><span class="cx">                                 2AACE63D18CA5A0300ED0191 /* GCActivityCallback.h in Headers */,
</span><span class="lines">@@ -8434,10 +8438,8 @@
</span><span class="cx">                                 A54E8EB018BFFBBB00556D28 /* GCSegmentedArray.h in Headers */,
</span><span class="cx">                                 A54E8EB118BFFBBE00556D28 /* GCSegmentedArrayInlines.h in Headers */,
</span><span class="cx">                                 0F86A26F1D6F7B3300CB0C92 /* GCTypeMap.h in Headers */,
</span><del>-                                0F7DF1381E2970E40095951B /* SubspaceInlines.h in Headers */,
</del><span class="cx">                                 9959E9311BD18272001AA413 /* generate-combined-inspector-json.py in Headers */,
</span><span class="cx">                                 C4703CC0192844960013FBEA /* generate-inspector-protocol-bindings.py in Headers */,
</span><del>-                                0F7DF1461E2BEF6A0095951B /* MarkedAllocatorInlines.h in Headers */,
</del><span class="cx">                                 99DA00AF1BD5994E00F4575C /* generate-js-builtins.py in Headers */,
</span><span class="cx">                                 A5EA70EC19F5B3EA0098F5EC /* generate_cpp_alternate_backend_dispatcher_header.py in Headers */,
</span><span class="cx">                                 A5EF9B141A1D43F600702E90 /* generate_cpp_backend_dispatcher_header.py in Headers */,
</span><span class="lines">@@ -8472,7 +8474,6 @@
</span><span class="cx">                                 0F0332C418B01763005F979A /* GetByIdVariant.h in Headers */,
</span><span class="cx">                                 7964656A1B952FF0003059EE /* GetPutInfo.h in Headers */,
</span><span class="cx">                                 14AD910E1DCA92940014F9FE /* GlobalCodeBlock.h in Headers */,
</span><del>-                                79DAE27A1E03C82200B526AA /* WasmExceptionType.h in Headers */,
</del><span class="cx">                                 0F24E54417EA9F5900ABB217 /* GPRInfo.h in Headers */,
</span><span class="cx">                                 142E3134134FF0A600AFADB5 /* Handle.h in Headers */,
</span><span class="cx">                                 C283190016FE4B7D00157BFD /* HandleBlock.h in Headers */,
</span><span class="lines">@@ -8539,7 +8540,6 @@
</span><span class="cx">                                 A5339EC61BB399A60054F005 /* InspectorHeapAgent.h in Headers */,
</span><span class="cx">                                 E35E03601B7AB43E0073AD2A /* InspectorInstrumentationObject.h in Headers */,
</span><span class="cx">                                 E33B3E261B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h in Headers */,
</span><del>-                                ADE802991E08F1DE0058DE78 /* JSWebAssemblyLinkError.h in Headers */,
</del><span class="cx">                                 A532438C18568335002ED692 /* InspectorProtocolObjects.h in Headers */,
</span><span class="cx">                                 A55D93AC18514F7900400DED /* InspectorProtocolTypes.h in Headers */,
</span><span class="cx">                                 A50E4B6218809DD50068A46D /* InspectorRuntimeAgent.h in Headers */,
</span><span class="lines">@@ -8569,7 +8569,6 @@
</span><span class="cx">                                 A1D793011B43864B004516F5 /* IntlNumberFormatPrototype.h in Headers */,
</span><span class="cx">                                 A125846F1B45A36000CC7F6C /* IntlNumberFormatPrototype.lut.h in Headers */,
</span><span class="cx">                                 A12BBFF21B044A8B00664B69 /* IntlObject.h in Headers */,
</span><del>-                                0F1FB3971E1AF7E300A9BE50 /* DFGWorklistInlines.h in Headers */,
</del><span class="cx">                                 708EBE241CE8F35800453146 /* IntlObjectInlines.h in Headers */,
</span><span class="cx">                                 860BD801148EA6F200112B2F /* Intrinsic.h in Headers */,
</span><span class="cx">                                 8B9F6D561D5912FA001C739F /* IterationKind.h in Headers */,
</span><span class="lines">@@ -8600,7 +8599,6 @@
</span><span class="cx">                                 FE187A021BFBE5610038BBCA /* JITMulGenerator.h in Headers */,
</span><span class="cx">                                 FE99B2491C24C3D300C82159 /* JITNegGenerator.h in Headers */,
</span><span class="cx">                                 0F24E54D17EE274900ABB217 /* JITOperations.h in Headers */,
</span><del>-                                0F7DF1371E2970E10095951B /* Subspace.h in Headers */,
</del><span class="cx">                                 FE3A06C01C11041A00390FDD /* JITRightShiftGenerator.h in Headers */,
</span><span class="cx">                                 0F766D3115AA8112008F363E /* JITStubRoutine.h in Headers */,
</span><span class="cx">                                 0F766D2C15A8CC3A008F363E /* JITStubRoutineSet.h in Headers */,
</span><span class="lines">@@ -8646,6 +8644,7 @@
</span><span class="cx">                                 996B731C1BDA08DD00331B84 /* JSDataViewPrototype.lut.h in Headers */,
</span><span class="cx">                                 978801411471AD920041B016 /* JSDateMath.h in Headers */,
</span><span class="cx">                                 C2A7F688160432D400F76B98 /* JSDestructibleObject.h in Headers */,
</span><ins>+                                0F7DF13C1E2971130095951B /* JSDestructibleObjectSubspace.h in Headers */,
</ins><span class="cx">                                 FE384EE61ADDB7AD0055DE2C /* JSDollarVM.h in Headers */,
</span><span class="cx">                                 FE384EE81ADDB7AD0055DE2C /* JSDollarVMPrototype.h in Headers */,
</span><span class="cx">                                 BC18C42D0E16F5CD00B34460 /* JSEnvironmentRecord.h in Headers */,
</span><span class="lines">@@ -8655,9 +8654,7 @@
</span><span class="cx">                                 0F2B66EF17B6B5AB00A7AE3F /* JSFloat32Array.h in Headers */,
</span><span class="cx">                                 0F2B66F017B6B5AB00A7AE3F /* JSFloat64Array.h in Headers */,
</span><span class="cx">                                 BC18C41F0E16F5CD00B34460 /* JSFunction.h in Headers */,
</span><del>-                                0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */,
</del><span class="cx">                                 A72028BA1797603D0098028C /* JSFunctionInlines.h in Headers */,
</span><del>-                                0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */,
</del><span class="cx">                                 70B7919C1C024A49002481E2 /* JSGeneratorFunction.h in Headers */,
</span><span class="cx">                                 0F2B66F117B6B5AB00A7AE3F /* JSGenericTypedArrayView.h in Headers */,
</span><span class="cx">                                 0F2B66F217B6B5AB00A7AE3F /* JSGenericTypedArrayViewConstructor.h in Headers */,
</span><span class="lines">@@ -8718,7 +8715,6 @@
</span><span class="cx">                                 7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */,
</span><span class="cx">                                 996B731F1BDA08EF00331B84 /* JSPromisePrototype.lut.h in Headers */,
</span><span class="cx">                                 2A05ABD61961DF2400341750 /* JSPropertyNameEnumerator.h in Headers */,
</span><del>-                                0F7DF13C1E2971130095951B /* JSDestructibleObjectSubspace.h in Headers */,
</del><span class="cx">                                 E3EF88751B66DF23003F26CB /* JSPropertyNameIterator.h in Headers */,
</span><span class="cx">                                 862553D216136E1A009F17D0 /* JSProxy.h in Headers */,
</span><span class="cx">                                 A552C3801ADDB8FE00139726 /* JSRemoteInspector.h in Headers */,
</span><span class="lines">@@ -8725,11 +8721,13 @@
</span><span class="cx">                                 9928FF3C18AC4AEC00B8CF12 /* JSReplayInputs.h in Headers */,
</span><span class="cx">                                 BC18C4260E16F5CD00B34460 /* JSRetainPtr.h in Headers */,
</span><span class="cx">                                 14874AE615EBDE4A002E3587 /* JSScope.h in Headers */,
</span><ins>+                                9064337DD4B0402BAF34A592 /* JSScriptFetcher.h in Headers */,
</ins><span class="cx">                                 A7C0C4AC168103020017011D /* JSScriptRefPrivate.h in Headers */,
</span><span class="cx">                                 0F919D11157F332C004A4E7D /* JSSegmentedVariableObject.h in Headers */,
</span><ins>+                                0F4F82881E2FFDE00075184C /* JSSegmentedVariableObjectSubspace.h in Headers */,
</ins><span class="cx">                                 A7299D9E17D12837005F5FF9 /* JSSet.h in Headers */,
</span><del>-                                0F7DF1341E2970D70095951B /* ConstraintVolatility.h in Headers */,
</del><span class="cx">                                 A790DD70182F499700588807 /* JSSetIterator.h in Headers */,
</span><ins>+                                BDFCB2BBE90F41349E1B0BED /* JSSourceCode.h in Headers */,
</ins><span class="cx">                                 BC18C4270E16F5CD00B34460 /* JSString.h in Headers */,
</span><span class="cx">                                 86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */,
</span><span class="cx">                                 FEFD6FC61D5E7992008F2F0B /* JSStringInlines.h in Headers */,
</span><span class="lines">@@ -8738,6 +8736,7 @@
</span><span class="cx">                                 BC18C4280E16F5CD00B34460 /* JSStringRef.h in Headers */,
</span><span class="cx">                                 BC18C4290E16F5CD00B34460 /* JSStringRefCF.h in Headers */,
</span><span class="cx">                                 1A28D4A8177B71C80007FA3C /* JSStringRefPrivate.h in Headers */,
</span><ins>+                                0F7DF13F1E2AFC4D0095951B /* JSStringSubspace.h in Headers */,
</ins><span class="cx">                                 0F919D0D157EE0A2004A4E7D /* JSSymbolTableObject.h in Headers */,
</span><span class="cx">                                 70ECA6061AFDBEA200449739 /* JSTemplateRegistryKey.h in Headers */,
</span><span class="cx">                                 BC18C42A0E16F5CD00B34460 /* JSType.h in Headers */,
</span><span class="lines">@@ -8766,6 +8765,7 @@
</span><span class="cx">                                 AD2FCBE31DB58DAD00B3E736 /* JSWebAssemblyCompileError.h in Headers */,
</span><span class="cx">                                 796FB43A1DFF8C3F0039C95D /* JSWebAssemblyHelpers.h in Headers */,
</span><span class="cx">                                 AD2FCBE51DB58DAD00B3E736 /* JSWebAssemblyInstance.h in Headers */,
</span><ins>+                                ADE802991E08F1DE0058DE78 /* JSWebAssemblyLinkError.h in Headers */,
</ins><span class="cx">                                 AD2FCBE71DB58DAD00B3E736 /* JSWebAssemblyMemory.h in Headers */,
</span><span class="cx">                                 AD2FCC051DB58DAD00B3E736 /* JSWebAssemblyModule.h in Headers */,
</span><span class="cx">                                 AD2FCBE91DB58DAD00B3E736 /* JSWebAssemblyRuntimeError.h in Headers */,
</span><span class="lines">@@ -8772,7 +8772,6 @@
</span><span class="cx">                                 AD2FCBEB1DB58DAD00B3E736 /* JSWebAssemblyTable.h in Headers */,
</span><span class="cx">                                 1442566215EDE98D0066A49B /* JSWithScope.h in Headers */,
</span><span class="cx">                                 86E3C619167BABEE006D760A /* JSWrapperMap.h in Headers */,
</span><del>-                                0F1FB38F1E173A6700A9BE50 /* SynchronousStopTheWorldMutatorScheduler.h in Headers */,
</del><span class="cx">                                 BC18C42E0E16F5CD00B34460 /* JSWrapperObject.h in Headers */,
</span><span class="cx">                                 BCFD8C930EEB2EE700283848 /* JumpTable.h in Headers */,
</span><span class="cx">                                 A72FFD64139985A800E5365A /* KeywordLookup.h in Headers */,
</span><span class="lines">@@ -8818,7 +8817,6 @@
</span><span class="cx">                                 863B23E00FC6118900703AA4 /* MacroAssemblerCodeRef.h in Headers */,
</span><span class="cx">                                 E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */,
</span><span class="cx">                                 86C568E111A213EE0007F7F0 /* MacroAssemblerMIPS.h in Headers */,
</span><del>-                                0F1FB3961E1AF7E100A9BE50 /* DFGPlanInlines.h in Headers */,
</del><span class="cx">                                 FE68C6371B90DE040042BCB3 /* MacroAssemblerPrinter.h in Headers */,
</span><span class="cx">                                 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */,
</span><span class="cx">                                 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */,
</span><span class="lines">@@ -8828,10 +8826,14 @@
</span><span class="cx">                                 A74DEF94182D991400522C22 /* MapIteratorPrototype.h in Headers */,
</span><span class="cx">                                 A700873E17CBE8D300C3E643 /* MapPrototype.h in Headers */,
</span><span class="cx">                                 C2B916C214DA014E00CBAC86 /* MarkedAllocator.h in Headers */,
</span><ins>+                                0F7DF1461E2BEF6A0095951B /* MarkedAllocatorInlines.h in Headers */,
</ins><span class="cx">                                 142D6F0913539A2800B02E86 /* MarkedBlock.h in Headers */,
</span><span class="cx">                                 0F7C5FB81D888A0C0044F5E2 /* MarkedBlockInlines.h in Headers */,
</span><span class="cx">                                 141448CB13A176EC00F5BA1A /* MarkedBlockSet.h in Headers */,
</span><span class="cx">                                 14D2F3DB139F4BE200491031 /* MarkedSpace.h in Headers */,
</span><ins>+                                0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */,
+                                0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */,
+                                0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */,
</ins><span class="cx">                                 142D6F1213539A4100B02E86 /* MarkStack.h in Headers */,
</span><span class="cx">                                 8612E4CD152389EC00C836BE /* MatchResult.h in Headers */,
</span><span class="cx">                                 4340A4851A9051AF00D73CCA /* MathCommon.h in Headers */,
</span><span class="lines">@@ -8839,7 +8841,6 @@
</span><span class="cx">                                 E328C6C71DA4304500D255FD /* MaxFrameExtentForSlowPathCall.h in Headers */,
</span><span class="cx">                                 90213E3E123A40C200D422F3 /* MemoryStatistics.h in Headers */,
</span><span class="cx">                                 0FB5467B14F5C7E1002C2989 /* MethodOfGettingAValueProfile.h in Headers */,
</span><del>-                                ADE8029C1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.h in Headers */,
</del><span class="cx">                                 7C008CE7187631B600955C24 /* Microtask.h in Headers */,
</span><span class="cx">                                 86C568E211A213EE0007F7F0 /* MIPSAssembler.h in Headers */,
</span><span class="cx">                                 C4703CD7192844CC0013FBEA /* models.py in Headers */,
</span><span class="lines">@@ -8849,6 +8850,7 @@
</span><span class="cx">                                 14AD910F1DCA92940014F9FE /* ModuleProgramCodeBlock.h in Headers */,
</span><span class="cx">                                 147341D61DC02EB900AA29BA /* ModuleProgramExecutable.h in Headers */,
</span><span class="cx">                                 A79D3ED9C5064DD0A8466A3A /* ModuleScopeData.h in Headers */,
</span><ins>+                                0F1FB3991E1F65FB00A9BE50 /* MutatorScheduler.h in Headers */,
</ins><span class="cx">                                 0FA762071DB9243300B7A2FD /* MutatorState.h in Headers */,
</span><span class="cx">                                 BC02E9110E1839DB000F9297 /* NativeErrorConstructor.h in Headers */,
</span><span class="cx">                                 BC02E9130E1839DB000F9297 /* NativeErrorPrototype.h in Headers */,
</span><span class="lines">@@ -8978,6 +8980,7 @@
</span><span class="cx">                                 A503FA22188EFF6800110F14 /* ScriptDebugListener.h in Headers */,
</span><span class="cx">                                 A503FA26188EFFFD00110F14 /* ScriptDebugServer.h in Headers */,
</span><span class="cx">                                 147341CE1DC02D7900AA29BA /* ScriptExecutable.h in Headers */,
</span><ins>+                                CEAE7D7B889B477BA93ABA6C /* ScriptFetcher.h in Headers */,
</ins><span class="cx">                                 A55D93A6185012A800400DED /* ScriptFunctionCall.h in Headers */,
</span><span class="cx">                                 A54CF2FA184EAEDA00237F19 /* ScriptObject.h in Headers */,
</span><span class="cx">                                 A55165D51BDF135A003B75C1 /* ScriptProfilingScope.h in Headers */,
</span><span class="lines">@@ -8997,6 +9000,7 @@
</span><span class="cx">                                 FE187A0F1C030D6C0038BBCA /* SnippetOperand.h in Headers */,
</span><span class="cx">                                 14201D591DECF26A00904BD3 /* SourceCode.h in Headers */,
</span><span class="cx">                                 70B791911C024A13002481E2 /* SourceCodeKey.h in Headers */,
</span><ins>+                                2D342F36F7244096804ADB24 /* SourceOrigin.h in Headers */,
</ins><span class="cx">                                 BC18C4630E16F5CD00B34460 /* SourceProvider.h in Headers */,
</span><span class="cx">                                 E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */,
</span><span class="cx">                                 E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */,
</span><span class="lines">@@ -9011,6 +9015,7 @@
</span><span class="cx">                                 A7C1EAF217987AB600299DB2 /* StackVisitor.h in Headers */,
</span><span class="cx">                                 14DF04DA16B3996D0016A513 /* StaticPropertyAnalysis.h in Headers */,
</span><span class="cx">                                 14CA958B16AB50DE00938A06 /* StaticPropertyAnalyzer.h in Headers */,
</span><ins>+                                0F4F828C1E31B9760075184C /* StochasticSpaceTimeMutatorScheduler.h in Headers */,
</ins><span class="cx">                                 0F7CF9521DC027D90098CC12 /* StopIfNecessaryTimer.h in Headers */,
</span><span class="cx">                                 A730B6121250068F009D25B1 /* StrictEvalActivation.h in Headers */,
</span><span class="cx">                                 BC18C4660E16F5CD00B34460 /* StringConstructor.h in Headers */,
</span><span class="lines">@@ -9032,8 +9037,9 @@
</span><span class="cx">                                 0F766D3915AE4A1F008F363E /* StructureStubClearingWatchpoint.h in Headers */,
</span><span class="cx">                                 BCCF0D080EF0AAB900413C8F /* StructureStubInfo.h in Headers */,
</span><span class="cx">                                 BC9041480EB9250900FE26FA /* StructureTransitionTable.h in Headers */,
</span><ins>+                                0F7DF1371E2970E10095951B /* Subspace.h in Headers */,
+                                0F7DF1381E2970E40095951B /* SubspaceInlines.h in Headers */,
</ins><span class="cx">                                 0F4A38FA1C8E13DF00190318 /* SuperSampler.h in Headers */,
</span><del>-                                0F1FB3991E1F65FB00A9BE50 /* MutatorScheduler.h in Headers */,
</del><span class="cx">                                 705B41AC1A6E501E00716757 /* Symbol.h in Headers */,
</span><span class="cx">                                 705B41AE1A6E501E00716757 /* SymbolConstructor.h in Headers */,
</span><span class="cx">                                 996B73271BDA08EF00331B84 /* SymbolConstructor.lut.h in Headers */,
</span><span class="lines">@@ -9041,6 +9047,7 @@
</span><span class="cx">                                 705B41B21A6E501E00716757 /* SymbolPrototype.h in Headers */,
</span><span class="cx">                                 996B73281BDA08EF00331B84 /* SymbolPrototype.lut.h in Headers */,
</span><span class="cx">                                 BC18C46B0E16F5CD00B34460 /* SymbolTable.h in Headers */,
</span><ins>+                                0F1FB38F1E173A6700A9BE50 /* SynchronousStopTheWorldMutatorScheduler.h in Headers */,
</ins><span class="cx">                                 A784A26411D16622005776AC /* SyntaxChecker.h in Headers */,
</span><span class="cx">                                 DC7997831CDE9FA0004D4A09 /* TagRegistersMode.h in Headers */,
</span><span class="cx">                                 70ECA6081AFDBEA200449739 /* TemplateRegistry.h in Headers */,
</span><span class="lines">@@ -9096,6 +9103,7 @@
</span><span class="cx">                                 0F6C73511AC9F99F00BE1682 /* VariableWriteFireDetail.h in Headers */,
</span><span class="cx">                                 0FE0502D1AA9095600D33B33 /* VarOffset.h in Headers */,
</span><span class="cx">                                 0F426A491460CBB700131F8F /* VirtualRegister.h in Headers */,
</span><ins>+                                0F1FB3931E177A7200A9BE50 /* VisitingTimeout.h in Headers */,
</ins><span class="cx">                                 0F952AA11DF7860900E06FBD /* VisitRaceKey.h in Headers */,
</span><span class="cx">                                 BC18C4200E16F5CD00B34460 /* VM.h in Headers */,
</span><span class="cx">                                 658D3A5619638268003C45D6 /* VMEntryRecord.h in Headers */,
</span><span class="lines">@@ -9104,6 +9112,7 @@
</span><span class="cx">                                 53F40E931D5A4AB30099A1B6 /* WasmB3IRGenerator.h in Headers */,
</span><span class="cx">                                 AD4B1DFA1DF244E20071AE32 /* WasmBinding.h in Headers */,
</span><span class="cx">                                 53FD04D41D7AB291003287D3 /* WasmCallingConvention.h in Headers */,
</span><ins>+                                79DAE27A1E03C82200B526AA /* WasmExceptionType.h in Headers */,
</ins><span class="cx">                                 7BC547D31B6959A100959B58 /* WasmFormat.h in Headers */,
</span><span class="cx">                                 53F40E8B1D5901BB0099A1B6 /* WasmFunctionParser.h in Headers */,
</span><span class="cx">                                 535557141D9D9EA5006D583B /* WasmMemory.h in Headers */,
</span><span class="lines">@@ -9114,6 +9123,7 @@
</span><span class="cx">                                 53F40E8D1D5901F20099A1B6 /* WasmParser.h in Headers */,
</span><span class="cx">                                 531374BD1D5CE67600AF7A0B /* WasmPlan.h in Headers */,
</span><span class="cx">                                 53F40E851D58F9770099A1B6 /* WasmSections.h in Headers */,
</span><ins>+                                AD7438C01E0457A400FD0C2A /* WasmSignature.h in Headers */,
</ins><span class="cx">                                 53FF7F991DBFCD9000A26CCC /* WasmValidate.h in Headers */,
</span><span class="cx">                                 FED94F2F171E3E2300BE77A4 /* Watchdog.h in Headers */,
</span><span class="cx">                                 0F919D2615853CE3004A4E7D /* Watchpoint.h in Headers */,
</span><span class="lines">@@ -9141,6 +9151,8 @@
</span><span class="cx">                                 AD2FCC181DB59CB200B3E736 /* WebAssemblyInstanceConstructor.lut.h in Headers */,
</span><span class="cx">                                 AD2FCBF31DB58DAD00B3E736 /* WebAssemblyInstancePrototype.h in Headers */,
</span><span class="cx">                                 AD2FCC191DB59CB200B3E736 /* WebAssemblyInstancePrototype.lut.h in Headers */,
</span><ins>+                                ADE8029A1E08F1DE0058DE78 /* WebAssemblyLinkErrorConstructor.h in Headers */,
+                                ADE8029C1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.h in Headers */,
</ins><span class="cx">                                 AD2FCBF51DB58DAD00B3E736 /* WebAssemblyMemoryConstructor.h in Headers */,
</span><span class="cx">                                 AD2FCC1A1DB59CB200B3E736 /* WebAssemblyMemoryConstructor.lut.h in Headers */,
</span><span class="cx">                                 AD2FCBF71DB58DAD00B3E736 /* WebAssemblyMemoryPrototype.h in Headers */,
</span><span class="lines">@@ -9172,10 +9184,6 @@
</span><span class="cx">                                 86704B8812DBA33700A9FE7B /* YarrParser.h in Headers */,
</span><span class="cx">                                 86704B8A12DBA33700A9FE7B /* YarrPattern.h in Headers */,
</span><span class="cx">                                 86704B4312DB8A8100A9FE7B /* YarrSyntaxChecker.h in Headers */,
</span><del>-                                2D342F36F7244096804ADB24 /* SourceOrigin.h in Headers */,
-                                BDFCB2BBE90F41349E1B0BED /* JSSourceCode.h in Headers */,
-                                9064337DD4B0402BAF34A592 /* JSScriptFetcher.h in Headers */,
-                                CEAE7D7B889B477BA93ABA6C /* ScriptFetcher.h in Headers */,
</del><span class="cx">                         );
</span><span class="cx">                         runOnlyForDeploymentPostprocessing = 0;
</span><span class="cx">                 };
</span><span class="lines">@@ -9727,6 +9735,7 @@
</span><span class="cx">                                 0F24E54017EA9F5900ABB217 /* AssemblyHelpers.cpp in Sources */,
</span><span class="cx">                                 5B70CFE31DB69E6600EC23F9 /* AsyncFunctionConstructor.cpp in Sources */,
</span><span class="cx">                                 5B70CFE11DB69E6600EC23F9 /* AsyncFunctionPrototype.cpp in Sources */,
</span><ins>+                                6A38CFA91E32B5AB0060206F /* AsyncStackTrace.cpp in Sources */,
</ins><span class="cx">                                 0F7CF9561DC1258D0098CC12 /* AtomicsObject.cpp in Sources */,
</span><span class="cx">                                 0FEC84FE1BDACDAC0080FF74 /* B3ArgumentRegValue.cpp in Sources */,
</span><span class="cx">                                 0FEC85001BDACDAC0080FF74 /* B3BasicBlock.cpp in Sources */,
</span><span class="lines">@@ -9739,6 +9748,7 @@
</span><span class="cx">                                 0FEC85091BDACDAC0080FF74 /* B3Common.cpp in Sources */,
</span><span class="cx">                                 0FEC850B1BDACDAC0080FF74 /* B3Commutativity.cpp in Sources */,
</span><span class="cx">                                 0F338E0B1BF0276C0013C88F /* B3Compilation.cpp in Sources */,
</span><ins>+                                795F099D1E03600500BBE37F /* B3Compile.cpp in Sources */,
</ins><span class="cx">                                 0FEC850D1BDACDAC0080FF74 /* B3Const32Value.cpp in Sources */,
</span><span class="cx">                                 0FEC850F1BDACDAC0080FF74 /* B3Const64Value.cpp in Sources */,
</span><span class="cx">                                 0FEC85111BDACDAC0080FF74 /* B3ConstDoubleValue.cpp in Sources */,
</span><span class="lines">@@ -9800,8 +9810,6 @@
</span><span class="cx">                                 0F64B2711A784BAF006E4E66 /* BinarySwitch.cpp in Sources */,
</span><span class="cx">                                 14280863107EC11A0013E7B2 /* BooleanConstructor.cpp in Sources */,
</span><span class="cx">                                 14280864107EC11A0013E7B2 /* BooleanObject.cpp in Sources */,
</span><del>-                                0F4F82871E2FFDDD0075184C /* JSSegmentedVariableObjectSubspace.cpp in Sources */,
-                                ADB6F67D1E15D7600082F384 /* WasmPageCount.cpp in Sources */,
</del><span class="cx">                                 14280865107EC11A0013E7B2 /* BooleanPrototype.cpp in Sources */,
</span><span class="cx">                                 DE26E9071CB5DEFB00D2BE82 /* BuiltinExecutableCreator.cpp in Sources */,
</span><span class="cx">                                 A7D801A41880D66E0026C39B /* BuiltinExecutables.cpp in Sources */,
</span><span class="lines">@@ -9846,7 +9854,6 @@
</span><span class="cx">                                 A7E5A3A71797432D00E893C0 /* CompilationResult.cpp in Sources */,
</span><span class="cx">                                 147F39C2107EC37600427A48 /* Completion.cpp in Sources */,
</span><span class="cx">                                 0F6FC750196110A800E1D02D /* ComplexGetStatus.cpp in Sources */,
</span><del>-                                0F1FB38E1E173A6500A9BE50 /* SynchronousStopTheWorldMutatorScheduler.cpp in Sources */,
</del><span class="cx">                                 146B16D812EB5B59001BEC1B /* ConservativeRoots.cpp in Sources */,
</span><span class="cx">                                 A5B6A74D18C6DBA600F11E91 /* ConsoleClient.cpp in Sources */,
</span><span class="cx">                                 A5FD0079189B051000633231 /* ConsoleMessage.cpp in Sources */,
</span><span class="lines">@@ -9862,7 +9869,6 @@
</span><span class="cx">                                 147F39C4107EC37600427A48 /* DateConversion.cpp in Sources */,
</span><span class="cx">                                 147F39C5107EC37600427A48 /* DateInstance.cpp in Sources */,
</span><span class="cx">                                 147F39C6107EC37600427A48 /* DatePrototype.cpp in Sources */,
</span><del>-                                0F660E391E0517BF0031462C /* MarkingConstraintSet.cpp in Sources */,
</del><span class="cx">                                 14280823107EC02C0013E7B2 /* Debugger.cpp in Sources */,
</span><span class="cx">                                 149559EE0DDCDDF700648087 /* DebuggerCallFrame.cpp in Sources */,
</span><span class="cx">                                 A5FC84B31D1DDAD9006B5C46 /* DebuggerLocation.cpp in Sources */,
</span><span class="lines">@@ -9944,7 +9950,6 @@
</span><span class="cx">                                 A7D89CFB17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.cpp in Sources */,
</span><span class="cx">                                 0FF0F19916B729F6005DF95B /* DFGLongLivedState.cpp in Sources */,
</span><span class="cx">                                 A767B5B517A0B9650063D940 /* DFGLoopPreHeaderCreationPhase.cpp in Sources */,
</span><del>-                                ADE8029E1E08F2280058DE78 /* WebAssemblyLinkErrorConstructor.cpp in Sources */,
</del><span class="cx">                                 79F8FC1E1B9FED0F00CA66AB /* DFGMaximalFlushInsertionPhase.cpp in Sources */,
</span><span class="cx">                                 0F5874ED194FEB1200AAB2C1 /* DFGMayExit.cpp in Sources */,
</span><span class="cx">                                 0F1725FF1B48719A00AC3A55 /* DFGMinifiedGraph.cpp in Sources */,
</span><span class="lines">@@ -9983,7 +9988,6 @@
</span><span class="cx">                                 0FB17662196B8F9E0091052A /* DFGPureValue.cpp in Sources */,
</span><span class="cx">                                 0F3A1BF91A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp in Sources */,
</span><span class="cx">                                 0F2FCCFB18A60070001A27F8 /* DFGSafepoint.cpp in Sources */,
</span><del>-                                795F099D1E03600500BBE37F /* B3Compile.cpp in Sources */,
</del><span class="cx">                                 86EC9DD21328DF82002B2AD7 /* DFGSpeculativeJIT.cpp in Sources */,
</span><span class="cx">                                 86880F1F14328BB900B08D42 /* DFGSpeculativeJIT32_64.cpp in Sources */,
</span><span class="cx">                                 86880F4D14353B2100B08D42 /* DFGSpeculativeJIT64.cpp in Sources */,
</span><span class="lines">@@ -9995,12 +9999,10 @@
</span><span class="cx">                                 0F7F988B1D9596C500F4F12E /* DFGStoreBarrierClusteringPhase.cpp in Sources */,
</span><span class="cx">                                 0F9E32631B05AB0400801ED5 /* DFGStoreBarrierInsertionPhase.cpp in Sources */,
</span><span class="cx">                                 0FC20CB51852E2C600C9E954 /* DFGStrengthReductionPhase.cpp in Sources */,
</span><del>-                                0F7DF13B1E2971110095951B /* JSDestructibleObjectSubspace.cpp in Sources */,
</del><span class="cx">                                 0F893BDB1936E23C001211F4 /* DFGStructureAbstractValue.cpp in Sources */,
</span><span class="cx">                                 0F2FCCFE18A60070001A27F8 /* DFGThreadData.cpp in Sources */,
</span><span class="cx">                                 0FC097A1146B28CA00CF2442 /* DFGThunks.cpp in Sources */,
</span><span class="cx">                                 0FD8A32717D51F5700CA2C40 /* DFGTierUpCheckInjectionPhase.cpp in Sources */,
</span><del>-                                0F4F828B1E31B9740075184C /* StochasticSpaceTimeMutatorScheduler.cpp in Sources */,
</del><span class="cx">                                 0FD8A32917D51F5700CA2C40 /* DFGToFTLDeferredCompilationCallback.cpp in Sources */,
</span><span class="cx">                                 0FD8A32B17D51F5700CA2C40 /* DFGToFTLForOSREntryDeferredCompilationCallback.cpp in Sources */,
</span><span class="cx">                                 0FE7211D193B9C590031F6ED /* DFGTransition.cpp in Sources */,
</span><span class="lines">@@ -10207,7 +10209,6 @@
</span><span class="cx">                                 5B70CFDF1DB69E6600EC23F9 /* JSAsyncFunction.cpp in Sources */,
</span><span class="cx">                                 1421359B0A677F4F00A8195E /* JSBase.cpp in Sources */,
</span><span class="cx">                                 86FA9E91142BBB2E001773B7 /* JSBoundFunction.cpp in Sources */,
</span><del>-                                0F7DF1401E2AFC500095951B /* JSStringSubspace.cpp in Sources */,
</del><span class="cx">                                 1440F8AF0A508D200005F061 /* JSCallbackConstructor.cpp in Sources */,
</span><span class="cx">                                 1440F8920A508B100005F061 /* JSCallbackFunction.cpp in Sources */,
</span><span class="cx">                                 14ABDF600A437FEF00ECCA01 /* JSCallbackObject.cpp in Sources */,
</span><span class="lines">@@ -10223,6 +10224,7 @@
</span><span class="cx">                                 0F2B66EB17B6B5AB00A7AE3F /* JSDataView.cpp in Sources */,
</span><span class="cx">                                 0F2B66ED17B6B5AB00A7AE3F /* JSDataViewPrototype.cpp in Sources */,
</span><span class="cx">                                 978801401471AD920041B016 /* JSDateMath.cpp in Sources */,
</span><ins>+                                0F7DF13B1E2971110095951B /* JSDestructibleObjectSubspace.cpp in Sources */,
</ins><span class="cx">                                 FE384EE51ADDB7AD0055DE2C /* JSDollarVM.cpp in Sources */,
</span><span class="cx">                                 FE384EE71ADDB7AD0055DE2C /* JSDollarVMPrototype.cpp in Sources */,
</span><span class="cx">                                 147F39D7107EC37600427A48 /* JSEnvironmentRecord.cpp in Sources */,
</span><span class="lines">@@ -10235,8 +10237,6 @@
</span><span class="cx">                                 A5C3A1A518C0490200C9593A /* JSGlobalObjectConsoleClient.cpp in Sources */,
</span><span class="cx">                                 A59455921824744700CC3843 /* JSGlobalObjectDebuggable.cpp in Sources */,
</span><span class="cx">                                 A57D23E91891B0770031C7FA /* JSGlobalObjectDebuggerAgent.cpp in Sources */,
</span><del>-                                0F7DF1361E2970DF0095951B /* Subspace.cpp in Sources */,
-                                ADE8029B1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.cpp in Sources */,
</del><span class="cx">                                 14E9D17B107EC469004DDA21 /* JSGlobalObjectFunctions.cpp in Sources */,
</span><span class="cx">                                 A51007C0187CC3C600B38879 /* JSGlobalObjectInspectorController.cpp in Sources */,
</span><span class="cx">                                 A50E4B6318809DD50068A46D /* JSGlobalObjectRuntimeAgent.cpp in Sources */,
</span><span class="lines">@@ -10273,15 +10273,19 @@
</span><span class="cx">                                 A552C37F1ADDB8FE00139726 /* JSRemoteInspector.cpp in Sources */,
</span><span class="cx">                                 9928FF3B18AC4AEC00B8CF12 /* JSReplayInputs.cpp in Sources */,
</span><span class="cx">                                 14874AE515EBDE4A002E3587 /* JSScope.cpp in Sources */,
</span><ins>+                                14815F5F991C46BEB98D0016 /* JSScriptFetcher.cpp in Sources */,
</ins><span class="cx">                                 A7C0C4AD1681067E0017011D /* JSScriptRef.cpp in Sources */,
</span><span class="cx">                                 0F919D10157F3329004A4E7D /* JSSegmentedVariableObject.cpp in Sources */,
</span><ins>+                                0F4F82871E2FFDDD0075184C /* JSSegmentedVariableObjectSubspace.cpp in Sources */,
</ins><span class="cx">                                 A7299D9D17D12837005F5FF9 /* JSSet.cpp in Sources */,
</span><span class="cx">                                 A790DD6F182F499700588807 /* JSSetIterator.cpp in Sources */,
</span><ins>+                                FA3AB211C8494524AB390267 /* JSSourceCode.cpp in Sources */,
</ins><span class="cx">                                 147F39D5107EC37600427A48 /* JSString.cpp in Sources */,
</span><span class="cx">                                 70EC0EC21AA0D7DA00B6AAFA /* JSStringIterator.cpp in Sources */,
</span><span class="cx">                                 2600B5A6152BAAA70091EE5F /* JSStringJoiner.cpp in Sources */,
</span><span class="cx">                                 1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */,
</span><span class="cx">                                 146AAB380B66A94400E55F16 /* JSStringRefCF.cpp in Sources */,
</span><ins>+                                0F7DF1401E2AFC500095951B /* JSStringSubspace.cpp in Sources */,
</ins><span class="cx">                                 0F919D0C157EE09F004A4E7D /* JSSymbolTableObject.cpp in Sources */,
</span><span class="cx">                                 70ECA6051AFDBEA200449739 /* JSTemplateRegistryKey.cpp in Sources */,
</span><span class="cx">                                 53486BBB1C18E84500F6F3AF /* JSTypedArray.cpp in Sources */,
</span><span class="lines">@@ -10340,6 +10344,8 @@
</span><span class="cx">                                 C2B916C514DA040C00CBAC86 /* MarkedAllocator.cpp in Sources */,
</span><span class="cx">                                 142D6F0813539A2800B02E86 /* MarkedBlock.cpp in Sources */,
</span><span class="cx">                                 14D2F3DA139F4BE200491031 /* MarkedSpace.cpp in Sources */,
</span><ins>+                                0F660E371E0517B90031462C /* MarkingConstraint.cpp in Sources */,
+                                0F660E391E0517BF0031462C /* MarkingConstraintSet.cpp in Sources */,
</ins><span class="cx">                                 142D6F1113539A4100B02E86 /* MarkStack.cpp in Sources */,
</span><span class="cx">                                 DC69AA661CF7A1F200C6272F /* MatchResult.cpp in Sources */,
</span><span class="cx">                                 4340A4841A9051AF00D73CCA /* MathCommon.cpp in Sources */,
</span><span class="lines">@@ -10350,6 +10356,7 @@
</span><span class="cx">                                 E355F3521B7DC85300C50DC5 /* ModuleLoaderPrototype.cpp in Sources */,
</span><span class="cx">                                 14AD91181DCA97FD0014F9FE /* ModuleProgramCodeBlock.cpp in Sources */,
</span><span class="cx">                                 147341E41DC2CE9600AA29BA /* ModuleProgramExecutable.cpp in Sources */,
</span><ins>+                                0F1FB3901E173A6B00A9BE50 /* MutatorScheduler.cpp in Sources */,
</ins><span class="cx">                                 0FA762061DB9243100B7A2FD /* MutatorState.cpp in Sources */,
</span><span class="cx">                                 14469DE0107EC7E700650446 /* NativeErrorConstructor.cpp in Sources */,
</span><span class="cx">                                 14469DE1107EC7E700650446 /* NativeErrorPrototype.cpp in Sources */,
</span><span class="lines">@@ -10461,11 +10468,11 @@
</span><span class="cx">                                 0FD82E86141F3FF100179C94 /* SpeculatedType.cpp in Sources */,
</span><span class="cx">                                 0F6DB7EA1D6124B800CDBF8E /* StackFrame.cpp in Sources */,
</span><span class="cx">                                 A7C1EAF117987AB600299DB2 /* StackVisitor.cpp in Sources */,
</span><ins>+                                0F4F828B1E31B9740075184C /* StochasticSpaceTimeMutatorScheduler.cpp in Sources */,
</ins><span class="cx">                                 0F7CF9531DC027DB0098CC12 /* StopIfNecessaryTimer.cpp in Sources */,
</span><span class="cx">                                 A730B6131250068F009D25B1 /* StrictEvalActivation.cpp in Sources */,
</span><span class="cx">                                 14469DEB107EC7E700650446 /* StringConstructor.cpp in Sources */,
</span><span class="cx">                                 70EC0EC61AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp in Sources */,
</span><del>-                                0F1FB3901E173A6B00A9BE50 /* MutatorScheduler.cpp in Sources */,
</del><span class="cx">                                 14469DEC107EC7E700650446 /* StringObject.cpp in Sources */,
</span><span class="cx">                                 14469DED107EC7E700650446 /* StringPrototype.cpp in Sources */,
</span><span class="cx">                                 9335F24D12E6765B002B5553 /* StringRecursionChecker.cpp in Sources */,
</span><span class="lines">@@ -10476,6 +10483,7 @@
</span><span class="cx">                                 0FB438A319270B1D00E1FBC9 /* StructureSet.cpp in Sources */,
</span><span class="cx">                                 0F766D3815AE4A1C008F363E /* StructureStubClearingWatchpoint.cpp in Sources */,
</span><span class="cx">                                 BCCF0D0C0EF0B8A500413C8F /* StructureStubInfo.cpp in Sources */,
</span><ins>+                                0F7DF1361E2970DF0095951B /* Subspace.cpp in Sources */,
</ins><span class="cx">                                 0F4A38F91C8E13DF00190318 /* SuperSampler.cpp in Sources */,
</span><span class="cx">                                 705B41AB1A6E501E00716757 /* Symbol.cpp in Sources */,
</span><span class="cx">                                 705B41AD1A6E501E00716757 /* SymbolConstructor.cpp in Sources */,
</span><span class="lines">@@ -10482,6 +10490,7 @@
</span><span class="cx">                                 705B41AF1A6E501E00716757 /* SymbolObject.cpp in Sources */,
</span><span class="cx">                                 705B41B11A6E501E00716757 /* SymbolPrototype.cpp in Sources */,
</span><span class="cx">                                 0F919D2815856773004A4E7D /* SymbolTable.cpp in Sources */,
</span><ins>+                                0F1FB38E1E173A6500A9BE50 /* SynchronousStopTheWorldMutatorScheduler.cpp in Sources */,
</ins><span class="cx">                                 DC7997841CDE9FA2004D4A09 /* TagRegistersMode.cpp in Sources */,
</span><span class="cx">                                 70ECA6071AFDBEA200449739 /* TemplateRegistry.cpp in Sources */,
</span><span class="cx">                                 78274D8E4C4D4FCD9A1DC6E6 /* TemplateRegistryKey.cpp in Sources */,
</span><span class="lines">@@ -10517,7 +10526,6 @@
</span><span class="cx">                                 0F24E55817F74EDB00ABB217 /* ValueRecovery.cpp in Sources */,
</span><span class="cx">                                 79EE0BFF1B4AFB85000385C9 /* VariableEnvironment.cpp in Sources */,
</span><span class="cx">                                 0F6C73501AC9F99F00BE1682 /* VariableWriteFireDetail.cpp in Sources */,
</span><del>-                                0F660E371E0517B90031462C /* MarkingConstraint.cpp in Sources */,
</del><span class="cx">                                 0FE0502C1AA9095600D33B33 /* VarOffset.cpp in Sources */,
</span><span class="cx">                                 0F20C2591A8013AB00DA3229 /* VirtualRegister.cpp in Sources */,
</span><span class="cx">                                 0F952AA21DF7860D00E06FBD /* VisitRaceKey.cpp in Sources */,
</span><span class="lines">@@ -10530,12 +10538,13 @@
</span><span class="cx">                                 535557161D9DFA32006D583B /* WasmMemory.cpp in Sources */,
</span><span class="cx">                                 79B759741DFA4C600052174C /* WasmMemoryInformation.cpp in Sources */,
</span><span class="cx">                                 53F40E971D5A7BEC0099A1B6 /* WasmModuleParser.cpp in Sources */,
</span><ins>+                                ADB6F67D1E15D7600082F384 /* WasmPageCount.cpp in Sources */,
</ins><span class="cx">                                 531374BF1D5CE95000AF7A0B /* WasmPlan.cpp in Sources */,
</span><ins>+                                AD7438C11E0457AA00FD0C2A /* WasmSignature.cpp in Sources */,
</ins><span class="cx">                                 53FF7F9B1DBFD2B900A26CCC /* WasmValidate.cpp in Sources */,
</span><span class="cx">                                 FED94F2E171E3E2300BE77A4 /* Watchdog.cpp in Sources */,
</span><span class="cx">                                 0F919D2515853CE0004A4E7D /* Watchpoint.cpp in Sources */,
</span><span class="cx">                                 1ACF7377171CA6FB00C9BB1E /* Weak.cpp in Sources */,
</span><del>-                                AD7438C11E0457AA00FD0C2A /* WasmSignature.cpp in Sources */,
</del><span class="cx">                                 14E84F9E14EE1ACC00D6D5D4 /* WeakBlock.cpp in Sources */,
</span><span class="cx">                                 14F7256514EE265E00B1652B /* WeakHandleOwner.cpp in Sources */,
</span><span class="cx">                                 A7CA3AE317DA41AE006538AF /* WeakMapConstructor.cpp in Sources */,
</span><span class="lines">@@ -10549,6 +10558,8 @@
</span><span class="cx">                                 AD4937D31DDD27DE0077C807 /* WebAssemblyFunction.cpp in Sources */,
</span><span class="cx">                                 AD2FCBF01DB58DAD00B3E736 /* WebAssemblyInstanceConstructor.cpp in Sources */,
</span><span class="cx">                                 AD2FCBF21DB58DAD00B3E736 /* WebAssemblyInstancePrototype.cpp in Sources */,
</span><ins>+                                ADE8029E1E08F2280058DE78 /* WebAssemblyLinkErrorConstructor.cpp in Sources */,
+                                ADE8029B1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.cpp in Sources */,
</ins><span class="cx">                                 AD2FCBF41DB58DAD00B3E736 /* WebAssemblyMemoryConstructor.cpp in Sources */,
</span><span class="cx">                                 AD2FCBF61DB58DAD00B3E736 /* WebAssemblyMemoryPrototype.cpp in Sources */,
</span><span class="cx">                                 AD2FCC001DB58DAD00B3E736 /* WebAssemblyModuleConstructor.cpp in Sources */,
</span><span class="lines">@@ -10568,8 +10579,6 @@
</span><span class="cx">                                 86704B8612DBA33700A9FE7B /* YarrJIT.cpp in Sources */,
</span><span class="cx">                                 86704B8912DBA33700A9FE7B /* YarrPattern.cpp in Sources */,
</span><span class="cx">                                 86704B4212DB8A8100A9FE7B /* YarrSyntaxChecker.cpp in Sources */,
</span><del>-                                FA3AB211C8494524AB390267 /* JSSourceCode.cpp in Sources */,
-                                14815F5F991C46BEB98D0016 /* JSScriptFetcher.cpp in Sources */,
</del><span class="cx">                         );
</span><span class="cx">                         runOnlyForDeploymentPostprocessing = 0;
</span><span class="cx">                 };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorAsyncStackTracecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.cpp (0 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.cpp        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -0,0 +1,198 @@
</span><ins>+/*
+ * Copyright (C) 2017 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. AND ITS CONTRIBUTORS ``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 ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;AsyncStackTrace.h&quot;
+
+#include &quot;InspectorValues.h&quot;
+#include &quot;ScriptCallStack.h&quot;
+
+namespace Inspector {
+
+RefPtr&lt;AsyncStackTrace&gt; AsyncStackTrace::create(RefPtr&lt;ScriptCallStack&gt; callStack, bool singleShot, RefPtr&lt;AsyncStackTrace&gt; parent)
+{
+    ASSERT(callStack &amp;&amp; callStack-&gt;size());
+    return adoptRef(*new AsyncStackTrace(WTFMove(callStack), singleShot, WTFMove(parent)));
+}
+
+AsyncStackTrace::AsyncStackTrace(RefPtr&lt;ScriptCallStack&gt; callStack, bool singleShot, RefPtr&lt;AsyncStackTrace&gt; parent)
+    : m_callStack(callStack)
+    , m_parent(parent)
+    , m_singleShot(singleShot)
+{
+    if (m_parent)
+        m_parent-&gt;m_childCount++;
+}
+
+AsyncStackTrace::~AsyncStackTrace()
+{
+    if (m_parent)
+        remove();
+    ASSERT(!m_childCount);
+}
+
+bool AsyncStackTrace::isPending() const
+{
+    return m_state == State::Pending;
+}
+
+bool AsyncStackTrace::isLocked() const
+{
+    return m_state == State::Pending || m_state == State::Active || m_childCount &gt; 1;
+}
+
+void AsyncStackTrace::willDispatchAsyncCall(size_t maxDepth)
+{
+    ASSERT(m_state == State::Pending);
+    m_state = State::Active;
+
+    truncate(maxDepth);
+}
+
+void AsyncStackTrace::didDispatchAsyncCall()
+{
+    ASSERT(m_state == State::Active || m_state == State::Canceled);
+
+    if (m_state == State::Active &amp;&amp; !m_singleShot) {
+        m_state = State::Pending;
+        return;
+    }
+
+    m_state = State::Dispatched;
+
+    if (!m_childCount)
+        remove();
+}
+
+void AsyncStackTrace::didCancelAsyncCall()
+{
+    if (m_state == State::Canceled)
+        return;
+
+    if (m_state == State::Pending &amp;&amp; !m_childCount)
+        remove();
+
+    m_state = State::Canceled;
+}
+
+RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; AsyncStackTrace::buildInspectorObject() const
+{
+    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; topStackTrace;
+    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; previousStackTrace;
+
+    auto* stackTrace = this;
+    while (stackTrace) {
+        auto callStack = stackTrace-&gt;m_callStack;
+        ASSERT(callStack &amp;&amp; callStack-&gt;size());
+
+        RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; protocolObject = Inspector::Protocol::Console::StackTrace::create()
+            .setCallFrames(callStack-&gt;buildInspectorArray())
+            .release();
+
+        if (stackTrace-&gt;m_truncated)
+            protocolObject-&gt;setTruncated(true);
+        if (callStack-&gt;at(0).isNative())
+            protocolObject-&gt;setTopCallFrameIsBoundary(true);
+
+        if (!topStackTrace)
+            topStackTrace = protocolObject;
+
+        if (previousStackTrace)
+            previousStackTrace-&gt;setParentStackTrace(protocolObject);
+
+        previousStackTrace = protocolObject;
+        stackTrace = stackTrace-&gt;m_parent.get();
+    }
+
+    return topStackTrace;
+}
+
+void AsyncStackTrace::truncate(size_t maxDepth)
+{
+    AsyncStackTrace* lastUnlockedAncestor = nullptr;
+    size_t depth = 0;
+
+    auto* newStackTraceRoot = this;
+    while (newStackTraceRoot) {
+        depth += newStackTraceRoot-&gt;m_callStack-&gt;size();
+        if (depth &gt;= maxDepth)
+            break;
+
+        auto* parent = newStackTraceRoot-&gt;m_parent.get();
+        if (!lastUnlockedAncestor &amp;&amp; parent &amp;&amp; parent-&gt;isLocked())
+            lastUnlockedAncestor = newStackTraceRoot;
+
+        newStackTraceRoot = parent;
+    }
+
+    if (!newStackTraceRoot || !newStackTraceRoot-&gt;m_parent)
+        return;
+
+    if (!lastUnlockedAncestor) {
+        // No locked nodes belong to the trace. The subtree at the new root
+        // is moved to a new tree, and marked as truncated if necessary.
+        newStackTraceRoot-&gt;m_truncated = true;
+        newStackTraceRoot-&gt;remove();
+        return;
+    }
+
+    // The new root has a locked descendent. Since truncating a stack trace
+    // cannot mutate locked nodes or their ancestors, a new tree is created by
+    // cloning the locked portion of the trace (the path from the locked node
+    // to the new root). The subtree rooted at the last unlocked ancestor is
+    // then appended to the new tree.
+    auto* currentNode = lastUnlockedAncestor;
+    while (currentNode-&gt;m_parent) {
+        auto&amp; parentNode = currentNode-&gt;m_parent;
+        currentNode-&gt;m_parent = AsyncStackTrace::create(parentNode-&gt;m_callStack, true, parentNode-&gt;m_parent);
+        currentNode = currentNode-&gt;m_parent.get();
+
+        if (parentNode.get() == newStackTraceRoot)
+            break;
+    }
+
+    currentNode-&gt;m_truncated = true;
+    currentNode-&gt;remove();
+
+    // Decrement the child count of the first locked ancestor after removing its subtree.
+    auto&amp; firstLockedAncestor = lastUnlockedAncestor-&gt;m_parent;
+    firstLockedAncestor-&gt;m_childCount--;
+}
+
+void AsyncStackTrace::remove()
+{
+    auto* stackTrace = m_parent.get();
+    while (stackTrace) {
+        stackTrace-&gt;m_childCount--;
+        if (stackTrace-&gt;m_childCount || stackTrace-&gt;isLocked())
+            break;
+
+        stackTrace = stackTrace-&gt;m_parent.get();
+    }
+
+    m_parent = nullptr;
+}
+
+} // namespace Inspector
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorAsyncStackTracehfromrev211344trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementcss"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.h (from rev 211344, trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css) (0 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/AsyncStackTrace.h        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+/*
+ * Copyright (C) 2017 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#pragma once
+
+#include &quot;InspectorProtocolObjects.h&quot;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/RefCounted.h&gt;
+
+namespace Inspector {
+
+class ScriptCallStack;
+
+class JS_EXPORT_PRIVATE AsyncStackTrace : public RefCounted&lt;AsyncStackTrace&gt; {
+public:
+    enum class State {
+        Pending,
+        Active,
+        Dispatched,
+        Canceled,
+    };
+
+    static RefPtr&lt;AsyncStackTrace&gt; create(RefPtr&lt;ScriptCallStack&gt;, bool singleShot, RefPtr&lt;AsyncStackTrace&gt; parent);
+
+    bool isPending() const;
+    bool isLocked() const;
+
+    void willDispatchAsyncCall(size_t maxDepth);
+    void didDispatchAsyncCall();
+    void didCancelAsyncCall();
+
+    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; buildInspectorObject() const;
+
+    ~AsyncStackTrace();
+
+private:
+    AsyncStackTrace(RefPtr&lt;ScriptCallStack&gt;, bool, RefPtr&lt;AsyncStackTrace&gt;);
+
+    void truncate(size_t maxDepth);
+    void remove();
+
+    RefPtr&lt;ScriptCallStack&gt; m_callStack;
+    RefPtr&lt;AsyncStackTrace&gt; m_parent;
+    unsigned m_childCount { 0 };
+    State m_state { State::Pending };
+    bool m_truncated { false };
+    bool m_singleShot { true };
+};
+
+} // namespace Inspector
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;InspectorDebuggerAgent.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;AsyncStackTrace.h&quot;
</ins><span class="cx"> #include &quot;ContentSearchUtilities.h&quot;
</span><span class="cx"> #include &quot;InjectedScript.h&quot;
</span><span class="cx"> #include &quot;InjectedScriptManager.h&quot;
</span><span class="lines">@@ -212,40 +213,6 @@
</span><span class="cx">     return injectedScript.wrapObject(exception, InspectorDebuggerAgent::backtraceObjectGroup)-&gt;openAccessors();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; InspectorDebuggerAgent::buildAsyncStackTrace(const AsyncCallIdentifier&amp; identifier)
-{
-    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; topStackTrace;
-    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; previousStackTrace;
-
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    auto end = m_asyncCallIdentifierToData.end();
-    while (iterator != end) {
-        const auto&amp; callData = iterator-&gt;value;
-        ASSERT(callData.callStack &amp;&amp; callData.callStack-&gt;size());
-        if (!callData.callStack || !callData.callStack-&gt;size())
-            break;
-
-        RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; stackTrace = Inspector::Protocol::Console::StackTrace::create()
-            .setCallFrames(callData.callStack-&gt;buildInspectorArray())
-            .release();
-
-        if (callData.callStack-&gt;at(0).isNative())
-            stackTrace-&gt;setTopCallFrameIsBoundary(true);
-        if (!topStackTrace)
-            topStackTrace = stackTrace;
-        if (previousStackTrace)
-            previousStackTrace-&gt;setParentStackTrace(stackTrace);
-
-        if (!callData.parentAsyncCallIdentifier)
-            break;
-
-        previousStackTrace = stackTrace;
-        iterator = m_asyncCallIdentifierToData.find(callData.parentAsyncCallIdentifier.value());
-    }
-
-    return topStackTrace;
-}
-
</del><span class="cx"> void InspectorDebuggerAgent::handleConsoleAssert(const String&amp; message)
</span><span class="cx"> {
</span><span class="cx">     if (!m_scriptDebugServer.breakpointsActive())
</span><span class="lines">@@ -268,10 +235,17 @@
</span><span class="cx">     if (!callStack || !callStack-&gt;size())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (m_currentAsyncCallIdentifier)
-        refAsyncCallData(m_currentAsyncCallIdentifier.value());
</del><ins>+    RefPtr&lt;AsyncStackTrace&gt; parentStackTrace;
+    if (m_currentAsyncCallIdentifier) {
+        auto it = m_pendingAsyncCalls.find(m_currentAsyncCallIdentifier.value());
+        ASSERT(it != m_pendingAsyncCalls.end());
+        parentStackTrace = it-&gt;value;
+    }
</ins><span class="cx"> 
</span><del>-    m_asyncCallIdentifierToData.set(std::make_pair(asyncCallType, callbackIdentifier), AsyncCallData(callStack, m_currentAsyncCallIdentifier, singleShot));
</del><ins>+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto asyncStackTrace = AsyncStackTrace::create(WTFMove(callStack), singleShot, WTFMove(parentStackTrace));
+
+    m_pendingAsyncCalls.set(identifier, WTFMove(asyncStackTrace));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::didCancelAsyncCall(int asyncCallType, int callbackIdentifier)
</span><span class="lines">@@ -279,8 +253,18 @@
</span><span class="cx">     if (!m_asyncStackTraceDepth)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    const auto asyncCallIdentifier = std::make_pair(asyncCallType, callbackIdentifier);
-    derefAsyncCallData(asyncCallIdentifier);
</del><ins>+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto it = m_pendingAsyncCalls.find(identifier);
+    if (it == m_pendingAsyncCalls.end())
+        return;
+
+    auto&amp; asyncStackTrace = it-&gt;value;
+    asyncStackTrace-&gt;didCancelAsyncCall();
+
+    if (m_currentAsyncCallIdentifier &amp;&amp; m_currentAsyncCallIdentifier.value() == identifier)
+        return;
+
+    m_pendingAsyncCalls.remove(identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::willDispatchAsyncCall(int asyncCallType, int callbackIdentifier)
</span><span class="lines">@@ -293,12 +277,15 @@
</span><span class="cx"> 
</span><span class="cx">     // A call can be scheduled before the Inspector is opened, or while async stack
</span><span class="cx">     // traces are disabled. If no call data exists, do nothing.
</span><del>-    auto asyncCallIdentifier = std::make_pair(asyncCallType, callbackIdentifier);
-    if (!m_asyncCallIdentifierToData.contains(asyncCallIdentifier))
</del><ins>+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto it = m_pendingAsyncCalls.find(identifier);
+    if (it == m_pendingAsyncCalls.end())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_currentAsyncCallIdentifier = WTFMove(asyncCallIdentifier);
-    refAsyncCallData(asyncCallIdentifier);
</del><ins>+    auto&amp; asyncStackTrace = it-&gt;value;
+    asyncStackTrace-&gt;willDispatchAsyncCall(m_asyncStackTraceDepth);
+
+    m_currentAsyncCallIdentifier = identifier;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::didDispatchAsyncCall()
</span><span class="lines">@@ -309,8 +296,17 @@
</span><span class="cx">     if (!m_currentAsyncCallIdentifier)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    derefAsyncCallData(m_currentAsyncCallIdentifier.value());
</del><ins>+    auto identifier = m_currentAsyncCallIdentifier.value();
+    auto it = m_pendingAsyncCalls.find(identifier);
+    ASSERT(it != m_pendingAsyncCalls.end());
+
+    auto&amp; asyncStackTrace = it-&gt;value;
+    asyncStackTrace-&gt;didDispatchAsyncCall();
+
</ins><span class="cx">     m_currentAsyncCallIdentifier = std::nullopt;
</span><ins>+
+    if (!asyncStackTrace-&gt;isPending())
+        m_pendingAsyncCalls.remove(identifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static Ref&lt;InspectorObject&gt; buildObjectForBreakpointCookie(const String&amp; url, int lineNumber, int columnNumber, const String&amp; condition, RefPtr&lt;InspectorArray&gt;&amp; actions, bool isRegex, bool autoContinue, unsigned ignoreCount)
</span><span class="lines">@@ -1001,8 +997,11 @@
</span><span class="cx">     m_enablePauseWhenIdle = false;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; asyncStackTrace;
</span><del>-    if (m_currentAsyncCallIdentifier)
-        asyncStackTrace = buildAsyncStackTrace(m_currentAsyncCallIdentifier.value());
</del><ins>+    if (m_currentAsyncCallIdentifier) {
+        auto it = m_pendingAsyncCalls.find(m_currentAsyncCallIdentifier.value());
+        if (it != m_pendingAsyncCalls.end())
+            asyncStackTrace = it-&gt;value-&gt;buildInspectorObject();
+    }
</ins><span class="cx"> 
</span><span class="cx">     m_frontendDispatcher-&gt;paused(currentCallFrames(injectedScript), m_breakReason, m_breakAuxData, asyncStackTrace);
</span><span class="cx"> 
</span><span class="lines">@@ -1138,33 +1137,8 @@
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::clearAsyncStackTraceData()
</span><span class="cx"> {
</span><del>-    m_asyncCallIdentifierToData.clear();
</del><ins>+    m_pendingAsyncCalls.clear();
</ins><span class="cx">     m_currentAsyncCallIdentifier = std::nullopt;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorDebuggerAgent::refAsyncCallData(const AsyncCallIdentifier&amp; identifier)
-{
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    if (iterator == m_asyncCallIdentifierToData.end())
-        return;
-
-    iterator-&gt;value.referenceCount++;
-}
-
-void InspectorDebuggerAgent::derefAsyncCallData(const AsyncCallIdentifier&amp; identifier)
-{
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    if (iterator == m_asyncCallIdentifierToData.end())
-        return;
-
-    auto&amp; asyncCallData = iterator-&gt;value;
-    asyncCallData.referenceCount--;
-    if (asyncCallData.referenceCount)
-        return;
-
-    if (asyncCallData.parentAsyncCallIdentifier)
-        derefAsyncCallData(asyncCallData.parentAsyncCallIdentifier.value());
-    m_asyncCallIdentifierToData.remove(identifier);
-}
-
</del><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -44,12 +44,12 @@
</span><span class="cx"> 
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><ins>+class AsyncStackTrace;
</ins><span class="cx"> class InjectedScript;
</span><span class="cx"> class InjectedScriptManager;
</span><span class="cx"> class InspectorArray;
</span><span class="cx"> class InspectorObject;
</span><span class="cx"> class ScriptDebugServer;
</span><del>-struct AsyncCallData;
</del><span class="cx"> typedef String ErrorString;
</span><span class="cx"> 
</span><span class="cx"> class JS_EXPORT_PRIVATE InspectorDebuggerAgent : public InspectorAgentBase, public ScriptDebugListener, public DebuggerBackendDispatcherHandler {
</span><span class="lines">@@ -164,30 +164,11 @@
</span><span class="cx"> 
</span><span class="cx">     typedef std::pair&lt;int, int&gt; AsyncCallIdentifier;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;Inspector::Protocol::Console::StackTrace&gt; buildAsyncStackTrace(const AsyncCallIdentifier&amp;);
-    void refAsyncCallData(const AsyncCallIdentifier&amp;);
-    void derefAsyncCallData(const AsyncCallIdentifier&amp;);
-
</del><span class="cx">     typedef HashMap&lt;JSC::SourceID, Script&gt; ScriptsMap;
</span><span class="cx">     typedef HashMap&lt;String, Vector&lt;JSC::BreakpointID&gt;&gt; BreakpointIdentifierToDebugServerBreakpointIDsMap;
</span><span class="cx">     typedef HashMap&lt;String, RefPtr&lt;InspectorObject&gt;&gt; BreakpointIdentifierToBreakpointMap;
</span><span class="cx">     typedef HashMap&lt;JSC::BreakpointID, String&gt; DebugServerBreakpointIDToBreakpointIdentifier;
</span><span class="cx"> 
</span><del>-    struct AsyncCallData {
-        AsyncCallData(RefPtr&lt;ScriptCallStack&gt; callStack, std::optional&lt;AsyncCallIdentifier&gt; parentAsyncCallIdentifier, bool singleShot)
-            : callStack(callStack)
-            , parentAsyncCallIdentifier(parentAsyncCallIdentifier)
-            , referenceCount(singleShot ? 0 : 1)
-        {
-        }
-
-        AsyncCallData() = default;
-
-        RefPtr&lt;ScriptCallStack&gt; callStack;
-        std::optional&lt;AsyncCallIdentifier&gt; parentAsyncCallIdentifier { std::nullopt };
-        unsigned referenceCount { 0 };
-    };
-
</del><span class="cx">     InjectedScriptManager&amp; m_injectedScriptManager;
</span><span class="cx">     std::unique_ptr&lt;DebuggerFrontendDispatcher&gt; m_frontendDispatcher;
</span><span class="cx">     RefPtr&lt;DebuggerBackendDispatcher&gt; m_backendDispatcher;
</span><span class="lines">@@ -204,7 +185,7 @@
</span><span class="cx">     RefPtr&lt;InspectorObject&gt; m_breakAuxData;
</span><span class="cx">     ShouldDispatchResumed m_conditionToDispatchResumed { ShouldDispatchResumed::No };
</span><span class="cx">     bool m_enablePauseWhenIdle { false };
</span><del>-    HashMap&lt;AsyncCallIdentifier, AsyncCallData&gt; m_asyncCallIdentifierToData;
</del><ins>+    HashMap&lt;AsyncCallIdentifier, RefPtr&lt;AsyncStackTrace&gt;&gt; m_pendingAsyncCalls;
</ins><span class="cx">     std::optional&lt;AsyncCallIdentifier&gt; m_currentAsyncCallIdentifier { std::nullopt };
</span><span class="cx">     bool m_enabled { false };
</span><span class="cx">     bool m_javaScriptPauseScheduled { false };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolConsolejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Console.json (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Console.json        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Console.json        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx">             &quot;properties&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;callFrames&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;$ref&quot;: &quot;CallFrame&quot; } },
</span><span class="cx">                 { &quot;name&quot;: &quot;topCallFrameIsBoundary&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Whether the first item in &lt;code&gt;callFrames&lt;/code&gt; is the native function that scheduled the asynchronous operation (e.g. setTimeout).&quot; },
</span><ins>+                { &quot;name&quot;: &quot;truncated&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Whether one or more frames have been truncated from the bottom of the stack.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;parentStackTrace&quot;, &quot;$ref&quot;: &quot;StackTrace&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Parent StackTrace.&quot; }
</span><span class="cx">             ]
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/ChangeLog        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2017-01-28  Matt Baker  &lt;mattbaker@apple.com&gt;
+
+        Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+        https://bugs.webkit.org/show_bug.cgi?id=165633
+        &lt;rdar://problem/29738502&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        * Localizations/en.lproj/localizedStrings.js:
+        Text for &quot;Truncated&quot; marker tree element.
+
+        * UserInterface/Models/StackTrace.js:
+        (WebInspector.StackTrace):
+        (WebInspector.StackTrace.fromPayload):
+        (WebInspector.StackTrace.prototype.get truncated):
+        Plumbing for new Console.StackTrace property `truncated`.
+
+        * UserInterface/Views/ThreadTreeElement.css:
+        (.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames):
+        (.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames .icon):
+        Styles for &quot;Truncated&quot; marker tree element.
+
+        * UserInterface/Views/ThreadTreeElement.js:
+        (WebInspector.ThreadTreeElement.prototype.refresh):
+        Append &quot;Truncated&quot; marker tree element if necessary.
+
+        * Versions/Inspector-iOS-10.3.json:
+
</ins><span class="cx"> 2017-01-27  Devin Rousso  &lt;dcrousso+webkit@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: gradient editor should provide horizontal slider for 'angle' value where applicable
</span></span></pre></div>
<a id="trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -125,6 +125,7 @@
</span><span class="cx"> localizedStrings[&quot;Busy&quot;] = &quot;Busy&quot;;
</span><span class="cx"> localizedStrings[&quot;CSP Hash&quot;] = &quot;CSP Hash&quot;;
</span><span class="cx"> localizedStrings[&quot;Cached&quot;] = &quot;Cached&quot;;
</span><ins>+localizedStrings[&quot;Call Frames Truncated&quot;] = &quot;Call Frames Truncated&quot;;
</ins><span class="cx"> localizedStrings[&quot;Call Stack&quot;] = &quot;Call Stack&quot;;
</span><span class="cx"> localizedStrings[&quot;Call Trees&quot;] = &quot;Call Trees&quot;;
</span><span class="cx"> localizedStrings[&quot;Calls&quot;] = &quot;Calls&quot;;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsStackTracejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/StackTrace.js (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/StackTrace.js        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/StackTrace.js        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.StackTrace = class StackTrace extends WebInspector.Object
</span><span class="cx"> {
</span><del>-    constructor(callFrames, topCallFrameIsBoundary)
</del><ins>+    constructor(callFrames, topCallFrameIsBoundary, truncated, parentStackTrace)
</ins><span class="cx">     {
</span><span class="cx">         super();
</span><span class="cx"> 
</span><span class="lines">@@ -33,7 +33,8 @@
</span><span class="cx"> 
</span><span class="cx">         this._callFrames = callFrames;
</span><span class="cx">         this._topCallFrameIsBoundary = topCallFrameIsBoundary || false;
</span><del>-        this._parentStackTrace = null;
</del><ins>+        this._truncated = truncated || false;
+        this._parentStackTrace = parentStackTrace || null;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Static
</span><span class="lines">@@ -45,7 +46,7 @@
</span><span class="cx"> 
</span><span class="cx">         while (payload) {
</span><span class="cx">             let callFrames = payload.callFrames.map((x) =&gt; WebInspector.CallFrame.fromPayload(target, x));
</span><del>-            let stackTrace = new WebInspector.StackTrace(callFrames, payload.topCallFrameIsBoundary);
</del><ins>+            let stackTrace = new WebInspector.StackTrace(callFrames, payload.topCallFrameIsBoundary, payload.truncated);
</ins><span class="cx">             if (!result)
</span><span class="cx">                 result = stackTrace;
</span><span class="cx">             if (previousStackTrace)
</span><span class="lines">@@ -169,5 +170,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     get topCallFrameIsBoundary() { return this._topCallFrameIsBoundary; }
</span><ins>+    get truncated() { return this._truncated; }
</ins><span class="cx">     get parentStackTrace() { return this._parentStackTrace; }
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementcss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -50,3 +50,18 @@
</span><span class="cx"> .tree-outline &gt; .item.thread:hover .status-button.resume {
</span><span class="cx">     display: inline-block;
</span><span class="cx"> }
</span><ins>+
+.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames {
+    color: var(--text-color-gray-medium);
+    border-top: dashed 0.5px var(--border-color);
+    margin-left: 31px;
+    margin-right: 6px;
+    padding-left: 0;
+    cursor: default;
+}
+
+.tree-outline &gt; .item.thread + ol &gt; .item.truncated-call-frames .icon {
+    margin-left: 0;
+    content: url(../Images/Function.svg);
+    opacity: 0.6;
+}
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -92,6 +92,12 @@
</span><span class="cx">             for (let i = startIndex; i &lt; currentStackTrace.callFrames.length; ++i)
</span><span class="cx">                 this.appendChild(new WebInspector.CallFrameTreeElement(currentStackTrace.callFrames[i]));
</span><span class="cx"> 
</span><ins>+            if (currentStackTrace.truncated) {
+                let truncatedTreeElement = new WebInspector.GeneralTreeElement(&quot;truncated-call-frames&quot;, WebInspector.UIString(&quot;Call Frames Truncated&quot;));
+                truncatedTreeElement.selectable = false;
+                this.appendChild(truncatedTreeElement);
+            }
+
</ins><span class="cx">             currentStackTrace = currentStackTrace.parentStackTrace;
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIVersionsInspectoriOS103json"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json (211344 => 211345)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json        2017-01-29 00:39:45 UTC (rev 211344)
+++ trunk/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json        2017-01-29 01:02:22 UTC (rev 211345)
</span><span class="lines">@@ -587,6 +587,7 @@
</span><span class="cx">             &quot;properties&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;callFrames&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;$ref&quot;: &quot;CallFrame&quot; } },
</span><span class="cx">                 { &quot;name&quot;: &quot;topCallFrameIsBoundary&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Whether the first item in &lt;code&gt;callFrames&lt;/code&gt; is the native function that scheduled the asynchronous operation (e.g. setTimeout).&quot; },
</span><ins>+                { &quot;name&quot;: &quot;truncated&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Whether one or more frames have been truncated from the bottom of the stack.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;parentStackTrace&quot;, &quot;$ref&quot;: &quot;StackTrace&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Parent StackTrace.&quot; }
</span><span class="cx">             ]
</span><span class="cx">         }
</span></span></pre>
</div>
</div>

</body>
</html>