Frame-onStep-assign-generator.js (1382B)
1 // Changing onStep while the generator is suspended/dead is allowed. 2 3 load(libdir + "asserts.js"); 4 5 const g = newGlobal({ newCompartment: true }); 6 const dbg = new Debugger(g); 7 8 let steps = new Set(); 9 dbg.onDebuggerStatement = function(frame) { 10 // Setting 'onStep' while alive is allowed. 11 steps.add("debugger 1"); 12 assertEq(frame.onStack, true); 13 frame.onStep = function() { 14 steps.add("onstep 1"); 15 }; 16 17 dbg.onDebuggerStatement = function() { 18 // Clear the 'onStep' while suspended. 19 steps.add("debugger 2"); 20 assertEq(frame.onStack, false); 21 22 // Clearing 'onStep' while suspended is allowed. 23 frame.onStep = undefined; 24 25 // Setting 'onStep' while suspended is allowed. 26 frame.onStep = function() { 27 steps.add("onstep 2"); 28 }; 29 30 dbg.onDebuggerStatement = function() { 31 steps.add("debugger 3"); 32 assertEq(frame.onStack, false); 33 34 // Clearing 'onStep' while dead is allowed. 35 frame.onStep = undefined; 36 37 // Setting 'onStep' while dead is allowed. 38 frame.onStep = function() { 39 steps.add("onstep 3"); 40 }; 41 }; 42 }; 43 }; 44 45 g.eval( 46 ` 47 function* myGen() { 48 debugger; 49 yield; 50 } 51 52 const g = myGen(); 53 g.next(); 54 55 debugger; 56 g.next(); 57 58 debugger; 59 ` 60 ); 61 62 assertDeepEq(Array.from(steps), [ 63 "debugger 1", 64 "onstep 1", 65 "debugger 2", 66 "onstep 2", 67 "debugger 3", 68 ]);