onEnterFrame-async-resumption-09.js (1230B)
1 // Resume execution of async generator when initially yielding. 2 3 let g = newGlobal({newCompartment: true}); 4 let dbg = new Debugger(); 5 let gw = dbg.addDebuggee(g); 6 7 g.eval(` 8 async function* f() { 9 await 123; 10 return "ponies"; 11 } 12 `); 13 14 let counter = 0; 15 let thenCalled = false; 16 dbg.onEnterFrame = frame => { 17 frame.onPop = completion => { 18 if (counter++ === 0) { 19 let genObj = completion.return.unsafeDereference(); 20 21 // The following call enqueues the request before it becomes 22 // suspendedStart, that breaks the assumption in the spec, 23 // and there's no correct interpretation. 24 genObj.next().then(() => { 25 thenCalled = true; 26 }); 27 } 28 }; 29 }; 30 31 let it = g.f(); 32 33 assertEq(counter, 1); 34 35 let caught = false; 36 try { 37 // The async generator is already in the invalid state, and the following 38 // call fails. 39 it.next(); 40 } catch (e) { 41 caught = true; 42 } 43 assertEq(caught, true); 44 45 caught = false; 46 try { 47 it.throw(); 48 } catch (e) { 49 caught = true; 50 } 51 assertEq(caught, true); 52 53 caught = false; 54 try { 55 it.return(); 56 } catch (e) { 57 caught = true; 58 } 59 assertEq(caught, true); 60 61 drainJobQueue(); 62 63 assertEq(thenCalled, false);