onDebuggerStatement-async-generator-resumption-01.js (1491B)
1 // A Debugger can {return:} from onDebuggerStatement in an async generator. 2 // A resolved promise for a {value: _, done: true} object is returned. 3 4 load(libdir + "asserts.js"); 5 6 let g = newGlobal({newCompartment: true}); 7 g.eval(` 8 async function* f(x) { 9 debugger; // when==0 to force return here 10 await x; 11 yield 1; 12 debugger; // when==1 to force return here 13 } 14 `); 15 16 let exc = null; 17 let dbg = new Debugger; 18 let gw = dbg.addDebuggee(g); 19 function test(when) { 20 let hits = 0; 21 let outcome = "FAIL"; 22 dbg.onDebuggerStatement = frame => { 23 if (hits++ == when) 24 return {return: "ponies"}; 25 }; 26 27 let iter = g.f(0); 28 29 // At the initial suspend. 30 assertEq(hits, 0); 31 iter.next().then(result => { 32 // At the yield point, unless we already force-returned from the first 33 // debugger statement. 34 assertEq(hits, 1); 35 if (when == 0) 36 return result; 37 assertEq(result.value, 1); 38 assertEq(result.done, false); 39 return iter.next(); 40 }).then(result => { 41 // After forced return. 42 assertEq(hits, when + 1); 43 assertEq(result.value, "ponies"); 44 assertEq(result.done, true); 45 outcome = "pass"; 46 }).catch(e => { 47 // An assertion failed. 48 exc = e; 49 }); 50 51 assertEq(hits, 1); 52 drainJobQueue(); 53 if (exc !== null) 54 throw exc; 55 assertEq(outcome, "pass"); 56 } 57 58 for (let i = 0; i < 2; i++) { 59 test(i); 60 }