Title: [211519] branches/safari-603-branch
Revision
211519
Author
matthew_han...@apple.com
Date
2017-02-01 13:26:44 -0800 (Wed, 01 Feb 2017)

Log Message

Merge r211385. rdar://problem/29738502

Modified Paths

Added Paths

Diff

Modified: branches/safari-603-branch/LayoutTests/ChangeLog (211518 => 211519)


--- branches/safari-603-branch/LayoutTests/ChangeLog	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/LayoutTests/ChangeLog	2017-02-01 21:26:44 UTC (rev 211519)
@@ -1,5 +1,28 @@
 2017-01-31  Matthew Hanson  <matthew_han...@apple.com>
 
+        Merge r211385. rdar://problem/29738502
+
+    2017-01-30  Matt Baker  <mattba...@apple.com>
+
+            Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+            https://bugs.webkit.org/show_bug.cgi?id=165633
+            <rdar://problem/29738502>
+
+            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):
+
+2017-01-31  Matthew Hanson  <matthew_han...@apple.com>
+
         Merge r211337. rdar://problem/30126535
 
     2017-01-28  Zalan Bujtas  <za...@apple.com>

Modified: branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace-expected.txt (211518 => 211519)


--- branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace-expected.txt	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace-expected.txt	2017-02-01 21:26:44 UTC (rev 211519)
@@ -6,57 +6,64 @@
 PAUSE #1
 CALL STACK:
 0: [F] pauseThenFinishTest
--- [N] requestAnimationFrame ----
-1: [F] testRequestAnimationFrame
-2: [P] Global Code
+ASYNC CALL STACK:
+1: --- requestAnimationFrame ---
+2: [F] testRequestAnimationFrame
+3: [P] Global Code
 
 -- Running test case: CheckAsyncStackTrace.SetTimeout
 PAUSE #1
 CALL STACK:
 0: [F] pauseThenFinishTest
--- [N] setTimeout ----
-1: [F] testSetTimeout
-2: [P] Global Code
+ASYNC CALL STACK:
+1: --- setTimeout ---
+2: [F] testSetTimeout
+3: [P] Global Code
 
 -- Running test case: CheckAsyncStackTrace.SetInterval
 PAUSE #1
 CALL STACK:
 0: [F] intervalFired
--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
 PAUSE #2
 CALL STACK:
 0: [F] intervalFired
--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
 PAUSE #3
 CALL STACK:
 0: [F] intervalFired
--- [N] setInterval ----
-1: [F] testSetInterval
-2: [P] Global Code
+ASYNC CALL STACK:
+1: --- setInterval ---
+2: [F] testSetInterval
+3: [P] Global Code
 
 -- Running test case: CheckAsyncStackTrace.ChainedRequestAnimationFrame
 PAUSE #1
 CALL STACK:
 0: [F] pauseThenFinishTest
--- [N] requestAnimationFrame ----
-1: [F] testRequestAnimationFrame
--- [N] requestAnimationFrame ----
-2: [F] testChainedRequestAnimationFrame
-3: [P] Global Code
+ASYNC CALL STACK:
+1: --- requestAnimationFrame ---
+2: [F] testRequestAnimationFrame
+3: --- requestAnimationFrame ---
+4: [F] testChainedRequestAnimationFrame
+5: [P] Global Code
 
 -- Running test case: CheckAsyncStackTrace.ReferenceCounting
 PAUSE #1
 CALL STACK:
 0: [F] pauseThenFinishTest
--- [N] setTimeout ----
-1: [F] intervalFired
--- [N] setInterval ----
-2: [F] testReferenceCounting
-3: [P] Global Code
+ASYNC CALL STACK:
+1: --- setTimeout ---
+2: [F] intervalFired
+3: --- setInterval ---
+4: [F] testReferenceCounting
+5: [P] Global Code
 -- Running test setup.
 Save DebuggerManager.asyncStackTraceDepth
 
@@ -67,8 +74,44 @@
 -- Running test setup.
 Save DebuggerManager.asyncStackTraceDepth
 
--- Running test case: AsyncStackTrace.SetStackTraceDepth
-PASS: Number of call frames should be equal to the depth setting.
+-- 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)
 -- Running test teardown.
 Restore DebuggerManager.asyncStackTraceDepth
+-- Running test setup.
+Save DebuggerManager.asyncStackTraceDepth
 
+-- 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
+

Modified: branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace.html (211518 => 211519)


--- branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace.html	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/LayoutTests/inspector/debugger/async-stack-trace.html	2017-02-01 21:26:44 UTC (rev 211519)
@@ -2,6 +2,7 @@
 <html>
 <head>
 <script src=""
+<script src=""
 <script>
 const timerDelay = 20;
 
@@ -48,55 +49,22 @@
     testFunction();
 }
 
+function repeatingRequestAnimationFrame(repeatCount) {
+    let count = 0;
+    function repeat() {
+        if (count++ === repeatCount) {
+            pauseThenFinishTest();
+            return;
+        }
+        requestAnimationFrame(repeat);
+    }
+    requestAnimationFrame(repeat);
+}
+
 function test()
 {
     let suite = InspectorTest.createAsyncSuite("AsyncStackTrace");
 
-    function activeTargetData() {
-        InspectorTest.assert(WebInspector.debuggerManager.activeCallFrame, "Active call frame should exist.");
-        if (!WebInspector.debuggerManager.activeCallFrame)
-            return null;
-
-        let targetData = WebInspector.debuggerManager.dataForTarget(WebInspector.debuggerManager.activeCallFrame.target);
-        InspectorTest.assert(targetData, "Data for active call frame target should exist.");
-        return targetData;
-    }
-
-    function logCallStack() {
-        function callFrameString(callFrame) {
-            let code = callFrame.nativeCode ? "N" : (callFrame.programCode ? "P" : "F");
-            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()) : "(async)";
-            InspectorTest.log(`-- ${boundaryLabel} ----`);
-            logCallFrames(callFrames);
-        }
-    }
-
     function addSimpleTestCase(name, _expression_) {
         suite.addTestCase({
             name: `CheckAsyncStackTrace.${name}`,
@@ -104,8 +72,7 @@
                 let pauseCount = 0;
                 function handlePaused() {
                     InspectorTest.log(`PAUSE #${++pauseCount}`);
-                    InspectorTest.log("CALL STACK:");
-                    logCallStack();
+                    logActiveStackTrace();
                     WebInspector.debuggerManager.resume();
                 }
 
@@ -146,8 +113,9 @@
         test(resolve, reject) {
             WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
             .then((event) => {
-                let stackTrace = activeTargetData().asyncStackTrace;
-                InspectorTest.expectNull(stackTrace, "Async stack trace should be null.");
+                let stackTrace = getActiveStackTrace();
+                let asyncStackTrace = stackTrace.parentStackTrace;
+                InspectorTest.expectNull(asyncStackTrace, "Async stack trace should be null.");
                 WebInspector.debuggerManager.resume().then(resolve, reject);
             });
 
@@ -156,29 +124,56 @@
         }
     });
 
-    suite.addTestCase({
-        name: "AsyncStackTrace.SetStackTraceDepth",
-        setup,
-        teardown,
-        test(resolve, reject) {
-            WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
-            .then((event) => {
-                let stackTrace = activeTargetData().asyncStackTrace;
-                InspectorTest.assert(stackTrace && stackTrace.callFrames);
-                if (!stackTrace || !stackTrace.callFrames)
-                    reject();
+    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);
 
-                InspectorTest.expectEqual(stackTrace.callFrames.length, maxStackDepth, "Number of call frames should be equal to the depth setting.");
-                WebInspector.debuggerManager.resume().then(resolve, reject);
-            });
+                WebInspector.debuggerManager.awaitEvent(WebInspector.DebuggerManager.Event.Paused)
+                .then((event) => {
+                    let stackTrace = getActiveStackTrace();
+                    InspectorTest.assert(stackTrace && stackTrace.callFrames);
+                    if (!stackTrace || !stackTrace.callFrames)
+                        reject();
 
-            const maxStackDepth = 2;
-            const functionCallCount = maxStackDepth * 2;
-            WebInspector.debuggerManager.asyncStackTraceDepth = maxStackDepth;
-            InspectorTest.evaluateInPage(`recursiveCallThenTest(testRequestAnimationFrame, ${functionCallCount})`);
-        }
-    });
+                    let stackTraceDepth = 0;
+                    while (stackTrace.parentStackTrace) {
+                        InspectorTest.expectFalse(stackTrace.truncated, "Non-root StackTrace should not be truncated.");
+                        stackTrace = stackTrace.parentStackTrace;
+                        stackTraceDepth += stackTrace.callFrames.length;
+                    }
 
+                    InspectorTest.expectThat(stackTrace.truncated, "StackTrace root should be truncated.");
+                    InspectorTest.expectEqual(stackTraceDepth, expectedStackTraceDepth, "StackTrace should be truncated to the nearest call stack.");
+
+                    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("ForceTruncationOnCallStackBoundary", 4);
+    addTruncateTestCase("ForceTruncationWithinCallStack", 5);
+
     suite.runTestCasesAndFinish();
 }
 </script>

Added: branches/safari-603-branch/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js (0 => 211519)


--- branches/safari-603-branch/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js	                        (rev 0)
+++ branches/safari-603-branch/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js	2017-02-01 21:26:44 UTC (rev 211519)
@@ -0,0 +1,67 @@
+TestPage.registerInitializer(() => {
+    window.getActiveStackTrace = function() {
+        InspectorTest.assert(WebInspector.debuggerManager.activeCallFrame, "Active call frame should exist.");
+        if (!WebInspector.debuggerManager.activeCallFrame)
+            return null;
+
+        let targetData = WebInspector.debuggerManager.dataForTarget(WebInspector.debuggerManager.activeCallFrame.target);
+        InspectorTest.assert(targetData, "Data for active call frame target should exist.");
+        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 ? "N" : (callFrame.programCode ? "P" : "F");
+                    InspectorTest.log(`${callFrameIndex}: [${code}] ${label}`);
+                }
+                callFrameIndex++;
+            }
+
+            InspectorTest.log("CALL STACK:");
+
+            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("ASYNC CALL STACK:");
+                        foundAsyncBoundary = true;
+                    }
+                    logCallFrame(callFrames[0], true);
+                }
+
+                for (let i = topCallFrameIsBoundary ? 1 : 0; i < 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("(remaining call frames truncated)");
+            }
+        }
+
+        logStackTrace(getActiveStackTrace());
+    }
+});

Modified: branches/safari-603-branch/Source/_javascript_Core/CMakeLists.txt (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/CMakeLists.txt	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/CMakeLists.txt	2017-02-01 21:26:44 UTC (rev 211519)
@@ -514,6 +514,7 @@
     heap/WeakSet.cpp
     heap/WriteBarrierSupport.cpp
 
+    inspector/AsyncStackTrace.cpp
     inspector/ConsoleMessage.cpp
     inspector/ContentSearchUtilities.cpp
     inspector/EventLoop.cpp

Modified: branches/safari-603-branch/Source/_javascript_Core/ChangeLog (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/ChangeLog	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/ChangeLog	2017-02-01 21:26:44 UTC (rev 211519)
@@ -1,5 +1,97 @@
 2017-01-31  Matthew Hanson  <matthew_han...@apple.com>
 
+        Merge r211385. rdar://problem/29738502
+
+    2017-01-30  Matt Baker  <mattba...@apple.com>
+
+            Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+            https://bugs.webkit.org/show_bug.cgi?id=165633
+            <rdar://problem/29738502>
+
+            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:
+            * _javascript_Core.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:
+
+2017-01-31  Matthew Hanson  <matthew_han...@apple.com>
+
         Merge r211300. rdar://problem/30135571
 
     2017-01-27  Filip Pizlo  <fpi...@apple.com>

Modified: branches/safari-603-branch/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2017-02-01 21:26:44 UTC (rev 211519)
@@ -1372,6 +1372,8 @@
 		65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65C0285B1717966800351E35 /* ARMv7DOpcode.h */; };
 		65FB5117184EEE7000C12B70 /* ProtoCallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */; };
 		65FB63A41C8EA09C0020719B /* YarrCanonicalizeUnicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65A946141C8E9F6F00A7209A /* YarrCanonicalizeUnicode.cpp */; };
+		6A38CFA91E32B5AB0060206F /* AsyncStackTrace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */; };
+		6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */; };
 		6AD2CB4D19B9140100065719 /* DebuggerEvalEnabler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		70113D4B1A8DB093003848C4 /* IteratorOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70113D491A8DB093003848C4 /* IteratorOperations.cpp */; };
 		70113D4C1A8DB093003848C4 /* IteratorOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 70113D4A1A8DB093003848C4 /* IteratorOperations.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -3819,6 +3821,8 @@
 		65EA73630BAE35D1001BB560 /* CommonIdentifiers.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CommonIdentifiers.h; sourceTree = "<group>"; };
 		65FB5115184EE8F800C12B70 /* ProtoCallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtoCallFrame.h; sourceTree = "<group>"; };
 		65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProtoCallFrame.cpp; sourceTree = "<group>"; };
+		6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncStackTrace.cpp; sourceTree = "<group>"; };
+		6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncStackTrace.h; sourceTree = "<group>"; };
 		6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerEvalEnabler.h; sourceTree = "<group>"; };
 		70113D491A8DB093003848C4 /* IteratorOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IteratorOperations.cpp; sourceTree = "<group>"; };
 		70113D4A1A8DB093003848C4 /* IteratorOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IteratorOperations.h; sourceTree = "<group>"; };
@@ -4999,13 +5003,13 @@
 			children = (
 				0F9327591C20BCBA00CF6564 /* dynbench */,
 				0FF922CF14F46B130041A24E /* JSCLLIntOffsetsExtractor */,
+				141211200A48793C00480255 /* minidom */,
 				0F6183431C45F62A0072450B /* testair */,
+				14BD59BF0A3E8F9000BAF59C /* testapi */,
+				0FEC85AD1BDB5CF10080FF74 /* testb3 */,
 				6511230514046A4C002B101D /* testRegExp */,
 				932F5BD90822A1C700736975 /* _javascript_Core.framework */,
 				932F5BE10822A1C700736975 /* jsc */,
-				141211200A48793C00480255 /* minidom */,
-				14BD59BF0A3E8F9000BAF59C /* testapi */,
-				0FEC85AD1BDB5CF10080FF74 /* testb3 */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -5226,10 +5230,10 @@
 				0FEC84C01BDACDAC0080FF74 /* B3Common.h */,
 				0FEC84C11BDACDAC0080FF74 /* B3Commutativity.cpp */,
 				0FEC84C21BDACDAC0080FF74 /* B3Commutativity.h */,
-				7919B77F1E03559C005BEED8 /* B3Compile.h */,
-				795F099C1E03600500BBE37F /* B3Compile.cpp */,
 				0F338DFF1BF0276C0013C88F /* B3Compilation.cpp */,
 				0F338E001BF0276C0013C88F /* B3Compilation.h */,
+				795F099C1E03600500BBE37F /* B3Compile.cpp */,
+				7919B77F1E03559C005BEED8 /* B3Compile.h */,
 				0F86AE1F1C5311C5006BE8EC /* B3ComputeDivisionMagic.h */,
 				0FEC84C31BDACDAC0080FF74 /* B3Const32Value.cpp */,
 				0FEC84C41BDACDAC0080FF74 /* B3Const32Value.h */,
@@ -6332,9 +6336,9 @@
 				E178633F0D9BEC0000D74E75 /* InitializeThreading.h */,
 				E35E035D1B7AB43E0073AD2A /* InspectorInstrumentationObject.cpp */,
 				E35E035E1B7AB43E0073AD2A /* InspectorInstrumentationObject.h */,
-				A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
 				A7A8AF2C17ADB5F3005AB174 /* Int16Array.h */,
 				A7A8AF2D17ADB5F3005AB174 /* Int32Array.h */,
+				A7A8AF2B17ADB5F3005AB174 /* Int8Array.h */,
 				BC9BB95B0E19680600DF8855 /* InternalFunction.cpp */,
 				BC11667A0E199C05008066DD /* InternalFunction.h */,
 				A1B9E2331B4E0D6700BC7FED /* IntlCollator.cpp */,
@@ -6429,9 +6433,9 @@
 				BC756FC60E2031B200DE7D12 /* JSGlobalObjectFunctions.cpp */,
 				BC756FC70E2031B200DE7D12 /* JSGlobalObjectFunctions.h */,
 				79B819921DD25CF500DDC714 /* JSGlobalObjectInlines.h */,
-				0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
 				0F2B66CA17B6B5AB00A7AE3F /* JSInt16Array.h */,
 				0F2B66CB17B6B5AB00A7AE3F /* JSInt32Array.h */,
+				0F2B66C917B6B5AB00A7AE3F /* JSInt8Array.h */,
 				E33F507E1B8429A400413856 /* JSInternalPromise.cpp */,
 				E33F507F1B8429A400413856 /* JSInternalPromise.h */,
 				E33F50761B84225700413856 /* JSInternalPromiseConstructor.cpp */,
@@ -6513,10 +6517,10 @@
 				53F256E11B87E28000B4B768 /* JSTypedArrayViewPrototype.cpp */,
 				53917E7C1B791106000EBD33 /* JSTypedArrayViewPrototype.h */,
 				6507D2970E871E4A00D7D896 /* JSTypeInfo.h */,
+				0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
+				0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
 				0F2B66D217B6B5AB00A7AE3F /* JSUint8Array.h */,
 				0F2B66D317B6B5AB00A7AE3F /* JSUint8ClampedArray.h */,
-				0F2B66D417B6B5AB00A7AE3F /* JSUint16Array.h */,
-				0F2B66D517B6B5AB00A7AE3F /* JSUint32Array.h */,
 				A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */,
 				A7CA3AE217DA41AE006538AF /* JSWeakMap.h */,
 				709FB8611AE335C60039D069 /* JSWeakSet.cpp */,
@@ -6722,11 +6726,11 @@
 				0F2D4DE019832D91007D4B19 /* TypeProfilerLog.h */,
 				0F2D4DE319832D91007D4B19 /* TypeSet.cpp */,
 				0F2D4DE419832D91007D4B19 /* TypeSet.h */,
-				A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
-				A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
 				A7A8AF3217ADB5F3005AB174 /* Uint16Array.h */,
 				866739D113BFDE710023D87C /* Uint16WithFraction.h */,
 				A7A8AF3317ADB5F3005AB174 /* Uint32Array.h */,
+				A7A8AF3017ADB5F3005AB174 /* Uint8Array.h */,
+				A7A8AF3117ADB5F3005AB174 /* Uint8ClampedArray.h */,
 				0FE050231AA9095600D33B33 /* VarOffset.cpp */,
 				0FE050241AA9095600D33B33 /* VarOffset.h */,
 				E18E3A570DF9278C00D90B34 /* VM.cpp */,
@@ -7515,6 +7519,8 @@
 				A532438D185696CA002ED692 /* protocol */,
 				A5BA15E01823409D00A82E69 /* remote */,
 				A532438E185696CE002ED692 /* scripts */,
+				6A38CFA71E32B58B0060206F /* AsyncStackTrace.cpp */,
+				6A38CFA81E32B58B0060206F /* AsyncStackTrace.h */,
 				A5FD0077189B051000633231 /* ConsoleMessage.cpp */,
 				A5FD0078189B051000633231 /* ConsoleMessage.h */,
 				A57D23EF1891B5B40031C7FA /* ContentSearchUtilities.cpp */,
@@ -7864,6 +7870,7 @@
 				A784A26111D16622005776AC /* ASTBuilder.h in Headers */,
 				5B70CFE21DB69E6600EC23F9 /* AsyncFunctionConstructor.h in Headers */,
 				5B70CFE01DB69E6600EC23F9 /* AsyncFunctionPrototype.h in Headers */,
+				6A38CFAA1E32B5AB0060206F /* AsyncStackTrace.h in Headers */,
 				0F7CF9571DC125900098CC12 /* AtomicsObject.h in Headers */,
 				A5EA70E719F5B1010098F5EC /* AugmentableInspectorController.h in Headers */,
 				A5EA70E819F5B1010098F5EC /* AugmentableInspectorControllerClient.h in Headers */,
@@ -7886,6 +7893,7 @@
 				0FEC850A1BDACDAC0080FF74 /* B3Common.h in Headers */,
 				0FEC850C1BDACDAC0080FF74 /* B3Commutativity.h in Headers */,
 				0F338E0C1BF0276C0013C88F /* B3Compilation.h in Headers */,
+				7919B7801E03559C005BEED8 /* B3Compile.h in Headers */,
 				0F86AE201C5311C5006BE8EC /* B3ComputeDivisionMagic.h in Headers */,
 				0FEC850E1BDACDAC0080FF74 /* B3Const32Value.h in Headers */,
 				0FEC85101BDACDAC0080FF74 /* B3Const64Value.h in Headers */,
@@ -7985,7 +7993,6 @@
 				0FB7F39815ED8E4600F167B2 /* ButterflyInlines.h in Headers */,
 				C2FCAE1117A9C24E0034C735 /* BytecodeBasicBlock.h in Headers */,
 				0F21C27F14BEAA8200ADC64B /* BytecodeConventions.h in Headers */,
-				0F1FB3931E177A7200A9BE50 /* VisitingTimeout.h in Headers */,
 				969A07230ED1CE3300F1F681 /* BytecodeGenerator.h in Headers */,
 				E328DAE81D38D005001A2529 /* BytecodeGeneratorification.h in Headers */,
 				E328DAE91D38D005001A2529 /* BytecodeGraph.h in Headers */,
@@ -8048,6 +8055,7 @@
 				A55714BE1CD8049F0004D2C6 /* ConsoleObject.h in Headers */,
 				A5FD0074189B038C00633231 /* ConsoleTypes.h in Headers */,
 				0FFC99D1184EC8AD009C10AB /* ConstantMode.h in Headers */,
+				0F7DF1341E2970D70095951B /* ConstraintVolatility.h in Headers */,
 				E354622B1B6065D100545386 /* ConstructAbility.h in Headers */,
 				BC18C3F60E16F5CD00B34460 /* ConstructData.h in Headers */,
 				A57D23F21891B5B40031C7FA /* ContentSearchUtilities.h in Headers */,
@@ -8069,7 +8077,6 @@
 				BCD203E80E1718F4002C7E82 /* DatePrototype.lut.h in Headers */,
 				BC18C3FA0E16F5CD00B34460 /* Debugger.h in Headers */,
 				BC18C3FB0E16F5CD00B34460 /* DebuggerCallFrame.h in Headers */,
-				0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */,
 				6AD2CB4D19B9140100065719 /* DebuggerEvalEnabler.h in Headers */,
 				A5FC84B21D1DDAD6006B5C46 /* DebuggerLocation.h in Headers */,
 				A5A1A0941D8CB33E004C2EB8 /* DebuggerParseData.h in Headers */,
@@ -8157,7 +8164,6 @@
 				0F9D339717FFC4E60073C2BC /* DFGFlushedAt.h in Headers */,
 				A7D89CF817A0B8CC00773AD8 /* DFGFlushFormat.h in Headers */,
 				0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */,
-				0F4F828C1E31B9760075184C /* StochasticSpaceTimeMutatorScheduler.h in Headers */,
 				0F69CC89193AC60A0045759E /* DFGFrozenValue.h in Headers */,
 				86EC9DC61328DF82002B2AD7 /* DFGGenerationInfo.h in Headers */,
 				86EC9DC81328DF82002B2AD7 /* DFGGraph.h in Headers */,
@@ -8211,7 +8217,6 @@
 				0FC0977114693AF500CF2442 /* DFGOSRExitCompiler.h in Headers */,
 				0F7025AA1714B0FC00382C0E /* DFGOSRExitCompilerCommon.h in Headers */,
 				0F392C8A1B46188400844728 /* DFGOSRExitFuzz.h in Headers */,
-				0F7DF13F1E2AFC4D0095951B /* JSStringSubspace.h in Headers */,
 				0FEFC9AB1681A3B600567F53 /* DFGOSRExitJumpPlaceholder.h in Headers */,
 				0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */,
 				0F6237981AE45CA700D402EA /* DFGPhantomInsertionPhase.h in Headers */,
@@ -8218,6 +8223,7 @@
 				0FFFC95C14EF90AF00C72532 /* DFGPhase.h in Headers */,
 				0F2B9CEB19D0BA7D00B1D1B5 /* DFGPhiChildren.h in Headers */,
 				A78A977B179738B8009DF744 /* DFGPlan.h in Headers */,
+				0F1FB3961E1AF7E100A9BE50 /* DFGPlanInlines.h in Headers */,
 				DC00039319D8BE6F00023EB0 /* DFGPreciseLocalClobberize.h in Headers */,
 				0FBE0F7516C1DB0B0082C5E8 /* DFGPredictionInjectionPhase.h in Headers */,
 				0FFFC95E14EF90B700C72532 /* DFGPredictionPropagationPhase.h in Headers */,
@@ -8248,6 +8254,7 @@
 				0F2FCCFF18A60070001A27F8 /* DFGThreadData.h in Headers */,
 				0FC097A2146B28CC00CF2442 /* DFGThunks.h in Headers */,
 				0FD8A32817D51F5700CA2C40 /* DFGTierUpCheckInjectionPhase.h in Headers */,
+				ADFF2F701E319DE3001EA54E /* DFGTierUpEntryTrigger.h in Headers */,
 				0FD8A32A17D51F5700CA2C40 /* DFGToFTLDeferredCompilationCallback.h in Headers */,
 				0FD8A32C17D51F5700CA2C40 /* DFGToFTLForOSREntryDeferredCompilationCallback.h in Headers */,
 				0FE7211E193B9C590031F6ED /* DFGTransition.h in Headers */,
@@ -8265,6 +8272,7 @@
 				0FFFC96014EF90BD00C72532 /* DFGVirtualRegisterAllocationPhase.h in Headers */,
 				0FC97F4218202119002C9B26 /* DFGWatchpointCollectionPhase.h in Headers */,
 				0FDB2CE8174830A2007B3C1B /* DFGWorklist.h in Headers */,
+				0F1FB3971E1AF7E300A9BE50 /* DFGWorklistInlines.h in Headers */,
 				0FE050181AA9091100D33B33 /* DirectArguments.h in Headers */,
 				0FE050161AA9091100D33B33 /* DirectArgumentsOffset.h in Headers */,
 				969A07980ED1D3AE00F1F681 /* DirectEvalCodeCache.h in Headers */,
@@ -8371,7 +8379,6 @@
 				52B310FB1974AE610080857C /* FunctionHasExecutedCache.h in Headers */,
 				FE4BFF2C1AD476E700088F87 /* FunctionOverrides.h in Headers */,
 				BC18C4050E16F5CD00B34460 /* FunctionPrototype.h in Headers */,
-				7919B7801E03559C005BEED8 /* B3Compile.h in Headers */,
 				62D2D3901ADF103F000206C1 /* FunctionRareData.h in Headers */,
 				FEA0C4031CDD7D1D00481991 /* FunctionWhitelist.h in Headers */,
 				2AACE63D18CA5A0300ED0191 /* GCActivityCallback.h in Headers */,
@@ -8387,10 +8394,8 @@
 				A54E8EB018BFFBBB00556D28 /* GCSegmentedArray.h in Headers */,
 				A54E8EB118BFFBBE00556D28 /* GCSegmentedArrayInlines.h in Headers */,
 				0F86A26F1D6F7B3300CB0C92 /* GCTypeMap.h in Headers */,
-				0F7DF1381E2970E40095951B /* SubspaceInlines.h in Headers */,
 				9959E9311BD18272001AA413 /* generate-combined-inspector-json.py in Headers */,
 				C4703CC0192844960013FBEA /* generate-inspector-protocol-bindings.py in Headers */,
-				0F7DF1461E2BEF6A0095951B /* MarkedAllocatorInlines.h in Headers */,
 				99DA00AF1BD5994E00F4575C /* generate-js-builtins.py in Headers */,
 				A5EA70EC19F5B3EA0098F5EC /* generate_cpp_alternate_backend_dispatcher_header.py in Headers */,
 				A5EF9B141A1D43F600702E90 /* generate_cpp_backend_dispatcher_header.py in Headers */,
@@ -8425,7 +8430,6 @@
 				0F0332C418B01763005F979A /* GetByIdVariant.h in Headers */,
 				7964656A1B952FF0003059EE /* GetPutInfo.h in Headers */,
 				14AD910E1DCA92940014F9FE /* GlobalCodeBlock.h in Headers */,
-				79DAE27A1E03C82200B526AA /* WasmExceptionType.h in Headers */,
 				0F24E54417EA9F5900ABB217 /* GPRInfo.h in Headers */,
 				142E3134134FF0A600AFADB5 /* Handle.h in Headers */,
 				C283190016FE4B7D00157BFD /* HandleBlock.h in Headers */,
@@ -8521,7 +8525,6 @@
 				A1D793011B43864B004516F5 /* IntlNumberFormatPrototype.h in Headers */,
 				A125846F1B45A36000CC7F6C /* IntlNumberFormatPrototype.lut.h in Headers */,
 				A12BBFF21B044A8B00664B69 /* IntlObject.h in Headers */,
-				0F1FB3971E1AF7E300A9BE50 /* DFGWorklistInlines.h in Headers */,
 				708EBE241CE8F35800453146 /* IntlObjectInlines.h in Headers */,
 				860BD801148EA6F200112B2F /* Intrinsic.h in Headers */,
 				8B9F6D561D5912FA001C739F /* IterationKind.h in Headers */,
@@ -8552,7 +8555,6 @@
 				FE187A021BFBE5610038BBCA /* JITMulGenerator.h in Headers */,
 				FE99B2491C24C3D300C82159 /* JITNegGenerator.h in Headers */,
 				0F24E54D17EE274900ABB217 /* JITOperations.h in Headers */,
-				0F7DF1371E2970E10095951B /* Subspace.h in Headers */,
 				FE3A06C01C11041A00390FDD /* JITRightShiftGenerator.h in Headers */,
 				0F766D3115AA8112008F363E /* JITStubRoutine.h in Headers */,
 				0F766D2C15A8CC3A008F363E /* JITStubRoutineSet.h in Headers */,
@@ -8598,6 +8600,7 @@
 				996B731C1BDA08DD00331B84 /* JSDataViewPrototype.lut.h in Headers */,
 				978801411471AD920041B016 /* JSDateMath.h in Headers */,
 				C2A7F688160432D400F76B98 /* JSDestructibleObject.h in Headers */,
+				0F7DF13C1E2971130095951B /* JSDestructibleObjectSubspace.h in Headers */,
 				FE384EE61ADDB7AD0055DE2C /* JSDollarVM.h in Headers */,
 				FE384EE81ADDB7AD0055DE2C /* JSDollarVMPrototype.h in Headers */,
 				BC18C42D0E16F5CD00B34460 /* JSEnvironmentRecord.h in Headers */,
@@ -8607,9 +8610,7 @@
 				0F2B66EF17B6B5AB00A7AE3F /* JSFloat32Array.h in Headers */,
 				0F2B66F017B6B5AB00A7AE3F /* JSFloat64Array.h in Headers */,
 				BC18C41F0E16F5CD00B34460 /* JSFunction.h in Headers */,
-				0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */,
 				A72028BA1797603D0098028C /* JSFunctionInlines.h in Headers */,
-				0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */,
 				70B7919C1C024A49002481E2 /* JSGeneratorFunction.h in Headers */,
 				0F2B66F117B6B5AB00A7AE3F /* JSGenericTypedArrayView.h in Headers */,
 				0F2B66F217B6B5AB00A7AE3F /* JSGenericTypedArrayViewConstructor.h in Headers */,
@@ -8670,7 +8671,6 @@
 				7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */,
 				996B731F1BDA08EF00331B84 /* JSPromisePrototype.lut.h in Headers */,
 				2A05ABD61961DF2400341750 /* JSPropertyNameEnumerator.h in Headers */,
-				0F7DF13C1E2971130095951B /* JSDestructibleObjectSubspace.h in Headers */,
 				E3EF88751B66DF23003F26CB /* JSPropertyNameIterator.h in Headers */,
 				862553D216136E1A009F17D0 /* JSProxy.h in Headers */,
 				A552C3801ADDB8FE00139726 /* JSRemoteInspector.h in Headers */,
@@ -8677,11 +8677,13 @@
 				9928FF3C18AC4AEC00B8CF12 /* JSReplayInputs.h in Headers */,
 				BC18C4260E16F5CD00B34460 /* JSRetainPtr.h in Headers */,
 				14874AE615EBDE4A002E3587 /* JSScope.h in Headers */,
+				9064337DD4B0402BAF34A592 /* JSScriptFetcher.h in Headers */,
 				A7C0C4AC168103020017011D /* JSScriptRefPrivate.h in Headers */,
 				0F919D11157F332C004A4E7D /* JSSegmentedVariableObject.h in Headers */,
+				0F4F82881E2FFDE00075184C /* JSSegmentedVariableObjectSubspace.h in Headers */,
 				A7299D9E17D12837005F5FF9 /* JSSet.h in Headers */,
-				0F7DF1341E2970D70095951B /* ConstraintVolatility.h in Headers */,
 				A790DD70182F499700588807 /* JSSetIterator.h in Headers */,
+				BDFCB2BBE90F41349E1B0BED /* JSSourceCode.h in Headers */,
 				BC18C4270E16F5CD00B34460 /* JSString.h in Headers */,
 				86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */,
 				FEFD6FC61D5E7992008F2F0B /* JSStringInlines.h in Headers */,
@@ -8690,6 +8692,7 @@
 				BC18C4280E16F5CD00B34460 /* JSStringRef.h in Headers */,
 				BC18C4290E16F5CD00B34460 /* JSStringRefCF.h in Headers */,
 				1A28D4A8177B71C80007FA3C /* JSStringRefPrivate.h in Headers */,
+				0F7DF13F1E2AFC4D0095951B /* JSStringSubspace.h in Headers */,
 				0F919D0D157EE0A2004A4E7D /* JSSymbolTableObject.h in Headers */,
 				70ECA6061AFDBEA200449739 /* JSTemplateRegistryKey.h in Headers */,
 				BC18C42A0E16F5CD00B34460 /* JSType.h in Headers */,
@@ -8718,6 +8721,7 @@
 				AD2FCBE31DB58DAD00B3E736 /* JSWebAssemblyCompileError.h in Headers */,
 				796FB43A1DFF8C3F0039C95D /* JSWebAssemblyHelpers.h in Headers */,
 				AD2FCBE51DB58DAD00B3E736 /* JSWebAssemblyInstance.h in Headers */,
+				ADE802991E08F1DE0058DE78 /* JSWebAssemblyLinkError.h in Headers */,
 				AD2FCBE71DB58DAD00B3E736 /* JSWebAssemblyMemory.h in Headers */,
 				AD2FCC051DB58DAD00B3E736 /* JSWebAssemblyModule.h in Headers */,
 				AD2FCBE91DB58DAD00B3E736 /* JSWebAssemblyRuntimeError.h in Headers */,
@@ -8724,7 +8728,6 @@
 				AD2FCBEB1DB58DAD00B3E736 /* JSWebAssemblyTable.h in Headers */,
 				1442566215EDE98D0066A49B /* JSWithScope.h in Headers */,
 				86E3C619167BABEE006D760A /* JSWrapperMap.h in Headers */,
-				0F1FB38F1E173A6700A9BE50 /* SynchronousStopTheWorldMutatorScheduler.h in Headers */,
 				BC18C42E0E16F5CD00B34460 /* JSWrapperObject.h in Headers */,
 				BCFD8C930EEB2EE700283848 /* JumpTable.h in Headers */,
 				A72FFD64139985A800E5365A /* KeywordLookup.h in Headers */,
@@ -8770,7 +8773,6 @@
 				863B23E00FC6118900703AA4 /* MacroAssemblerCodeRef.h in Headers */,
 				E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */,
 				86C568E111A213EE0007F7F0 /* MacroAssemblerMIPS.h in Headers */,
-				0F1FB3961E1AF7E100A9BE50 /* DFGPlanInlines.h in Headers */,
 				FE68C6371B90DE040042BCB3 /* MacroAssemblerPrinter.h in Headers */,
 				86AE64A9135E5E1C00963012 /* MacroAssemblerSH4.h in Headers */,
 				860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */,
@@ -8781,10 +8783,14 @@
 				A74DEF94182D991400522C22 /* MapIteratorPrototype.h in Headers */,
 				A700873E17CBE8D300C3E643 /* MapPrototype.h in Headers */,
 				C2B916C214DA014E00CBAC86 /* MarkedAllocator.h in Headers */,
+				0F7DF1461E2BEF6A0095951B /* MarkedAllocatorInlines.h in Headers */,
 				142D6F0913539A2800B02E86 /* MarkedBlock.h in Headers */,
 				0F7C5FB81D888A0C0044F5E2 /* MarkedBlockInlines.h in Headers */,
 				141448CB13A176EC00F5BA1A /* MarkedBlockSet.h in Headers */,
 				14D2F3DB139F4BE200491031 /* MarkedSpace.h in Headers */,
+				0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */,
+				0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */,
+				0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */,
 				142D6F1213539A4100B02E86 /* MarkStack.h in Headers */,
 				8612E4CD152389EC00C836BE /* MatchResult.h in Headers */,
 				4340A4851A9051AF00D73CCA /* MathCommon.h in Headers */,
@@ -8801,6 +8807,7 @@
 				14AD910F1DCA92940014F9FE /* ModuleProgramCodeBlock.h in Headers */,
 				147341D61DC02EB900AA29BA /* ModuleProgramExecutable.h in Headers */,
 				A79D3ED9C5064DD0A8466A3A /* ModuleScopeData.h in Headers */,
+				0F1FB3991E1F65FB00A9BE50 /* MutatorScheduler.h in Headers */,
 				0FA762071DB9243300B7A2FD /* MutatorState.h in Headers */,
 				BC02E9110E1839DB000F9297 /* NativeErrorConstructor.h in Headers */,
 				BC02E9130E1839DB000F9297 /* NativeErrorPrototype.h in Headers */,
@@ -8930,6 +8937,7 @@
 				A503FA22188EFF6800110F14 /* ScriptDebugListener.h in Headers */,
 				A503FA26188EFFFD00110F14 /* ScriptDebugServer.h in Headers */,
 				147341CE1DC02D7900AA29BA /* ScriptExecutable.h in Headers */,
+				CEAE7D7B889B477BA93ABA6C /* ScriptFetcher.h in Headers */,
 				A55D93A6185012A800400DED /* ScriptFunctionCall.h in Headers */,
 				A54CF2FA184EAEDA00237F19 /* ScriptObject.h in Headers */,
 				A55165D51BDF135A003B75C1 /* ScriptProfilingScope.h in Headers */,
@@ -8950,6 +8958,7 @@
 				FE187A0F1C030D6C0038BBCA /* SnippetOperand.h in Headers */,
 				14201D591DECF26A00904BD3 /* SourceCode.h in Headers */,
 				70B791911C024A13002481E2 /* SourceCodeKey.h in Headers */,
+				2D342F36F7244096804ADB24 /* SourceOrigin.h in Headers */,
 				BC18C4630E16F5CD00B34460 /* SourceProvider.h in Headers */,
 				E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */,
 				E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */,
@@ -8964,6 +8973,7 @@
 				A7C1EAF217987AB600299DB2 /* StackVisitor.h in Headers */,
 				14DF04DA16B3996D0016A513 /* StaticPropertyAnalysis.h in Headers */,
 				14CA958B16AB50DE00938A06 /* StaticPropertyAnalyzer.h in Headers */,
+				0F4F828C1E31B9760075184C /* StochasticSpaceTimeMutatorScheduler.h in Headers */,
 				0F7CF9521DC027D90098CC12 /* StopIfNecessaryTimer.h in Headers */,
 				A730B6121250068F009D25B1 /* StrictEvalActivation.h in Headers */,
 				BC18C4660E16F5CD00B34460 /* StringConstructor.h in Headers */,
@@ -8985,8 +8995,9 @@
 				0F766D3915AE4A1F008F363E /* StructureStubClearingWatchpoint.h in Headers */,
 				BCCF0D080EF0AAB900413C8F /* StructureStubInfo.h in Headers */,
 				BC9041480EB9250900FE26FA /* StructureTransitionTable.h in Headers */,
+				0F7DF1371E2970E10095951B /* Subspace.h in Headers */,
+				0F7DF1381E2970E40095951B /* SubspaceInlines.h in Headers */,
 				0F4A38FA1C8E13DF00190318 /* SuperSampler.h in Headers */,
-				0F1FB3991E1F65FB00A9BE50 /* MutatorScheduler.h in Headers */,
 				705B41AC1A6E501E00716757 /* Symbol.h in Headers */,
 				705B41AE1A6E501E00716757 /* SymbolConstructor.h in Headers */,
 				996B73271BDA08EF00331B84 /* SymbolConstructor.lut.h in Headers */,
@@ -8994,6 +9005,7 @@
 				705B41B21A6E501E00716757 /* SymbolPrototype.h in Headers */,
 				996B73281BDA08EF00331B84 /* SymbolPrototype.lut.h in Headers */,
 				BC18C46B0E16F5CD00B34460 /* SymbolTable.h in Headers */,
+				0F1FB38F1E173A6700A9BE50 /* SynchronousStopTheWorldMutatorScheduler.h in Headers */,
 				A784A26411D16622005776AC /* SyntaxChecker.h in Headers */,
 				DC7997831CDE9FA0004D4A09 /* TagRegistersMode.h in Headers */,
 				70ECA6081AFDBEA200449739 /* TemplateRegistry.h in Headers */,
@@ -9049,6 +9061,7 @@
 				0F6C73511AC9F99F00BE1682 /* VariableWriteFireDetail.h in Headers */,
 				0FE0502D1AA9095600D33B33 /* VarOffset.h in Headers */,
 				0F426A491460CBB700131F8F /* VirtualRegister.h in Headers */,
+				0F1FB3931E177A7200A9BE50 /* VisitingTimeout.h in Headers */,
 				0F952AA11DF7860900E06FBD /* VisitRaceKey.h in Headers */,
 				BC18C4200E16F5CD00B34460 /* VM.h in Headers */,
 				658D3A5619638268003C45D6 /* VMEntryRecord.h in Headers */,
@@ -9057,6 +9070,7 @@
 				53F40E931D5A4AB30099A1B6 /* WasmB3IRGenerator.h in Headers */,
 				AD4B1DFA1DF244E20071AE32 /* WasmBinding.h in Headers */,
 				53FD04D41D7AB291003287D3 /* WasmCallingConvention.h in Headers */,
+				79DAE27A1E03C82200B526AA /* WasmExceptionType.h in Headers */,
 				7BC547D31B6959A100959B58 /* WasmFormat.h in Headers */,
 				53F40E8B1D5901BB0099A1B6 /* WasmFunctionParser.h in Headers */,
 				535557141D9D9EA5006D583B /* WasmMemory.h in Headers */,
@@ -9067,6 +9081,7 @@
 				53F40E8D1D5901F20099A1B6 /* WasmParser.h in Headers */,
 				531374BD1D5CE67600AF7A0B /* WasmPlan.h in Headers */,
 				53F40E851D58F9770099A1B6 /* WasmSections.h in Headers */,
+				AD7438C01E0457A400FD0C2A /* WasmSignature.h in Headers */,
 				53FF7F991DBFCD9000A26CCC /* WasmValidate.h in Headers */,
 				FED94F2F171E3E2300BE77A4 /* Watchdog.h in Headers */,
 				0F919D2615853CE3004A4E7D /* Watchpoint.h in Headers */,
@@ -9094,6 +9109,8 @@
 				AD2FCC181DB59CB200B3E736 /* WebAssemblyInstanceConstructor.lut.h in Headers */,
 				AD2FCBF31DB58DAD00B3E736 /* WebAssemblyInstancePrototype.h in Headers */,
 				AD2FCC191DB59CB200B3E736 /* WebAssemblyInstancePrototype.lut.h in Headers */,
+				ADE8029A1E08F1DE0058DE78 /* WebAssemblyLinkErrorConstructor.h in Headers */,
+				ADE8029C1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.h in Headers */,
 				AD2FCBF51DB58DAD00B3E736 /* WebAssemblyMemoryConstructor.h in Headers */,
 				AD2FCC1A1DB59CB200B3E736 /* WebAssemblyMemoryConstructor.lut.h in Headers */,
 				AD2FCBF71DB58DAD00B3E736 /* WebAssemblyMemoryPrototype.h in Headers */,
@@ -9676,6 +9693,7 @@
 				0F24E54017EA9F5900ABB217 /* AssemblyHelpers.cpp in Sources */,
 				5B70CFE31DB69E6600EC23F9 /* AsyncFunctionConstructor.cpp in Sources */,
 				5B70CFE11DB69E6600EC23F9 /* AsyncFunctionPrototype.cpp in Sources */,
+				6A38CFA91E32B5AB0060206F /* AsyncStackTrace.cpp in Sources */,
 				0F7CF9561DC1258D0098CC12 /* AtomicsObject.cpp in Sources */,
 				0FEC84FE1BDACDAC0080FF74 /* B3ArgumentRegValue.cpp in Sources */,
 				0FEC85001BDACDAC0080FF74 /* B3BasicBlock.cpp in Sources */,
@@ -9688,6 +9706,7 @@
 				0FEC85091BDACDAC0080FF74 /* B3Common.cpp in Sources */,
 				0FEC850B1BDACDAC0080FF74 /* B3Commutativity.cpp in Sources */,
 				0F338E0B1BF0276C0013C88F /* B3Compilation.cpp in Sources */,
+				795F099D1E03600500BBE37F /* B3Compile.cpp in Sources */,
 				0FEC850D1BDACDAC0080FF74 /* B3Const32Value.cpp in Sources */,
 				0FEC850F1BDACDAC0080FF74 /* B3Const64Value.cpp in Sources */,
 				0FEC85111BDACDAC0080FF74 /* B3ConstDoubleValue.cpp in Sources */,
@@ -9793,7 +9812,6 @@
 				A7E5A3A71797432D00E893C0 /* CompilationResult.cpp in Sources */,
 				147F39C2107EC37600427A48 /* Completion.cpp in Sources */,
 				0F6FC750196110A800E1D02D /* ComplexGetStatus.cpp in Sources */,
-				0F1FB38E1E173A6500A9BE50 /* SynchronousStopTheWorldMutatorScheduler.cpp in Sources */,
 				146B16D812EB5B59001BEC1B /* ConservativeRoots.cpp in Sources */,
 				A5B6A74D18C6DBA600F11E91 /* ConsoleClient.cpp in Sources */,
 				A5FD0079189B051000633231 /* ConsoleMessage.cpp in Sources */,
@@ -9809,7 +9827,6 @@
 				147F39C4107EC37600427A48 /* DateConversion.cpp in Sources */,
 				147F39C5107EC37600427A48 /* DateInstance.cpp in Sources */,
 				147F39C6107EC37600427A48 /* DatePrototype.cpp in Sources */,
-				0F660E391E0517BF0031462C /* MarkingConstraintSet.cpp in Sources */,
 				14280823107EC02C0013E7B2 /* Debugger.cpp in Sources */,
 				149559EE0DDCDDF700648087 /* DebuggerCallFrame.cpp in Sources */,
 				A5FC84B31D1DDAD9006B5C46 /* DebuggerLocation.cpp in Sources */,
@@ -9929,7 +9946,6 @@
 				0FB17662196B8F9E0091052A /* DFGPureValue.cpp in Sources */,
 				0F3A1BF91A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp in Sources */,
 				0F2FCCFB18A60070001A27F8 /* DFGSafepoint.cpp in Sources */,
-				795F099D1E03600500BBE37F /* B3Compile.cpp in Sources */,
 				86EC9DD21328DF82002B2AD7 /* DFGSpeculativeJIT.cpp in Sources */,
 				86880F1F14328BB900B08D42 /* DFGSpeculativeJIT32_64.cpp in Sources */,
 				86880F4D14353B2100B08D42 /* DFGSpeculativeJIT64.cpp in Sources */,
@@ -9941,12 +9957,10 @@
 				0F7F988B1D9596C500F4F12E /* DFGStoreBarrierClusteringPhase.cpp in Sources */,
 				0F9E32631B05AB0400801ED5 /* DFGStoreBarrierInsertionPhase.cpp in Sources */,
 				0FC20CB51852E2C600C9E954 /* DFGStrengthReductionPhase.cpp in Sources */,
-				0F7DF13B1E2971110095951B /* JSDestructibleObjectSubspace.cpp in Sources */,
 				0F893BDB1936E23C001211F4 /* DFGStructureAbstractValue.cpp in Sources */,
 				0F2FCCFE18A60070001A27F8 /* DFGThreadData.cpp in Sources */,
 				0FC097A1146B28CA00CF2442 /* DFGThunks.cpp in Sources */,
 				0FD8A32717D51F5700CA2C40 /* DFGTierUpCheckInjectionPhase.cpp in Sources */,
-				0F4F828B1E31B9740075184C /* StochasticSpaceTimeMutatorScheduler.cpp in Sources */,
 				0FD8A32917D51F5700CA2C40 /* DFGToFTLDeferredCompilationCallback.cpp in Sources */,
 				0FD8A32B17D51F5700CA2C40 /* DFGToFTLForOSREntryDeferredCompilationCallback.cpp in Sources */,
 				0FE7211D193B9C590031F6ED /* DFGTransition.cpp in Sources */,
@@ -10153,7 +10167,6 @@
 				5B70CFDF1DB69E6600EC23F9 /* JSAsyncFunction.cpp in Sources */,
 				1421359B0A677F4F00A8195E /* JSBase.cpp in Sources */,
 				86FA9E91142BBB2E001773B7 /* JSBoundFunction.cpp in Sources */,
-				0F7DF1401E2AFC500095951B /* JSStringSubspace.cpp in Sources */,
 				1440F8AF0A508D200005F061 /* JSCallbackConstructor.cpp in Sources */,
 				1440F8920A508B100005F061 /* JSCallbackFunction.cpp in Sources */,
 				14ABDF600A437FEF00ECCA01 /* JSCallbackObject.cpp in Sources */,
@@ -10169,6 +10182,7 @@
 				0F2B66EB17B6B5AB00A7AE3F /* JSDataView.cpp in Sources */,
 				0F2B66ED17B6B5AB00A7AE3F /* JSDataViewPrototype.cpp in Sources */,
 				978801401471AD920041B016 /* JSDateMath.cpp in Sources */,
+				0F7DF13B1E2971110095951B /* JSDestructibleObjectSubspace.cpp in Sources */,
 				FE384EE51ADDB7AD0055DE2C /* JSDollarVM.cpp in Sources */,
 				FE384EE71ADDB7AD0055DE2C /* JSDollarVMPrototype.cpp in Sources */,
 				147F39D7107EC37600427A48 /* JSEnvironmentRecord.cpp in Sources */,
@@ -10181,7 +10195,6 @@
 				A5C3A1A518C0490200C9593A /* JSGlobalObjectConsoleClient.cpp in Sources */,
 				A59455921824744700CC3843 /* JSGlobalObjectDebuggable.cpp in Sources */,
 				A57D23E91891B0770031C7FA /* JSGlobalObjectDebuggerAgent.cpp in Sources */,
-				0F7DF1361E2970DF0095951B /* Subspace.cpp in Sources */,
 				14E9D17B107EC469004DDA21 /* JSGlobalObjectFunctions.cpp in Sources */,
 				A51007C0187CC3C600B38879 /* JSGlobalObjectInspectorController.cpp in Sources */,
 				A50E4B6318809DD50068A46D /* JSGlobalObjectRuntimeAgent.cpp in Sources */,
@@ -10218,15 +10231,19 @@
 				A552C37F1ADDB8FE00139726 /* JSRemoteInspector.cpp in Sources */,
 				9928FF3B18AC4AEC00B8CF12 /* JSReplayInputs.cpp in Sources */,
 				14874AE515EBDE4A002E3587 /* JSScope.cpp in Sources */,
+				14815F5F991C46BEB98D0016 /* JSScriptFetcher.cpp in Sources */,
 				A7C0C4AD1681067E0017011D /* JSScriptRef.cpp in Sources */,
 				0F919D10157F3329004A4E7D /* JSSegmentedVariableObject.cpp in Sources */,
+				0F4F82871E2FFDDD0075184C /* JSSegmentedVariableObjectSubspace.cpp in Sources */,
 				A7299D9D17D12837005F5FF9 /* JSSet.cpp in Sources */,
 				A790DD6F182F499700588807 /* JSSetIterator.cpp in Sources */,
+				FA3AB211C8494524AB390267 /* JSSourceCode.cpp in Sources */,
 				147F39D5107EC37600427A48 /* JSString.cpp in Sources */,
 				70EC0EC21AA0D7DA00B6AAFA /* JSStringIterator.cpp in Sources */,
 				2600B5A6152BAAA70091EE5F /* JSStringJoiner.cpp in Sources */,
 				1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */,
 				146AAB380B66A94400E55F16 /* JSStringRefCF.cpp in Sources */,
+				0F7DF1401E2AFC500095951B /* JSStringSubspace.cpp in Sources */,
 				0F919D0C157EE09F004A4E7D /* JSSymbolTableObject.cpp in Sources */,
 				70ECA6051AFDBEA200449739 /* JSTemplateRegistryKey.cpp in Sources */,
 				53486BBB1C18E84500F6F3AF /* JSTypedArray.cpp in Sources */,
@@ -10284,6 +10301,8 @@
 				C2B916C514DA040C00CBAC86 /* MarkedAllocator.cpp in Sources */,
 				142D6F0813539A2800B02E86 /* MarkedBlock.cpp in Sources */,
 				14D2F3DA139F4BE200491031 /* MarkedSpace.cpp in Sources */,
+				0F660E371E0517B90031462C /* MarkingConstraint.cpp in Sources */,
+				0F660E391E0517BF0031462C /* MarkingConstraintSet.cpp in Sources */,
 				142D6F1113539A4100B02E86 /* MarkStack.cpp in Sources */,
 				DC69AA661CF7A1F200C6272F /* MatchResult.cpp in Sources */,
 				4340A4841A9051AF00D73CCA /* MathCommon.cpp in Sources */,
@@ -10294,6 +10313,7 @@
 				E355F3521B7DC85300C50DC5 /* ModuleLoaderPrototype.cpp in Sources */,
 				14AD91181DCA97FD0014F9FE /* ModuleProgramCodeBlock.cpp in Sources */,
 				147341E41DC2CE9600AA29BA /* ModuleProgramExecutable.cpp in Sources */,
+				0F1FB3901E173A6B00A9BE50 /* MutatorScheduler.cpp in Sources */,
 				0FA762061DB9243100B7A2FD /* MutatorState.cpp in Sources */,
 				14469DE0107EC7E700650446 /* NativeErrorConstructor.cpp in Sources */,
 				14469DE1107EC7E700650446 /* NativeErrorPrototype.cpp in Sources */,
@@ -10405,11 +10425,11 @@
 				0FD82E86141F3FF100179C94 /* SpeculatedType.cpp in Sources */,
 				0F6DB7EA1D6124B800CDBF8E /* StackFrame.cpp in Sources */,
 				A7C1EAF117987AB600299DB2 /* StackVisitor.cpp in Sources */,
+				0F4F828B1E31B9740075184C /* StochasticSpaceTimeMutatorScheduler.cpp in Sources */,
 				0F7CF9531DC027DB0098CC12 /* StopIfNecessaryTimer.cpp in Sources */,
 				A730B6131250068F009D25B1 /* StrictEvalActivation.cpp in Sources */,
 				14469DEB107EC7E700650446 /* StringConstructor.cpp in Sources */,
 				70EC0EC61AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp in Sources */,
-				0F1FB3901E173A6B00A9BE50 /* MutatorScheduler.cpp in Sources */,
 				14469DEC107EC7E700650446 /* StringObject.cpp in Sources */,
 				14469DED107EC7E700650446 /* StringPrototype.cpp in Sources */,
 				9335F24D12E6765B002B5553 /* StringRecursionChecker.cpp in Sources */,
@@ -10420,6 +10440,7 @@
 				0FB438A319270B1D00E1FBC9 /* StructureSet.cpp in Sources */,
 				0F766D3815AE4A1C008F363E /* StructureStubClearingWatchpoint.cpp in Sources */,
 				BCCF0D0C0EF0B8A500413C8F /* StructureStubInfo.cpp in Sources */,
+				0F7DF1361E2970DF0095951B /* Subspace.cpp in Sources */,
 				0F4A38F91C8E13DF00190318 /* SuperSampler.cpp in Sources */,
 				705B41AB1A6E501E00716757 /* Symbol.cpp in Sources */,
 				705B41AD1A6E501E00716757 /* SymbolConstructor.cpp in Sources */,
@@ -10426,6 +10447,7 @@
 				705B41AF1A6E501E00716757 /* SymbolObject.cpp in Sources */,
 				705B41B11A6E501E00716757 /* SymbolPrototype.cpp in Sources */,
 				0F919D2815856773004A4E7D /* SymbolTable.cpp in Sources */,
+				0F1FB38E1E173A6500A9BE50 /* SynchronousStopTheWorldMutatorScheduler.cpp in Sources */,
 				DC7997841CDE9FA2004D4A09 /* TagRegistersMode.cpp in Sources */,
 				70ECA6071AFDBEA200449739 /* TemplateRegistry.cpp in Sources */,
 				78274D8E4C4D4FCD9A1DC6E6 /* TemplateRegistryKey.cpp in Sources */,
@@ -10461,7 +10483,6 @@
 				0F24E55817F74EDB00ABB217 /* ValueRecovery.cpp in Sources */,
 				79EE0BFF1B4AFB85000385C9 /* VariableEnvironment.cpp in Sources */,
 				0F6C73501AC9F99F00BE1682 /* VariableWriteFireDetail.cpp in Sources */,
-				0F660E371E0517B90031462C /* MarkingConstraint.cpp in Sources */,
 				0FE0502C1AA9095600D33B33 /* VarOffset.cpp in Sources */,
 				0F20C2591A8013AB00DA3229 /* VirtualRegister.cpp in Sources */,
 				0F952AA21DF7860D00E06FBD /* VisitRaceKey.cpp in Sources */,
@@ -10474,7 +10495,9 @@
 				535557161D9DFA32006D583B /* WasmMemory.cpp in Sources */,
 				79B759741DFA4C600052174C /* WasmMemoryInformation.cpp in Sources */,
 				53F40E971D5A7BEC0099A1B6 /* WasmModuleParser.cpp in Sources */,
+				ADB6F67D1E15D7600082F384 /* WasmPageCount.cpp in Sources */,
 				531374BF1D5CE95000AF7A0B /* WasmPlan.cpp in Sources */,
+				AD7438C11E0457AA00FD0C2A /* WasmSignature.cpp in Sources */,
 				53FF7F9B1DBFD2B900A26CCC /* WasmValidate.cpp in Sources */,
 				FED94F2E171E3E2300BE77A4 /* Watchdog.cpp in Sources */,
 				0F919D2515853CE0004A4E7D /* Watchpoint.cpp in Sources */,
@@ -10492,6 +10515,8 @@
 				AD4937D31DDD27DE0077C807 /* WebAssemblyFunction.cpp in Sources */,
 				AD2FCBF01DB58DAD00B3E736 /* WebAssemblyInstanceConstructor.cpp in Sources */,
 				AD2FCBF21DB58DAD00B3E736 /* WebAssemblyInstancePrototype.cpp in Sources */,
+				ADE8029E1E08F2280058DE78 /* WebAssemblyLinkErrorConstructor.cpp in Sources */,
+				ADE8029B1E08F1DE0058DE78 /* WebAssemblyLinkErrorPrototype.cpp in Sources */,
 				AD2FCBF41DB58DAD00B3E736 /* WebAssemblyMemoryConstructor.cpp in Sources */,
 				AD2FCBF61DB58DAD00B3E736 /* WebAssemblyMemoryPrototype.cpp in Sources */,
 				AD2FCC001DB58DAD00B3E736 /* WebAssemblyModuleConstructor.cpp in Sources */,

Added: branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.cpp (0 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.cpp	                        (rev 0)
+++ branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.cpp	2017-02-01 21:26:44 UTC (rev 211519)
@@ -0,0 +1,194 @@
+/*
+ * 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 "config.h"
+#include "AsyncStackTrace.h"
+
+#include "InspectorValues.h"
+#include "ScriptCallStack.h"
+
+namespace Inspector {
+
+RefPtr<AsyncStackTrace> AsyncStackTrace::create(RefPtr<ScriptCallStack> callStack, bool singleShot, RefPtr<AsyncStackTrace> parent)
+{
+    ASSERT(callStack && callStack->size());
+    return adoptRef(*new AsyncStackTrace(WTFMove(callStack), singleShot, WTFMove(parent)));
+}
+
+AsyncStackTrace::AsyncStackTrace(RefPtr<ScriptCallStack> callStack, bool singleShot, RefPtr<AsyncStackTrace> parent)
+    : m_callStack(callStack)
+    , m_parent(parent)
+    , m_singleShot(singleShot)
+{
+    if (m_parent)
+        m_parent->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 > 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 && !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 && !m_childCount)
+        remove();
+
+    m_state = State::Canceled;
+}
+
+RefPtr<Inspector::Protocol::Console::StackTrace> AsyncStackTrace::buildInspectorObject() const
+{
+    RefPtr<Inspector::Protocol::Console::StackTrace> topStackTrace;
+    RefPtr<Inspector::Protocol::Console::StackTrace> previousStackTrace;
+
+    auto* stackTrace = this;
+    while (stackTrace) {
+        auto callStack = stackTrace->m_callStack;
+        ASSERT(callStack && callStack->size());
+
+        RefPtr<Inspector::Protocol::Console::StackTrace> protocolObject = Inspector::Protocol::Console::StackTrace::create()
+            .setCallFrames(callStack->buildInspectorArray())
+            .release();
+
+        if (stackTrace->m_truncated)
+            protocolObject->setTruncated(true);
+        if (callStack->at(0).isNative())
+            protocolObject->setTopCallFrameIsBoundary(true);
+
+        if (!topStackTrace)
+            topStackTrace = protocolObject;
+
+        if (previousStackTrace)
+            previousStackTrace->setParentStackTrace(protocolObject);
+
+        previousStackTrace = protocolObject;
+        stackTrace = stackTrace->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->m_callStack->size();
+        if (depth >= maxDepth)
+            break;
+
+        auto* parent = newStackTraceRoot->m_parent.get();
+        if (!lastUnlockedAncestor && parent && parent->isLocked())
+            lastUnlockedAncestor = newStackTraceRoot;
+
+        newStackTraceRoot = parent;
+    }
+
+    if (!newStackTraceRoot || !newStackTraceRoot->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->m_truncated = true;
+        newStackTraceRoot->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->m_parent) {
+        auto& parentNode = currentNode->m_parent;
+        currentNode->m_parent = AsyncStackTrace::create(parentNode->m_callStack, true, parentNode->m_parent);
+        currentNode = currentNode->m_parent.get();
+
+        if (parentNode.get() == newStackTraceRoot)
+            break;
+    }
+
+    currentNode->m_truncated = true;
+    currentNode->remove();
+
+    // Decrement the child count of the first locked ancestor after removing its subtree.
+    auto& firstLockedAncestor = lastUnlockedAncestor->m_parent;
+    firstLockedAncestor->m_childCount--;
+}
+
+void AsyncStackTrace::remove()
+{
+    if (!m_parent)
+        return;
+
+    ASSERT(m_parent->m_childCount);
+    m_parent->m_childCount--;
+    m_parent = nullptr;
+}
+
+} // namespace Inspector

Copied: branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.h (from rev 211518, branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css) (0 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.h	                        (rev 0)
+++ branches/safari-603-branch/Source/_javascript_Core/inspector/AsyncStackTrace.h	2017-02-01 21:26:44 UTC (rev 211519)
@@ -0,0 +1,72 @@
+/*
+ * 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 "InspectorProtocolObjects.h"
+#include <wtf/Forward.h>
+#include <wtf/RefCounted.h>
+
+namespace Inspector {
+
+class ScriptCallStack;
+
+class JS_EXPORT_PRIVATE AsyncStackTrace : public RefCounted<AsyncStackTrace> {
+public:
+    enum class State {
+        Pending,
+        Active,
+        Dispatched,
+        Canceled,
+    };
+
+    static RefPtr<AsyncStackTrace> create(RefPtr<ScriptCallStack>, bool singleShot, RefPtr<AsyncStackTrace> parent);
+
+    bool isPending() const;
+    bool isLocked() const;
+
+    void willDispatchAsyncCall(size_t maxDepth);
+    void didDispatchAsyncCall();
+    void didCancelAsyncCall();
+
+    RefPtr<Inspector::Protocol::Console::StackTrace> buildInspectorObject() const;
+
+    ~AsyncStackTrace();
+
+private:
+    AsyncStackTrace(RefPtr<ScriptCallStack>, bool, RefPtr<AsyncStackTrace>);
+
+    void truncate(size_t maxDepth);
+    void remove();
+
+    RefPtr<ScriptCallStack> m_callStack;
+    RefPtr<AsyncStackTrace> m_parent;
+    unsigned m_childCount { 0 };
+    State m_state { State::Pending };
+    bool m_truncated { false };
+    bool m_singleShot { true };
+};
+
+} // namespace Inspector

Modified: branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.cpp (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.cpp	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.cpp	2017-02-01 21:26:44 UTC (rev 211519)
@@ -30,6 +30,7 @@
 #include "config.h"
 #include "InspectorDebuggerAgent.h"
 
+#include "AsyncStackTrace.h"
 #include "ContentSearchUtilities.h"
 #include "InjectedScript.h"
 #include "InjectedScriptManager.h"
@@ -212,40 +213,6 @@
     return injectedScript.wrapObject(exception, InspectorDebuggerAgent::backtraceObjectGroup)->openAccessors();
 }
 
-RefPtr<Inspector::Protocol::Console::StackTrace> InspectorDebuggerAgent::buildAsyncStackTrace(const AsyncCallIdentifier& identifier)
-{
-    RefPtr<Inspector::Protocol::Console::StackTrace> topStackTrace;
-    RefPtr<Inspector::Protocol::Console::StackTrace> previousStackTrace;
-
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    auto end = m_asyncCallIdentifierToData.end();
-    while (iterator != end) {
-        const auto& callData = iterator->value;
-        ASSERT(callData.callStack && callData.callStack->size());
-        if (!callData.callStack || !callData.callStack->size())
-            break;
-
-        RefPtr<Inspector::Protocol::Console::StackTrace> stackTrace = Inspector::Protocol::Console::StackTrace::create()
-            .setCallFrames(callData.callStack->buildInspectorArray())
-            .release();
-
-        if (callData.callStack->at(0).isNative())
-            stackTrace->setTopCallFrameIsBoundary(true);
-        if (!topStackTrace)
-            topStackTrace = stackTrace;
-        if (previousStackTrace)
-            previousStackTrace->setParentStackTrace(stackTrace);
-
-        if (!callData.parentAsyncCallIdentifier)
-            break;
-
-        previousStackTrace = stackTrace;
-        iterator = m_asyncCallIdentifierToData.find(callData.parentAsyncCallIdentifier.value());
-    }
-
-    return topStackTrace;
-}
-
 void InspectorDebuggerAgent::handleConsoleAssert(const String& message)
 {
     if (!m_scriptDebugServer.breakpointsActive())
@@ -268,10 +235,17 @@
     if (!callStack || !callStack->size())
         return;
 
-    if (m_currentAsyncCallIdentifier)
-        refAsyncCallData(m_currentAsyncCallIdentifier.value());
+    RefPtr<AsyncStackTrace> parentStackTrace;
+    if (m_currentAsyncCallIdentifier) {
+        auto it = m_pendingAsyncCalls.find(m_currentAsyncCallIdentifier.value());
+        ASSERT(it != m_pendingAsyncCalls.end());
+        parentStackTrace = it->value;
+    }
 
-    m_asyncCallIdentifierToData.set(std::make_pair(asyncCallType, callbackIdentifier), AsyncCallData(callStack, m_currentAsyncCallIdentifier, singleShot));
+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto asyncStackTrace = AsyncStackTrace::create(WTFMove(callStack), singleShot, WTFMove(parentStackTrace));
+
+    m_pendingAsyncCalls.set(identifier, WTFMove(asyncStackTrace));
 }
 
 void InspectorDebuggerAgent::didCancelAsyncCall(int asyncCallType, int callbackIdentifier)
@@ -279,8 +253,18 @@
     if (!m_asyncStackTraceDepth)
         return;
 
-    const auto asyncCallIdentifier = std::make_pair(asyncCallType, callbackIdentifier);
-    derefAsyncCallData(asyncCallIdentifier);
+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto it = m_pendingAsyncCalls.find(identifier);
+    if (it == m_pendingAsyncCalls.end())
+        return;
+
+    auto& asyncStackTrace = it->value;
+    asyncStackTrace->didCancelAsyncCall();
+
+    if (m_currentAsyncCallIdentifier && m_currentAsyncCallIdentifier.value() == identifier)
+        return;
+
+    m_pendingAsyncCalls.remove(identifier);
 }
 
 void InspectorDebuggerAgent::willDispatchAsyncCall(int asyncCallType, int callbackIdentifier)
@@ -293,12 +277,15 @@
 
     // A call can be scheduled before the Inspector is opened, or while async stack
     // traces are disabled. If no call data exists, do nothing.
-    auto asyncCallIdentifier = std::make_pair(asyncCallType, callbackIdentifier);
-    if (!m_asyncCallIdentifierToData.contains(asyncCallIdentifier))
+    auto identifier = std::make_pair(asyncCallType, callbackIdentifier);
+    auto it = m_pendingAsyncCalls.find(identifier);
+    if (it == m_pendingAsyncCalls.end())
         return;
 
-    m_currentAsyncCallIdentifier = WTFMove(asyncCallIdentifier);
-    refAsyncCallData(asyncCallIdentifier);
+    auto& asyncStackTrace = it->value;
+    asyncStackTrace->willDispatchAsyncCall(m_asyncStackTraceDepth);
+
+    m_currentAsyncCallIdentifier = identifier;
 }
 
 void InspectorDebuggerAgent::didDispatchAsyncCall()
@@ -309,8 +296,17 @@
     if (!m_currentAsyncCallIdentifier)
         return;
 
-    derefAsyncCallData(m_currentAsyncCallIdentifier.value());
+    auto identifier = m_currentAsyncCallIdentifier.value();
+    auto it = m_pendingAsyncCalls.find(identifier);
+    ASSERT(it != m_pendingAsyncCalls.end());
+
+    auto& asyncStackTrace = it->value;
+    asyncStackTrace->didDispatchAsyncCall();
+
     m_currentAsyncCallIdentifier = std::nullopt;
+
+    if (!asyncStackTrace->isPending())
+        m_pendingAsyncCalls.remove(identifier);
 }
 
 static Ref<InspectorObject> buildObjectForBreakpointCookie(const String& url, int lineNumber, int columnNumber, const String& condition, RefPtr<InspectorArray>& actions, bool isRegex, bool autoContinue, unsigned ignoreCount)
@@ -998,8 +994,11 @@
     m_enablePauseWhenIdle = false;
 
     RefPtr<Inspector::Protocol::Console::StackTrace> asyncStackTrace;
-    if (m_currentAsyncCallIdentifier)
-        asyncStackTrace = buildAsyncStackTrace(m_currentAsyncCallIdentifier.value());
+    if (m_currentAsyncCallIdentifier) {
+        auto it = m_pendingAsyncCalls.find(m_currentAsyncCallIdentifier.value());
+        if (it != m_pendingAsyncCalls.end())
+            asyncStackTrace = it->value->buildInspectorObject();
+    }
 
     m_frontendDispatcher->paused(currentCallFrames(injectedScript), m_breakReason, m_breakAuxData, asyncStackTrace);
 
@@ -1135,33 +1134,8 @@
 
 void InspectorDebuggerAgent::clearAsyncStackTraceData()
 {
-    m_asyncCallIdentifierToData.clear();
+    m_pendingAsyncCalls.clear();
     m_currentAsyncCallIdentifier = std::nullopt;
 }
 
-void InspectorDebuggerAgent::refAsyncCallData(const AsyncCallIdentifier& identifier)
-{
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    if (iterator == m_asyncCallIdentifierToData.end())
-        return;
-
-    iterator->value.referenceCount++;
-}
-
-void InspectorDebuggerAgent::derefAsyncCallData(const AsyncCallIdentifier& identifier)
-{
-    auto iterator = m_asyncCallIdentifierToData.find(identifier);
-    if (iterator == m_asyncCallIdentifierToData.end())
-        return;
-
-    auto& asyncCallData = iterator->value;
-    asyncCallData.referenceCount--;
-    if (asyncCallData.referenceCount)
-        return;
-
-    if (asyncCallData.parentAsyncCallIdentifier)
-        derefAsyncCallData(asyncCallData.parentAsyncCallIdentifier.value());
-    m_asyncCallIdentifierToData.remove(identifier);
-}
-
 } // namespace Inspector

Modified: branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.h (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.h	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/inspector/agents/InspectorDebuggerAgent.h	2017-02-01 21:26:44 UTC (rev 211519)
@@ -44,12 +44,12 @@
 
 namespace Inspector {
 
+class AsyncStackTrace;
 class InjectedScript;
 class InjectedScriptManager;
 class InspectorArray;
 class InspectorObject;
 class ScriptDebugServer;
-struct AsyncCallData;
 typedef String ErrorString;
 
 class JS_EXPORT_PRIVATE InspectorDebuggerAgent : public InspectorAgentBase, public ScriptDebugListener, public DebuggerBackendDispatcherHandler {
@@ -164,30 +164,11 @@
 
     typedef std::pair<int, int> AsyncCallIdentifier;
 
-    RefPtr<Inspector::Protocol::Console::StackTrace> buildAsyncStackTrace(const AsyncCallIdentifier&);
-    void refAsyncCallData(const AsyncCallIdentifier&);
-    void derefAsyncCallData(const AsyncCallIdentifier&);
-
     typedef HashMap<JSC::SourceID, Script> ScriptsMap;
     typedef HashMap<String, Vector<JSC::BreakpointID>> BreakpointIdentifierToDebugServerBreakpointIDsMap;
     typedef HashMap<String, RefPtr<InspectorObject>> BreakpointIdentifierToBreakpointMap;
     typedef HashMap<JSC::BreakpointID, String> DebugServerBreakpointIDToBreakpointIdentifier;
 
-    struct AsyncCallData {
-        AsyncCallData(RefPtr<ScriptCallStack> callStack, std::optional<AsyncCallIdentifier> parentAsyncCallIdentifier, bool singleShot)
-            : callStack(callStack)
-            , parentAsyncCallIdentifier(parentAsyncCallIdentifier)
-            , referenceCount(singleShot ? 0 : 1)
-        {
-        }
-
-        AsyncCallData() = default;
-
-        RefPtr<ScriptCallStack> callStack;
-        std::optional<AsyncCallIdentifier> parentAsyncCallIdentifier { std::nullopt };
-        unsigned referenceCount { 0 };
-    };
-
     InjectedScriptManager& m_injectedScriptManager;
     std::unique_ptr<DebuggerFrontendDispatcher> m_frontendDispatcher;
     RefPtr<DebuggerBackendDispatcher> m_backendDispatcher;
@@ -204,7 +185,7 @@
     RefPtr<InspectorObject> m_breakAuxData;
     ShouldDispatchResumed m_conditionToDispatchResumed { ShouldDispatchResumed::No };
     bool m_enablePauseWhenIdle { false };
-    HashMap<AsyncCallIdentifier, AsyncCallData> m_asyncCallIdentifierToData;
+    HashMap<AsyncCallIdentifier, RefPtr<AsyncStackTrace>> m_pendingAsyncCalls;
     std::optional<AsyncCallIdentifier> m_currentAsyncCallIdentifier { std::nullopt };
     bool m_enabled { false };
     bool m_javaScriptPauseScheduled { false };

Modified: branches/safari-603-branch/Source/_javascript_Core/inspector/protocol/Console.json (211518 => 211519)


--- branches/safari-603-branch/Source/_javascript_Core/inspector/protocol/Console.json	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/_javascript_Core/inspector/protocol/Console.json	2017-02-01 21:26:44 UTC (rev 211519)
@@ -39,6 +39,7 @@
             "properties": [
                 { "name": "callFrames", "type": "array", "items": { "$ref": "CallFrame" } },
                 { "name": "topCallFrameIsBoundary", "type": "boolean", "optional": true, "description": "Whether the first item in <code>callFrames</code> is the native function that scheduled the asynchronous operation (e.g. setTimeout)." },
+                { "name": "truncated", "type": "boolean", "optional": true, "description": "Whether one or more frames have been truncated from the bottom of the stack." },
                 { "name": "parentStackTrace", "$ref": "StackTrace", "optional": true, "description": "Parent StackTrace." }
             ]
         }

Modified: branches/safari-603-branch/Source/WebInspectorUI/ChangeLog (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/ChangeLog	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/ChangeLog	2017-02-01 21:26:44 UTC (rev 211519)
@@ -1,3 +1,35 @@
+2017-01-31  Matthew Hanson  <matthew_han...@apple.com>
+
+        Merge r211385. rdar://problem/29738502
+
+    2017-01-30  Matt Baker  <mattba...@apple.com>
+
+            Web Inspector: Need some limit on Async Call Stacks for async loops (rAF loops)
+            https://bugs.webkit.org/show_bug.cgi?id=165633
+            <rdar://problem/29738502>
+
+            Reviewed by Joseph Pecoraro.
+
+            * Localizations/en.lproj/localizedStrings.js:
+            Text for "Truncated" 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 > .item.thread + ol > .item.truncated-call-frames):
+            (.tree-outline > .item.thread + ol > .item.truncated-call-frames .icon):
+            Styles for "Truncated" marker tree element.
+
+            * UserInterface/Views/ThreadTreeElement.js:
+            (WebInspector.ThreadTreeElement.prototype.refresh):
+            Append "Truncated" marker tree element if necessary.
+
+            * Versions/Inspector-iOS-10.3.json:
+
 2017-01-12  Matthew Hanson  <matthew_han...@apple.com>
 
         Merge r210691. rdar://problem/29951737

Modified: branches/safari-603-branch/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2017-02-01 21:26:44 UTC (rev 211519)
@@ -124,6 +124,7 @@
 localizedStrings["Busy"] = "Busy";
 localizedStrings["CSP Hash"] = "CSP Hash";
 localizedStrings["Cached"] = "Cached";
+localizedStrings["Call Frames Truncated"] = "Call Frames Truncated";
 localizedStrings["Call Stack"] = "Call Stack";
 localizedStrings["Call Trees"] = "Call Trees";
 localizedStrings["Calls"] = "Calls";

Modified: branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Models/StackTrace.js (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Models/StackTrace.js	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Models/StackTrace.js	2017-02-01 21:26:44 UTC (rev 211519)
@@ -25,7 +25,7 @@
 
 WebInspector.StackTrace = class StackTrace extends WebInspector.Object
 {
-    constructor(callFrames, topCallFrameIsBoundary)
+    constructor(callFrames, topCallFrameIsBoundary, truncated, parentStackTrace)
     {
         super();
 
@@ -33,7 +33,8 @@
 
         this._callFrames = callFrames;
         this._topCallFrameIsBoundary = topCallFrameIsBoundary || false;
-        this._parentStackTrace = null;
+        this._truncated = truncated || false;
+        this._parentStackTrace = parentStackTrace || null;
     }
 
     // Static
@@ -45,7 +46,7 @@
 
         while (payload) {
             let callFrames = payload.callFrames.map((x) => WebInspector.CallFrame.fromPayload(target, x));
-            let stackTrace = new WebInspector.StackTrace(callFrames, payload.topCallFrameIsBoundary);
+            let stackTrace = new WebInspector.StackTrace(callFrames, payload.topCallFrameIsBoundary, payload.truncated);
             if (!result)
                 result = stackTrace;
             if (previousStackTrace)
@@ -169,5 +170,6 @@
     }
 
     get topCallFrameIsBoundary() { return this._topCallFrameIsBoundary; }
+    get truncated() { return this._truncated; }
     get parentStackTrace() { return this._parentStackTrace; }
 };

Modified: branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.css	2017-02-01 21:26:44 UTC (rev 211519)
@@ -50,3 +50,18 @@
 .tree-outline > .item.thread:hover .status-button.resume {
     display: inline-block;
 }
+
+.tree-outline > .item.thread + ol > .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 > .item.thread + ol > .item.truncated-call-frames .icon {
+    margin-left: 0;
+    content: url(../Images/Function.svg);
+    opacity: 0.6;
+}

Modified: branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js	2017-02-01 21:26:44 UTC (rev 211519)
@@ -92,6 +92,12 @@
             for (let i = startIndex; i < currentStackTrace.callFrames.length; ++i)
                 this.appendChild(new WebInspector.CallFrameTreeElement(currentStackTrace.callFrames[i]));
 
+            if (currentStackTrace.truncated) {
+                let truncatedTreeElement = new WebInspector.GeneralTreeElement("truncated-call-frames", WebInspector.UIString("Call Frames Truncated"));
+                truncatedTreeElement.selectable = false;
+                this.appendChild(truncatedTreeElement);
+            }
+
             currentStackTrace = currentStackTrace.parentStackTrace;
         }
 

Modified: branches/safari-603-branch/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json (211518 => 211519)


--- branches/safari-603-branch/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json	2017-02-01 21:26:37 UTC (rev 211518)
+++ branches/safari-603-branch/Source/WebInspectorUI/Versions/Inspector-iOS-10.3.json	2017-02-01 21:26:44 UTC (rev 211519)
@@ -586,6 +586,7 @@
             "properties": [
                 { "name": "callFrames", "type": "array", "items": { "$ref": "CallFrame" } },
                 { "name": "topCallFrameIsBoundary", "type": "boolean", "optional": true, "description": "Whether the first item in <code>callFrames</code> is the native function that scheduled the asynchronous operation (e.g. setTimeout)." },
+                { "name": "truncated", "type": "boolean", "optional": true, "description": "Whether one or more frames have been truncated from the bottom of the stack." },
                 { "name": "parentStackTrace", "$ref": "StackTrace", "optional": true, "description": "Parent StackTrace." }
             ]
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to