From 71d9ce93bcde0b17cc42a05e9b6d09d1aea4aa53 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Tue, 3 Feb 2009 20:31:05 -0800 Subject: [PATCH] Backed out bug 475396. Suspected of causing Linux orange-ness. --- js/src/jsdbgapi.cpp | 23 +++++++++++++++-------- js/src/jsemit.cpp | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/js/src/jsdbgapi.cpp b/js/src/jsdbgapi.cpp index 87665170386..c69fda2505b 100644 --- a/js/src/jsdbgapi.cpp +++ b/js/src/jsdbgapi.cpp @@ -1242,29 +1242,36 @@ JS_EvaluateUCInStackFrame(JSContext *cx, JSStackFrame *fp, jsval *rval) { JSObject *scobj; - JSScript *script; + JSScript *script, *oldscript; + JSStackFrame **disp, *displaySave; JSBool ok; scobj = JS_GetFrameScopeChain(cx, fp); if (!scobj) return JS_FALSE; - /* - * NB: This function breaks the assumption that the compiler can see all - * calls and properly compute a static depth. In order to get around this, - * we use a static depth that will cause us not to attempt to optimize - * variable references made by this frame. - */ + oldscript = fp->script; script = js_CompileScript(cx, scobj, fp, JS_StackFramePrincipals(cx, fp), TCF_COMPILE_N_GO | - TCF_PUT_STATIC_DEPTH(JS_DISPLAY_SIZE), + TCF_PUT_STATIC_DEPTH(oldscript->staticDepth + 1), chars, length, NULL, filename, lineno); if (!script) return JS_FALSE; + /* Ensure that the display is up to date for this particular stack frame. */ + if (oldscript->staticDepth < JS_DISPLAY_SIZE) { + disp = &cx->display[oldscript->staticDepth]; + displaySave = *disp; + *disp = fp; + } else { + disp = NULL; + displaySave = NULL; + } ok = js_Execute(cx, scobj, script, fp, JSFRAME_DEBUGGER | JSFRAME_EVAL, rval); + if (disp) + *disp = displaySave; js_DestroyScript(cx, script); return ok; } diff --git a/js/src/jsemit.cpp b/js/src/jsemit.cpp index 3ecaf6e2c3f..c50ec578389 100644 --- a/js/src/jsemit.cpp +++ b/js/src/jsemit.cpp @@ -1892,7 +1892,7 @@ BindNameToSlot(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn) * Optimize access to function's arguments and variable and the * arguments object. */ - if (PN_OP(pn) != JSOP_NAME || cg->staticDepth >= JS_DISPLAY_SIZE) + if (PN_OP(pn) != JSOP_NAME || cg->staticDepth > JS_DISPLAY_SIZE) goto arguments_check; localKind = js_LookupLocal(cx, caller->fun, atom, &index); if (localKind == JSLOCAL_NONE)