if (left->pn_type == tt && left->pn_op == op && (js_CodeSpec[op].format & JOF_LEFTASSOC)) { if (left->pn_arity != PN_LIST) { pn1 = left->pn_left, pn2 = left->pn_right; left->pn_arity = PN_LIST; PN_INIT_LIST_1(left, pn1); PN_APPEND(left, pn2); left->pn_strcat = (tt == TOK_PLUS && (pn1->pn_type == TOK_STRING || pn2->pn_type == TOK_STRING)); } PN_APPEND(left, right); left->pn_pos.end = right->pn_pos.end; if (tt == TOK_PLUS && right->pn_type == TOK_STRING) left->pn_strcat = JS_TRUE; return left; }
NewBinary(JSContext *cx, JSTokenType tt,          JSOp op, JSParseNode *left, JSParseNode *right,          JSTreeContext *tc){    JSParseNode *pn;    if (!left || !right)        return NULL;    pn = tc->nodeList;    if (pn) {        tc->nodeList = pn->pn_next;    } else {        JS_ARENA_ALLOCATE_TYPE(pn, JSParseNode, &cx->tempPool);        if (!pn) {            JS_ReportOutOfMemory(cx);            return NULL;        }    }    pn->pn_type = tt;    pn->pn_pos.begin = left->pn_pos.begin;    pn->pn_pos.end = right->pn_pos.end;    pn->pn_op = op;    pn->pn_arity = PN_BINARY;    pn->pn_left = left;    pn->pn_right = right;    pn->pn_next = NULL;#ifdef METER_PARSENODES    parsenodes++;    if (parsenodes - recyclednodes > maxparsenodes)        maxparsenodes = parsenodes - recyclednodes;#endif    return pn;}