Frame-onPop-generators-03.js (1532B)
1 // onPop fires while the [[GeneratorState]] is still "executing". 2 // 3 // This test checks that Debugger doesn't accidentally make it possible to 4 // reenter a generator frame that's on the stack. 5 6 load(libdir + "asserts.js"); 7 8 let g = newGlobal({newCompartment: true}); 9 g.eval('function* f() { debugger; yield 1; debugger; yield 2; debugger; }'); 10 let dbg = Debugger(g); 11 let genObj = g.f(); 12 13 let hits = 0; 14 dbg.onDebuggerStatement = frame => { 15 frame.onPop = completion => { 16 dbg.removeDebuggee(g); // avoid the DebuggeeWouldRun exception 17 hits++; 18 if (hits < 3) { 19 // We're yielding. Calling .return(), .next(), or .throw() on a 20 // generator that's currently on the stack fails with a TypeError. 21 assertThrowsInstanceOf(() => genObj.next(), g.TypeError); 22 assertThrowsInstanceOf(() => genObj.throw("fit"), g.TypeError); 23 assertThrowsInstanceOf(() => genObj.return(), g.TypeError); 24 } else { 25 // This time we're returning. The generator has already been 26 // closed, so its methods work but are basically no-ops. 27 let result = genObj.next(); 28 assertEq(result.done, true); 29 assertEq(result.value, undefined); 30 31 assertThrowsValue(() => genObj.throw("fit"), "fit"); 32 33 result = genObj.return(); 34 assertEq(result.done, true); 35 assertEq(result.value, undefined); 36 } 37 dbg.addDebuggee(g); 38 }; 39 }; 40 41 for (let x of genObj) {} 42 assertEq(hits, 3);