summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/Object-getPromiseReactions-04.js
blob: 47278c7d6ed59de7ef844898d5e64fada0d5f046 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Debugger.Object.prototype.getPromiseReactions reports reaction records
// created by `await` expressions in async functions.

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();`);
assertEq(DFf1.callee.name, "f1");

g.eval(`var p2 = f2();`);
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);