CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp); break;  case TOK_OR:  if (!js_EmitTree(cx, cg, pn->pn_left)) return JS_FALSE; #if JS_BUG_SHORT_CIRCUIT beq = js_Emit3(cx, cg, JSOP_IFEQ, 0, 0); tmp = js_Emit1(cx, cg, JSOP_TRUE); jmp = js_Emit3(cx, cg, JSOP_GOTO, 0, 0); if (beq < 0 || tmp < 0 || jmp < 0) return JS_FALSE; CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, beq); #else  jmp = js_Emit3(cx, cg, JSOP_OR, 0, 0); if (jmp < 0) return JS_FALSE; #endif if (!js_EmitTree(cx, cg, pn->pn_right)) return JS_FALSE; CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp); break;  case TOK_AND:  if (!js_EmitTree(cx, cg, pn->pn_left)) return JS_FALSE; #if JS_BUG_SHORT_CIRCUIT beq = js_Emit3(cx, cg, JSOP_IFNE, 0, 0); tmp = js_Emit1(cx, cg, JSOP_FALSE); jmp = js_Emit3(cx, cg, JSOP_GOTO, 0, 0); if (beq < 0 || tmp < 0 || jmp < 0) return JS_FALSE; CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, beq); #else jmp = js_Emit3(cx, cg, JSOP_AND, 0, 0); if (jmp < 0) return JS_FALSE; #endif if (!js_EmitTree(cx, cg, pn->pn_right)) return JS_FALSE; CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp); break;  case TOK_BITOR: case TOK_BITXOR: case TOK_BITAND: case TOK_EQOP: case TOK_RELOP: #if JS_HAS_IN_OPERATOR case TOK_IN: #endif #if JS_HAS_INSTANCEOF case TOK_INSTANCEOF: #endif case TOK_SHOP: case TOK_PLUS: case TOK_MINUS: case TOK_STAR: case TOK_DIVOP:  if (!js_EmitTree(cx, cg, pn->pn_left)) return JS_FALSE; if (!js_EmitTree(cx, cg, pn->pn_right)) return JS_FALSE; if (js_Emit1(cx, cg, pn->pn_op) < 0) return JS_FALSE; break;  #if JS_HAS_EXCEPTIONS case TOK_THROW: #endif case TOK_UNARYOP:  if (!js_EmitTree(cx, cg, pn->pn_kid)) return JS_FALSE; if (js_Emit1(cx, cg, pn->pn_op) < 0) return JS_FALSE; break;  case TOK_INC: case TOK_DEC:  pn2 = pn->pn_kid; JS_ASSERT(pn2->pn_type != TOK_RP); op = pn->pn_op; switch (pn2->pn_type) { case TOK_NAME: pn2->pn_op = op; if (!LookupArgOrVar(cx, &cg->treeContext, pn2)) return JS_FALSE; op = pn2->pn_op; if (pn2->pn_slot >= 0) { if (pn2->pn_attrs & JSPROP_READONLY) op = JSOP_GETVAR; atomIndex = (jsatomid) pn2->pn_slot; EMIT_ATOM_INDEX_OP(op, atomIndex); } else {
}
        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, beq);        if (!js_EmitTree(cx, cg, pn->pn_kid3))            return JS_FALSE;        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp);        break;      case TOK_OR:        /* Emit left operand, emit pop-if-converts-to-false-else-jump. */        if (!js_EmitTree(cx, cg, pn->pn_left))            return JS_FALSE;#if JS_BUG_SHORT_CIRCUIT        beq = js_Emit3(cx, cg, JSOP_IFEQ, 0, 0);        tmp = js_Emit1(cx, cg, JSOP_TRUE);        jmp = js_Emit3(cx, cg, JSOP_GOTO, 0, 0);        if (beq < 0 || tmp < 0 || jmp < 0)            return JS_FALSE;        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, beq);#else        /*         * JSOP_OR converts the operand on the stack to boolean, and if true,         * leaves the original operand value on the stack and jumps; otherwise         * it pops and falls into the next bytecode.         */        jmp = js_Emit3(cx, cg, JSOP_OR, 0, 0);        if (jmp < 0)            return JS_FALSE;#endif        if (!js_EmitTree(cx, cg, pn->pn_right))            return JS_FALSE;        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp);        break;      case TOK_AND:        /* && is like || except it uses a pop-if-converts-to-true-else-jump. */        if (!js_EmitTree(cx, cg, pn->pn_left))            return JS_FALSE;#if JS_BUG_SHORT_CIRCUIT        beq = js_Emit3(cx, cg, JSOP_IFNE, 0, 0);        tmp = js_Emit1(cx, cg, JSOP_FALSE);        jmp = js_Emit3(cx, cg, JSOP_GOTO, 0, 0);        if (beq < 0 || tmp < 0 || jmp < 0)            return JS_FALSE;        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, beq);#else        jmp = js_Emit3(cx, cg, JSOP_AND, 0, 0);        if (jmp < 0)            return JS_FALSE;#endif        if (!js_EmitTree(cx, cg, pn->pn_right))            return JS_FALSE;        CHECK_AND_SET_JUMP_OFFSET_AT(cx, cg, jmp);        break;      case TOK_BITOR:      case TOK_BITXOR:      case TOK_BITAND:      case TOK_EQOP:      case TOK_RELOP:#if JS_HAS_IN_OPERATOR      case TOK_IN:#endif#if JS_HAS_INSTANCEOF      case TOK_INSTANCEOF:#endif      case TOK_SHOP:      case TOK_PLUS:      case TOK_MINUS:      case TOK_STAR:      case TOK_DIVOP:        /* Binary operators that evaluate both operands unconditionally. */        if (!js_EmitTree(cx, cg, pn->pn_left))            return JS_FALSE;        if (!js_EmitTree(cx, cg, pn->pn_right))            return JS_FALSE;        if (js_Emit1(cx, cg, pn->pn_op) < 0)            return JS_FALSE;        break;#if JS_HAS_EXCEPTIONS      case TOK_THROW:#endif      case TOK_UNARYOP:        /* Unary op, including unary +/-. */        if (!js_EmitTree(cx, cg, pn->pn_kid))            return JS_FALSE;        if (js_Emit1(cx, cg, pn->pn_op) < 0)            return JS_FALSE;        break;      case TOK_INC:      case TOK_DEC:        /* Emit lvalue-specialized code for ++/-- operators. */        pn2 = pn->pn_kid;        JS_ASSERT(pn2->pn_type != TOK_RP);        op = pn->pn_op;        switch (pn2->pn_type) {          case TOK_NAME:            pn2->pn_op = op;            if (!LookupArgOrVar(cx, &cg->treeContext, pn2))                return JS_FALSE;            op = pn2->pn_op;            if (pn2->pn_slot >= 0) {                if (pn2->pn_attrs & JSPROP_READONLY)                    op = JSOP_GETVAR;                atomIndex = (jsatomid) pn2->pn_slot;                EMIT_ATOM_INDEX_OP(op, atomIndex);            } else {