Source code

Revision control

Copy as Markdown

Other Tools

// A Debugger can {return:} from onDebuggerStatement in an async generator.
// A resolved promise for a {value: _, done: true} object is returned.
load(libdir + "asserts.js");
let g = newGlobal({newCompartment: true});
g.eval(`
async function* f(x) {
debugger; // when==0 to force return here
await x;
yield 1;
debugger; // when==1 to force return here
}
`);
let exc = null;
let dbg = new Debugger;
let gw = dbg.addDebuggee(g);
function test(when) {
let hits = 0;
let outcome = "FAIL";
dbg.onDebuggerStatement = frame => {
if (hits++ == when)
return {return: "ponies"};
};
let iter = g.f(0);
// At the initial suspend.
assertEq(hits, 0);
iter.next().then(result => {
// At the yield point, unless we already force-returned from the first
// debugger statement.
assertEq(hits, 1);
if (when == 0)
return result;
assertEq(result.value, 1);
assertEq(result.done, false);
return iter.next();
}).then(result => {
// After forced return.
assertEq(hits, when + 1);
assertEq(result.value, "ponies");
assertEq(result.done, true);
outcome = "pass";
}).catch(e => {
// An assertion failed.
exc = e;
});
assertEq(hits, 1);
drainJobQueue();
if (exc !== null)
throw exc;
assertEq(outcome, "pass");
}
for (let i = 0; i < 2; i++) {
test(i);
}