Source code

Revision control

Copy as Markdown

Other Tools

// 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);