From 1575ad453ea7bed28ee6ab77abf4619237ebd6a8 Mon Sep 17 00:00:00 2001 From: "brendan@mozilla.org" Date: Fri, 29 Feb 2008 23:37:27 -0800 Subject: [PATCH] Fix ComputeThis perf regression (420426, r=mrbkap, a=sayrer). --- js/src/jsinterp.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/js/src/jsinterp.c b/js/src/jsinterp.c index 3bfacc83bf2..6bd192dcfc8 100644 --- a/js/src/jsinterp.c +++ b/js/src/jsinterp.c @@ -4202,10 +4202,13 @@ interrupt: : !OBJ_GET_PROPERTY(cx, obj, id, &rval)) { goto error; } + + /* Assert that we can avoid calling ComputeThis. */ + JS_ASSERT(OBJ_GET_CLASS(cx, obj) != &js_CallClass); + JS_ASSERT(!obj->map->ops->thisObject); + STORE_OPND(-1, OBJECT_TO_JSVAL(obj)); STORE_OPND(-2, rval); - if (!ComputeThis(cx, JS_FALSE, sp)) - goto error; } else { JS_ASSERT(obj->map->ops->getProperty == js_GetProperty); if (!js_GetPropertyHelper(cx, obj, id, &rval, &entry)) @@ -4888,12 +4891,8 @@ interrupt: do_push_rval: PUSH_OPND(rval); - if (op == JSOP_CALLNAME) { + if (op == JSOP_CALLNAME) PUSH_OPND(OBJECT_TO_JSVAL(obj)); - SAVE_SP(fp); - if (!ComputeThis(cx, JS_FALSE, sp)) - goto error; - } } END_CASE(JSOP_NAME) @@ -5089,6 +5088,12 @@ interrupt: if (!obj) goto error; fp->thisp = obj; + } else { + /* |this| must be an outer object by definition. */ + OBJ_TO_OUTER_OBJECT(cx, obj); + if (!obj) + goto error; + fp->thisp = obj; } PUSH_OPND(OBJECT_TO_JSVAL(obj)); END_CASE(JSOP_THIS) @@ -6316,10 +6321,8 @@ interrupt: goto error; STORE_OPND(-1, rval); if (op == JSOP_CALLXMLNAME) { + JS_ASSERT(OBJECT_IS_XML(cx, obj)); PUSH_OPND(OBJECT_TO_JSVAL(obj)); - SAVE_SP(fp); - if (!ComputeThis(cx, JS_FALSE, sp)) - goto error; } END_CASE(JSOP_XMLNAME)