if (pn3->pn_type == TOK_NUMBER) { if (js_NewSrcNote(cx, cg, SRC_LABEL) < 0) return JS_FALSE; if (js_Emit1(cx, cg, JSOP_INITELEM) < 0) return JS_FALSE; } else { EMIT_ATOM_INDEX_OP(JSOP_INITPROP, ale->index); } }
if (pn3->pn_type == TOK_NUMBER) { if (js_NewSrcNote(cx, cg, SRC_LABEL) < 0) return JS_FALSE; if (js_Emit1(cx, cg, JSOP_INITELEM) < 0) return JS_FALSE; } else { EMIT_ATOM_INDEX_OP(JSOP_INITPROP, ALE_INDEX(ale)); } }
            js_Emit3(cx, cg, op, ARGC_HI(argc), ARGC_LO(argc)) < 0)	    return JS_FALSE;	break;#if JS_HAS_INITIALIZERS      case TOK_RB:	/*	 * Emit code for [a, b, c] of the form:	 *   t = new Array; t[0] = a; t[1] = b; t[2] = c; t;	 * but use a stack slot for t and avoid dup'ing and popping it via	 * the JSOP_NEWINIT and JSOP_INITELEM bytecodes.	 */	ale = js_IndexAtom(cx, cx->runtime->atomState.ArrayAtom,			   &cg->atomList);	if (!ale)	    return JS_FALSE;	EMIT_ATOM_INDEX_OP(JSOP_NAME, ale->index);	if (js_Emit1(cx, cg, JSOP_PUSHOBJ) < 0)	    return JS_FALSE;	if (js_Emit1(cx, cg, JSOP_NEWINIT) < 0)	    return JS_FALSE;	pn2 = pn->pn_head;#if JS_HAS_SHARP_VARS	if (pn2 && pn2->pn_type == TOK_DEFSHARP) {	    EMIT_ATOM_INDEX_OP(JSOP_DEFSHARP, (jsatomid)pn2->pn_num);	    pn2 = pn2->pn_next;	}#endif	for (atomIndex = 0; pn2; pn2 = pn2->pn_next) {	    /* PrimaryExpr enforced ATOM_INDEX_LIMIT, so in-line optimize. */	    JS_ASSERT(atomIndex < ATOM_INDEX_LIMIT);	    if (atomIndex == 0) {		if (js_Emit1(cx, cg, JSOP_ZERO) < 0)		    return JS_FALSE;	    } else if (atomIndex == 1) {		if (js_Emit1(cx, cg, JSOP_ONE) < 0)		    return JS_FALSE;	    } else {		EMIT_ATOM_INDEX_OP(JSOP_UINT16, (jsatomid)atomIndex);	    }	    /* Sub-optimal: holes in a sparse initializer are void-filled. */	    if (pn2->pn_type == TOK_COMMA) {		if (js_Emit1(cx, cg, JSOP_PUSH) < 0)		    return JS_FALSE;	    } else {		if (!js_EmitTree(cx, cg, pn2))		    return JS_FALSE;	    }	    if (js_Emit1(cx, cg, JSOP_INITELEM) < 0)		return JS_FALSE;	    atomIndex++;	}	if (pn->pn_extra) {	    /* Emit a source note so we know to decompile an extra comma. */	    if (js_NewSrcNote(cx, cg, SRC_CONTINUE) < 0)		return JS_FALSE;	}	/* Emit an op for sharp array cleanup and decompilation. */	if (js_Emit1(cx, cg, JSOP_ENDINIT) < 0)	    return JS_FALSE;	break;      case TOK_RC:	/*	 * Emit code for {p:a, '%q':b, 2:c} of the form:	 *   t = new Object; t.p = a; t['%q'] = b; t[2] = c; t;	 * but use a stack slot for t and avoid dup'ing and popping it via	 * the JSOP_NEWINIT and JSOP_INITELEM bytecodes.	 */	ale = js_IndexAtom(cx, cx->runtime->atomState.ObjectAtom,			   &cg->atomList);	if (!ale)	    return JS_FALSE;	EMIT_ATOM_INDEX_OP(JSOP_NAME, ale->index);	if (js_Emit1(cx, cg, JSOP_PUSHOBJ) < 0)	    return JS_FALSE;	if (js_Emit1(cx, cg, JSOP_NEWINIT) < 0)	    return JS_FALSE;	pn2 = pn->pn_head;#if JS_HAS_SHARP_VARS	if (pn2 && pn2->pn_type == TOK_DEFSHARP) {	    EMIT_ATOM_INDEX_OP(JSOP_DEFSHARP, (jsatomid)pn2->pn_num);	    pn2 = pn2->pn_next;	}#endif	for (; pn2; pn2 = pn2->pn_next) {	    /* Emit an index for t[2], else map an atom for t.p or t['%q']. */	    pn3 = pn2->pn_left;	    switch (pn3->pn_type) {	      case TOK_NUMBER:		if (!EmitNumberOp(cx, pn3->pn_dval, cg))		    return JS_FALSE;		break;	      case TOK_NAME:	      case TOK_STRING:		ale = js_IndexAtom(cx, pn3->pn_atom, &cg->atomList);		if (!ale)		    return JS_FALSE;		break;	      default:		JS_ASSERT(0);	    }	    /* Emit code for the property initializer. */	    if (!js_EmitTree(cx, cg, pn2->pn_right))		return JS_FALSE;#if JS_HAS_GETTER_SETTER            op = pn2->pn_op;            if (op == JSOP_GETTER || op == JSOP_SETTER) {                if (js_Emit1(cx, cg, op) < 0)                    return JS_FALSE;            }#endif	    /* Annotate JSOP_INITELEM so we decompile 2:c and not just c. */	    if (pn3->pn_type == TOK_NUMBER) {		if (js_NewSrcNote(cx, cg, SRC_LABEL) < 0)		    return JS_FALSE;		if (js_Emit1(cx, cg, JSOP_INITELEM) < 0)		    return JS_FALSE;	    } else {                EMIT_ATOM_INDEX_OP(JSOP_INITPROP, ale->index);	    }	}	/* Emit an op for sharpArray cleanup and decompilation. */	if (js_Emit1(cx, cg, JSOP_ENDINIT) < 0)	    return JS_FALSE;	break;#if JS_HAS_SHARP_VARS      case TOK_DEFSHARP:	if (!js_EmitTree(cx, cg, pn->pn_kid))	    return JS_FALSE;	EMIT_ATOM_INDEX_OP(JSOP_DEFSHARP, (jsatomid) pn->pn_num);	break;      case TOK_USESHARP:	EMIT_ATOM_INDEX_OP(JSOP_USESHARP, (jsatomid) pn->pn_num);	break;#endif /* JS_HAS_SHARP_VARS */#endif /* JS_HAS_INITIALIZERS */      case TOK_RP:	/*	 * The node for (e) has e as its kid, enabling users who want to nest	 * assignment expressions in conditions to avoid the error correction	 * done by Condition (from x = y to x == y) by double-parenthesizing.	 *	 * We also emit an annotated NOP so we can decompile user parentheses,	 * but that's just a nicety (the decompiler does not preserve comments	 * or white space, and it parenthesizes for correct precedence anyway,	 * so this nop nicety should be considered with a cold eye, especially	 * if another srcnote type is needed).	 */	if (!js_EmitTree(cx, cg, pn->pn_kid))	    return JS_FALSE;	if (js_NewSrcNote(cx, cg, SRC_PAREN) < 0 ||	    js_Emit1(cx, cg, JSOP_NOP) < 0) {	    return JS_FALSE;	}