Frame-onStack-07.js (1481B)
1 // frame.onStack is false for generator frames popped due to exception or termination. 2 3 load(libdir + "/asserts.js"); 4 5 function test(when, what) { 6 let g = newGlobal({newCompartment: true}); 7 g.eval("function* f(x) { yield x; }"); 8 9 let dbg = new Debugger; 10 let gw = dbg.addDebuggee(g); 11 let fw = gw.getOwnPropertyDescriptor("f").value; 12 13 let t = 0; 14 let poppedFrame; 15 16 function tick(frame) { 17 if (frame.callee == fw) { 18 if (t == when) { 19 poppedFrame = frame; 20 dbg.onEnterFrame = undefined; 21 frame.onPop = undefined; 22 return what; 23 } 24 t++; 25 } 26 return undefined; 27 } 28 29 dbg.onDebuggerStatement = frame => { 30 dbg.onEnterFrame = frame => { 31 frame.onPop = function() { 32 return tick(this); 33 }; 34 return tick(frame); 35 }; 36 let result = frame.eval("for (let _ of f(0)) {}"); 37 if (result && "stack" in result) { 38 result.stack = true; 39 } 40 assertDeepEq(result, what); 41 }; 42 g.eval("debugger;"); 43 44 assertEq(t, when); 45 assertEq(poppedFrame.onStack, false); 46 assertErrorMessage(() => poppedFrame.older, 47 Error, 48 "Debugger.Frame is not on stack or suspended"); 49 } 50 51 for (let when = 0; when < 6; when++) { 52 for (let what of [null, {throw: "fit", stack: true}]) { 53 test(when, what); 54 } 55 }