JS_ASSERT(cg->stackDepth > 1); cg->stackDepth--;
        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);        if (!js_SetSrcNoteOffset(cx, cg, noteIndex, 0, jmp - beq))            return JS_FALSE;        break;      case TOK_OR:      case TOK_AND:        /*         * 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, which evaluates the right         * operand.  The jump goes around the right operand evaluation.         *         * JSOP_AND converts the operand on the stack to boolean, and if false,         * leaves the original operand value on the stack and jumps; otherwise         * it pops and falls into the right operand's bytecode.         *         * Avoid tail recursion for long ||...|| expressions and long &&...&&         * expressions or long mixtures of ||'s and &&'s that can easily blow         * the stack, by forward-linking and then backpatching all the JSOP_OR         * and JSOP_AND bytecodes' immediate jump-offset operands.         */        pn3 = pn;        if (!js_EmitTree(cx, cg, pn->pn_left))            return JS_FALSE;        top = EmitJump(cx, cg, JSOP_BACKPATCH_POP, 0);        if (top < 0)            return JS_FALSE;        jmp = top;        pn2 = pn->pn_right;        while (pn2->pn_type == TOK_OR || pn2->pn_type == TOK_AND) {            pn = pn2;            if (!js_EmitTree(cx, cg, pn->pn_left))                return JS_FALSE;            off = EmitJump(cx, cg, JSOP_BACKPATCH_POP, 0);            if (off < 0)                return JS_FALSE;            if (!SetBackPatchDelta(cx, cg, CG_CODE(cg, jmp), off - jmp))                return JS_FALSE;            jmp = off;            pn2 = pn->pn_right;        }