summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/saved-stacks/1438121-async-function.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/saved-stacks/1438121-async-function.js')
-rw-r--r--js/src/jit-test/tests/saved-stacks/1438121-async-function.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/saved-stacks/1438121-async-function.js b/js/src/jit-test/tests/saved-stacks/1438121-async-function.js
new file mode 100644
index 0000000000..87fc9bab0a
--- /dev/null
+++ b/js/src/jit-test/tests/saved-stacks/1438121-async-function.js
@@ -0,0 +1,119 @@
+const mainGlobal = this;
+const debuggerGlobal = newGlobal({newCompartment: true});
+
+function Memory({global}) {
+ this.dbg = new (debuggerGlobal.Debugger);
+ this.gDO = this.dbg.addDebuggee(global);
+}
+
+Memory.prototype = {
+ constructor: Memory,
+ attach() { return Promise.resolve('fake attach result'); },
+ detach() { return Promise.resolve('fake detach result'); },
+ startRecordingAllocations() {
+ this.dbg.memory.trackingAllocationSites = true;
+ return Promise.resolve('fake startRecordingAllocations result');
+ },
+ stopRecordingAllocations() {
+ this.dbg.memory.trackingAllocationSites = false;
+ return Promise.resolve('fake stopRecordingAllocations result');
+ },
+ getAllocations() {
+ return Promise.resolve({ allocations: this.dbg.memory.drainAllocationsLog() });
+ }
+};
+
+function ok(cond, msg) {
+ assertEq(!!cond, true, `ok(${JSON.stringify(cond)}, ${JSON.stringify(msg)})`);
+}
+
+const is = assertEq;
+
+function startServerAndGetSelectedTabMemory() {
+ let memory = new Memory({ global: mainGlobal });
+ return Promise.resolve({ memory, client: 'fake client' });
+}
+
+function destroyServerAndFinish() {
+ return Promise.resolve('fake destroyServerAndFinish result');
+}
+
+(async function body() {
+ let { memory, client } = await startServerAndGetSelectedTabMemory();
+ await memory.attach();
+
+ await memory.startRecordingAllocations();
+ ok(true, "Can start recording allocations");
+
+ // Allocate some objects.
+
+ let alloc1, alloc2, alloc3;
+
+ /* eslint-disable max-nested-callbacks */
+ (function outer() {
+ (function middle() {
+ (function inner() {
+ alloc1 = {}; alloc1.line = Error().lineNumber;
+ alloc2 = []; alloc2.line = Error().lineNumber;
+ // eslint-disable-next-line new-parens
+ alloc3 = new function () {}; alloc3.line = Error().lineNumber;
+ }());
+ }());
+ }());
+ /* eslint-enable max-nested-callbacks */
+
+ let response = await memory.getAllocations();
+
+ await memory.stopRecordingAllocations();
+ ok(true, "Can stop recording allocations");
+
+ // Filter out allocations by library and test code, and get only the
+ // allocations that occurred in our test case above.
+
+ function isTestAllocation(alloc) {
+ let frame = alloc.frame;
+ return frame
+ && frame.functionDisplayName === "inner"
+ && (frame.line === alloc1.line
+ || frame.line === alloc2.line
+ || frame.line === alloc3.line);
+ }
+
+ let testAllocations = response.allocations.filter(isTestAllocation);
+ ok(testAllocations.length >= 3,
+ "Should find our 3 test allocations (plus some allocations for the error "
+ + "objects used to get line numbers)");
+
+ // For each of the test case's allocations, ensure that the parent frame
+ // indices are correct. Also test that we did get an allocation at each
+ // line we expected (rather than a bunch on the first line and none on the
+ // others, etc).
+
+ let expectedLines = new Set([alloc1.line, alloc2.line, alloc3.line]);
+
+ for (let alloc of testAllocations) {
+ let innerFrame = alloc.frame;
+ ok(innerFrame, "Should get the inner frame");
+ is(innerFrame.functionDisplayName, "inner");
+ expectedLines.delete(innerFrame.line);
+
+ let middleFrame = innerFrame.parent;
+ ok(middleFrame, "Should get the middle frame");
+ is(middleFrame.functionDisplayName, "middle");
+
+ let outerFrame = middleFrame.parent;
+ ok(outerFrame, "Should get the outer frame");
+ is(outerFrame.functionDisplayName, "outer");
+
+ // Not going to test the rest of the frames because they are Task.jsm
+ // and promise frames and it gets gross. Plus, I wouldn't want this test
+ // to start failing if they changed their implementations in a way that
+ // added or removed stack frames here.
+ }
+
+ is(expectedLines.size, 0,
+ "Should have found all the expected lines");
+
+ await memory.detach();
+ destroyServerAndFinish(client);
+})().catch(e => { print("Error: " + e + "\nstack:\n" + e.stack); quit(1); });