diff options
Diffstat (limited to 'js/src/jit-test/tests/debug/Object-getPromiseReactions-05.js')
-rw-r--r-- | js/src/jit-test/tests/debug/Object-getPromiseReactions-05.js | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/debug/Object-getPromiseReactions-05.js b/js/src/jit-test/tests/debug/Object-getPromiseReactions-05.js new file mode 100644 index 0000000000..89fc1fe70b --- /dev/null +++ b/js/src/jit-test/tests/debug/Object-getPromiseReactions-05.js @@ -0,0 +1,48 @@ +// Debugger.Object.prototype.getPromiseReactions reports reaction records +// created by `await` expressions in async generators. + +const g = newGlobal({ newCompartment: true }); +const dbg = new Debugger; +const DOg = dbg.addDebuggee(g); + +g.eval(` + var pResolve, pReject; + var p0 = new Promise((resolve, reject) => { pResolve = resolve; pReject = reject }); + + // In this case, promiseReactions encounters a Debugger.Frame we had already + // associated with the generator, when we hit the debugger statement. + async function* f1() { debugger; await p0; } + + // In this case, promiseReactions must construct the Debugger.Frame itself, + // since it is the first to encounter the generator. + async function* f2() { await p0; debugger; } +`); + +let DFf1, DFf2; +dbg.onDebuggerStatement = (frame) => { + DFf1 = frame; + dbg.onDebuggerStatement = (frame) => { + DFf2 = frame; + dbg.onDebuggerStatement = () => { throw "Shouldn't fire twice"; }; + }; +}; + +g.eval(`var p1 = f1().next();`); +assertEq(DFf1.callee.name, "f1"); + +g.eval(`var p2 = f2().next();`); +assertEq(DFf2, undefined); + +const [DOp0, DOp1, DOp2] = + [g.p0, g.p1, g.p2].map(p => DOg.makeDebuggeeValue(p)); + +const reactions = DOp0.getPromiseReactions(); +assertEq(reactions.length, 2); +assertEq(reactions[0], DFf1); +assertEq(true, reactions[1] instanceof Debugger.Frame); + +// Let f2 run until it hits its debugger statement. +g.pResolve(42); +drainJobQueue(); +assertEq(DFf2.terminated, true); +assertEq(reactions[1], DFf2); |