Source code

Revision control

Copy as Markdown

Other Tools

// A Debugger can {return:} from onDebuggerStatement in an async function.
// The async function's promise is resolved with the returned value.
load(libdir + "asserts.js");
let g = newGlobal({newCompartment: true});
g.eval(`
async function f(x) {
debugger; // when==0 to force return here
await x;
debugger; // when==1 to force return here
}
`);
let dbg = new Debugger;
let gw = dbg.addDebuggee(g);
function test(when, what, expected) {
let hits = 0;
let result = "FAIL";
dbg.onDebuggerStatement = frame => {
if (hits++ == when)
return {return: gw.makeDebuggeeValue(what)};
};
g.f(0).then(x => { result = x; });
assertEq(hits, 1);
drainJobQueue();
assertEq(hits, when + 1);
assertEq(result, expected);
}
for (let i = 0; i < 2; i++) {
test(i, "ok", "ok");
test(i, g.Promise.resolve(37), 37);
}