diff --git a/js/src/jit-test/tests/debug/Debugger-getNewestFrame-03.js b/js/src/jit-test/tests/debug/Debugger-getNewestFrame-03.js new file mode 100644 index 00000000000..b5de250a1c3 --- /dev/null +++ b/js/src/jit-test/tests/debug/Debugger-getNewestFrame-03.js @@ -0,0 +1,9 @@ +// Debugger.prototype.getNewestFrame() ignores dummy frames. +// See bug 678086. + +var g = newGlobal('new-compartment'); +g.f = function () { return dbg.getNewestFrame(); }; +var dbg = new Debugger; +var gw = dbg.addDebuggee(g); +var fw = gw.getOwnPropertyDescriptor("f").value; +assertEq(fw.call().return, null); diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index f15a859df55..04b992fd8ac 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -2562,7 +2562,7 @@ DebuggerFrame_getOlder(JSContext *cx, uintN argc, Value *vp) THIS_FRAME(cx, argc, vp, "get this", args, thisobj, thisfp); Debugger *dbg = Debugger::fromChildJSObject(thisobj); for (StackFrame *fp = thisfp->prev(); fp; fp = fp->prev()) { - if (!fp->isDummyFrame() && dbg->observesFrame(fp)) + if (dbg->observesFrame(fp)) return dbg->getScriptFrame(cx, fp, vp); } args.rval().setNull(); diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h index 4a597a68be3..f897d9a258c 100644 --- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -483,7 +483,7 @@ Debugger::observesGlobal(GlobalObject *global) const bool Debugger::observesFrame(StackFrame *fp) const { - return observesGlobal(&fp->scopeChain().global()); + return !fp->isDummyFrame() && observesGlobal(&fp->scopeChain().global()); } JSTrapStatus