summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/onEnterFrame-async-resumption-05.js
blob: a0d9887c80fd22676015169717152ac5be1da497 (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
// A Debugger can't force-return from the first onEnterFrame for an async generator.

ignoreUnhandledRejections();

let g = newGlobal({newCompartment: true});
g.eval(`async function* f(x) { await x; return "ponies"; }`);

let dbg = new Debugger;
let gw = dbg.addDebuggee(g);
let log = "";
let completion = undefined;
let resumption = undefined;
dbg.uncaughtExceptionHook = exc => {
    log += "2";
    assertEq(exc.message, "can't force return from a generator before the initial yield");
    assertEq(exc.constructor, TypeError);
    return undefined;  // Squelch the error and let the debuggee continue.
};
dbg.onEnterFrame = frame => {
    if (frame.type == "call" && frame.callee.name === "f") {
        frame.onPop = c => {
            // We get here after the uncaughtExcpetionHook fires
            // and the debuggee frame has run to the first await.
            completion = c;
            assertEq(completion.return.class, "AsyncGenerator");
            assertEq(completion.return !== resumption.return, true);
            log += "3";
        };

        // Try force-returning an actual object of the expected type.
        dbg.onEnterFrame = undefined;  // don't recurse
        resumption = frame.eval('f(0)');
        assertEq(resumption.return.class, "AsyncGenerator");
        log += "1";
        return resumption;
    }
};

let it = g.f(0);
assertEq(log, "123");
assertEq(gw.makeDebuggeeValue(it), completion.return);