Bug 630213 - ASTSerializer::leftAssociate right-associates. r=dherman.

--HG--
extra : rebase_source : 18bbf8f963f4c76b1fe6d4e7acc9aa6b33381b73
This commit is contained in:
Jason Orendorff 2011-03-03 15:08:01 -06:00
parent 45e8859924
commit 84d99790b9
2 changed files with 14 additions and 32 deletions

View File

@ -2320,53 +2320,34 @@ ASTSerializer::leftAssociate(JSParseNode *pn, Value *dst)
const size_t len = pn->pn_count; const size_t len = pn->pn_count;
JS_ASSERT(len >= 1); JS_ASSERT(len >= 1);
if (len == 1)
return expression(pn->pn_head, dst);
JS_ASSERT(len >= 2);
Vector<JSParseNode *, 8> list(cx);
if (!list.reserve(len))
return false;
for (JSParseNode *next = pn->pn_head; next; next = next->pn_next) {
JS_ALWAYS_TRUE(list.append(next)); /* space check above */
}
TokenKind tk = PN_TYPE(pn); TokenKind tk = PN_TYPE(pn);
bool lor = tk == TOK_OR; bool lor = tk == TOK_OR;
bool logop = lor || (tk == TOK_AND); bool logop = lor || (tk == TOK_AND);
Value right; JSParseNode *head = pn->pn_head;
if (!expression(list[len - 1], &right))
return false;
size_t i = len - 2;
do {
JSParseNode *next = list[i];
Value left; Value left;
if (!expression(next, &left)) if (!expression(head, &left))
return false;
for (JSParseNode *next = head->pn_next; next; next = next->pn_next) {
Value right;
if (!expression(next, &right))
return false; return false;
TokenPos subpos = { next->pn_pos.begin, pn->pn_pos.end }; TokenPos subpos = { pn->pn_pos.begin, next->pn_pos.end };
if (logop) { if (logop) {
if (!builder.logicalExpression(lor, left, right, &subpos, &right)) if (!builder.logicalExpression(lor, left, right, &subpos, &left))
return false; return false;
} else { } else {
BinaryOperator op = binop(PN_TYPE(pn), PN_OP(pn)); BinaryOperator op = binop(PN_TYPE(pn), PN_OP(pn));
LOCAL_ASSERT(op > BINOP_ERR && op < BINOP_LIMIT); LOCAL_ASSERT(op > BINOP_ERR && op < BINOP_LIMIT);
if (!builder.binaryExpression(op, left, right, &subpos, &right)) if (!builder.binaryExpression(op, left, right, &subpos, &left))
return false; return false;
} }
} while (i-- != 0); }
*dst = right; *dst = left;
return true; return true;
} }

View File

@ -251,8 +251,9 @@ assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y"))); assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y"))); assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
assertExpr("(x + y)", binExpr("+", ident("x"), ident("y"))); assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
assertExpr("(w + x + y + z)", binExpr("+", ident("w"), binExpr("+", ident("x", binExpr("+", ident("y"), ident("z")))))) assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
assertExpr("(x - y)", binExpr("-", ident("x"), ident("y"))); assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
assertExpr("(x * y)", binExpr("*", ident("x"), ident("y"))); assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
assertExpr("(x / y)", binExpr("/", ident("x"), ident("y"))); assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
assertExpr("(x % y)", binExpr("%", ident("x"), ident("y"))); assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
@ -275,7 +276,7 @@ assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y"))); assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
assertExpr("(x || y)", logExpr("||", ident("x"), ident("y"))); assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y"))); assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
assertExpr("(w || x || y || z)", logExpr("||", ident("w"), logExpr("||", ident("x", logExpr("||", ident("y"), ident("z")))))) assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z"))); assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
assertExpr("(x,y)", seqExpr([ident("x"),ident("y")])) assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")])) assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))