| // |jit-test| error:AllDone |
| // When we leave debug mode in a compartment, we must throw away all |
| // analyses in that compartment (debug mode affects the results of |
| // analysis, so they become out of date). We cannot skip this step when |
| // there are debuggee frames on the stack. |
| |
| var g = newGlobal(); |
| var dbg = new Debugger(); |
| var gw = dbg.addDebuggee(g); |
| |
| g.eval("" + |
| function fib(n) { |
| var a = 0, b = 1; |
| while (n-- > 0) |
| b = b+a, a = b-a; |
| return b; |
| }); |
| |
| |
| // Cause g.fib to be jitted. This creates an analysis with debug mode on. |
| g.fib(20); |
| |
| // Setting a breakpoint in g.f causes us to throw away the jit code, but |
| // not the analysis. |
| gw.makeDebuggeeValue(g.fib).script.setBreakpoint(0, { hit: function (f) { } }); |
| |
| // Take g out of debug mode, with debuggee code on the stack. In older |
| // code, this would not trigger a cleansing GC, so the script will |
| // retain its analysis. |
| dbg.onDebuggerStatement = function (f) { |
| dbg.removeDebuggee(g); |
| }; |
| g.eval('debugger'); |
| |
| // Run g.fib again, causing it to be re-jitted. If the original analysis is |
| // still present, JM will assert, because it is not in debug mode. |
| g.fib(20); |
| |
| throw('AllDone'); |