--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -1224,19 +1224,104 @@ ASTReader::parseExpression(SimpleTokenRe
// FIXME: Implement
break;
case BinKind::unary_expression:
// FIXME: Implement
break;
case BinKind::update_expression:
// FIXME: Implement
break;
- case BinKind::binary_expression:
- // FIXME: Implement
+ case BinKind::binary_expression: {
+
+ UniquePtr<ParseNode> left;
+ UniquePtr<ParseNode> right;
+ std::string op;
+ for (auto field: fields) {
+ switch (field) {
+ case BinField::left:
+ if (!this->parseExpression(&sub, left)) {
+ return false;
+ }
+ break;
+ case BinField::right:
+ if (!this->parseExpression(&sub, right)) {
+ return false;
+ }
+ break;
+ case BinField::operator_:
+ if (!this->readString(&sub, op)) {
+ return false;
+ }
+ break;
+ default:
+ return this->raiseError();
+ }
+ }
+
+ if (!left || !right) {
+ return this->raiseError();
+ }
+
+ // FIXME: Instead of std::string, we should use atoms and comparison
+ // between atoms.
+ // FIXME: We should probably turn associative operations into lists.
+ ParseNodeKind pnk = PNK_LIMIT;
+ if (op == "==") {
+ pnk = PNK_EQ;
+ } else if (op == "!=") {
+ pnk = PNK_NE;
+ } else if (op == "===") {
+ pnk = PNK_STRICTEQ;
+ } else if (op == "!==") {
+ pnk = PNK_STRICTNE;
+ } else if (op == "<") {
+ pnk = PNK_LT;
+ } else if (op == "<=") {
+ pnk = PNK_LE;
+ } else if (op == ">") {
+ pnk = PNK_GT;
+ } else if (op == ">=") {
+ pnk = PNK_GE;
+ } else if (op == "<<") {
+ pnk = PNK_LSH;
+ } else if (op == ">>") {
+ pnk = PNK_RSH;
+ } else if (op == ">>>") {
+ pnk = PNK_URSH;
+ } else if (op == "+") {
+ pnk = PNK_ADD;
+ } else if (op == "-") {
+ pnk = PNK_SUB;
+ } else if (op == "*") {
+ pnk = PNK_STAR;
+ } else if (op == "/") {
+ pnk = PNK_DIV;
+ } else if (op == "%") {
+ pnk = PNK_MOD;
+ } else if (op == "|") {
+ pnk = PNK_BITOR;
+ } else if (op == "^") {
+ pnk = PNK_BITXOR;
+ } else if (op == "&") {
+ pnk = PNK_BITAND;
+ } else if (op == "in") {
+ pnk = PNK_IN;
+ } else if (op == "instanceof") {
+ pnk = PNK_INSTANCEOF;
+ } else {
+ return this->raiseError();
+ }
+
+ UniquePtr<ParseNode> list(new_<ListNode>(pnk, JSOP_NOP, TokenPos()));
+ list->makeEmpty();
+ list->append(left.release());
+ list->append(right.release());
+ out = Move(list);
break;
+ }
case BinKind::assignment_expression:
// FIXME: Implement
break;
case BinKind::logical_expression:
// FIXME: Implement
break;
case BinKind::member_expression:
// FIXME: Implement