Debugger-debuggees-28.js (2269B)
1 // Test that on->off->on and off->on->off toggles don't crash. 2 3 function addRemove(dbg, g) { 4 dbg.addDebuggee(g); 5 var f = dbg.getNewestFrame(); 6 while (f) 7 f = f.older; 8 dbg.removeDebuggee(g); 9 } 10 11 function removeAdd(dbg, g) { 12 dbg.removeDebuggee(g); 13 dbg.addDebuggee(g); 14 var f = dbg.getNewestFrame(); 15 while (f) 16 f = f.older; 17 } 18 19 function newGlobalDebuggerPair(toggleSeq) { 20 var g = newGlobal({newCompartment: true}); 21 var dbg = new Debugger; 22 23 if (toggleSeq == removeAdd) 24 dbg.addDebuggee(g); 25 26 g.eval("" + function f() { return g(); }); 27 g.eval("" + function g() { return h(); }); 28 g.eval("line0 = Error().lineNumber;"); 29 g.eval("" + function h() { 30 for (var i = 0; i < 100; i++) 31 interruptIf(i == 95); 32 debugger; 33 return i; 34 }); 35 36 setInterruptCallback(function () { return true; }); 37 38 return [g, dbg]; 39 } 40 41 function testInterrupt(toggleSeq) { 42 var [g, dbg] = newGlobalDebuggerPair(toggleSeq); 43 44 setInterruptCallback(function () { 45 toggleSeq(dbg, g); 46 return true; 47 }); 48 49 assertEq(g.f(), 100); 50 } 51 52 function testPrologue(toggleSeq) { 53 var [g, dbg] = newGlobalDebuggerPair(toggleSeq); 54 55 dbg.onEnterFrame = function (f) { 56 if (f.callee && f.callee.name == "h") 57 toggleSeq(dbg, g); 58 }; 59 60 assertEq(g.f(), 100); 61 } 62 63 function testEpilogue(toggleSeq) { 64 var [g, dbg] = newGlobalDebuggerPair(toggleSeq); 65 66 dbg.onEnterFrame = function (f) { 67 if (f.callee && f.callee.name == "h") { 68 f.onPop = function () { 69 toggleSeq(dbg, g); 70 }; 71 } 72 }; 73 74 assertEq(g.f(), 100); 75 } 76 77 function testTrap(toggleSeq) { 78 var [g, dbg] = newGlobalDebuggerPair(toggleSeq); 79 80 dbg.onEnterFrame = function (f) { 81 if (f.callee && f.callee.name == "h") { 82 var offs = f.script.getLineOffsets(g.line0 + 2); 83 assertEq(offs.length > 0, true); 84 f.script.setBreakpoint(offs[0], { hit: function () { 85 toggleSeq(dbg, g); 86 }}); 87 } 88 }; 89 90 assertEq(g.f(), 100); 91 } 92 93 function testDebugger(toggleSeq) { 94 var [g, dbg] = newGlobalDebuggerPair(toggleSeq); 95 96 dbg.onDebuggerStatement = function () { 97 toggleSeq(dbg, g); 98 }; 99 100 assertEq(g.f(), 100); 101 } 102 103 testInterrupt(addRemove); 104 testInterrupt(removeAdd); 105 106 testPrologue(removeAdd); 107 testEpilogue(removeAdd); 108 testTrap(removeAdd); 109 testDebugger(removeAdd);