diff --git a/js/src/jsemit.c b/js/src/jsemit.c index e80834658679..ae0dc5118037 100644 --- a/js/src/jsemit.c +++ b/js/src/jsemit.c @@ -4340,9 +4340,15 @@ js_EmitTree(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn) case TOK_UNARYOP: /* Unary op, including unary +/-. */ pn2 = pn->pn_kid; + op = pn->pn_op; + if (op == JSOP_TYPEOF) { + for (pn3 = pn2; pn3->pn_type == TOK_RP; pn3 = pn3->pn_kid) + continue; + if (pn3->pn_type != TOK_NAME) + op = JSOP_TYPEOFEXPR; + } if (!js_EmitTree(cx, cg, pn2)) return JS_FALSE; - op = pn->pn_op; #if JS_HAS_XML_SUPPORT if (op == JSOP_XMLNAME && js_NewSrcNote2(cx, cg, SRC_PCBASE, diff --git a/js/src/jsinterp.c b/js/src/jsinterp.c index 3de62680f283..055f80a592f1 100644 --- a/js/src/jsinterp.c +++ b/js/src/jsinterp.c @@ -3434,6 +3434,7 @@ interrupt: STORE_OPND(-1, rval); END_CASE(JSOP_DELELEM) + BEGIN_CASE(JSOP_TYPEOFEXPR) BEGIN_CASE(JSOP_TYPEOF) rval = FETCH_OPND(-1); SAVE_SP_AND_PC(fp); diff --git a/js/src/jsopcode.c b/js/src/jsopcode.c index 14f212371268..c2c9cfc5f276 100644 --- a/js/src/jsopcode.c +++ b/js/src/jsopcode.c @@ -1806,6 +1806,7 @@ Decompile(SprintStack *ss, jsbytecode *pc, intN nb) break; #endif + case JSOP_TYPEOFEXPR: case JSOP_TYPEOF: case JSOP_VOID: rval = POP_STR(); diff --git a/js/src/jsopcode.tbl b/js/src/jsopcode.tbl index 2bf114fe31f5..d8714d4ab767 100644 --- a/js/src/jsopcode.tbl +++ b/js/src/jsopcode.tbl @@ -405,3 +405,4 @@ OPDEF(JSOP_STOP, 195,"stop", NULL, 1, 0, 0, 0, JOF_BYTE) */ OPDEF(JSOP_GETXPROP, 196,"getxprop", NULL, 3, 1, 1, 12, JOF_CONST|JOF_PROP) OPDEF(JSOP_GETXELEM, 197,"getxelem", NULL, 1, 2, 1, 12, JOF_BYTE |JOF_ELEM|JOF_LEFTASSOC) +OPDEF(JSOP_TYPEOFEXPR, 198, js_typeof_str,NULL, 1, 1, 1, 10, JOF_BYTE|JOF_DETECTING)