WIP: Implemented assign_expression draft
authorDavid Teller <dteller@mozilla.com>
Thu, 27 Jul 2017 17:15:17 +0200
changeset 641350 e9bd3751d046092ca1fa2a452e77cd36b20da009
parent 641349 25de9a06bee64e44db3ce20862673b936c816005
child 641351 cb9e3aff091eed8a3301a5ebccb90fb1276e9c96
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented assign_expression MozReview-Commit-ID: LMt7PQ4sKqC
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -1256,17 +1256,17 @@ ASTReader::parseExpression(SimpleTokenRe
                 }
             }
 
             if (!left || !right) {
                 return this->raiseError();
             }
 
             // FIXME: Instead of std::string, we should use atoms and comparison
-            // between atoms.
+            // between atom ptr.
             // 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;
@@ -1306,25 +1306,94 @@ ASTReader::parseExpression(SimpleTokenRe
                 pnk = PNK_IN;
             } else if (op == "instanceof") {
                 pnk = PNK_INSTANCEOF;
             } else {
                 return this->raiseError();
             }
 
             UniquePtr<ParseNode> list(new_<ListNode>(pnk, JSOP_NOP, TokenPos()));
+            if (!list) {
+                return false;
+            }
             list->makeEmpty();
             list->append(left.release());
             list->append(right.release());
             out = Move(list);
             break;
         }
-        case BinKind::assignment_expression:
-            // FIXME: Implement
-            break;
+        case BinKind::assignment_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 atom ptr.
+            // FIXME: We should probably turn associative operations into lists.
+            ParseNodeKind pnk = PNK_LIMIT;
+            if (op == "=") {
+                pnk = PNK_ASSIGN;
+            } else if (op == "+=") {
+                pnk = PNK_ADDASSIGN;
+            } else if (op == "-=") {
+                pnk = PNK_SUBASSIGN;
+            } else if (op == "*=") {
+                pnk = PNK_MULASSIGN;
+            } else if (op == "/=") {
+                pnk = PNK_DIVASSIGN;
+            } else if (op == "%=") {
+                pnk = PNK_MODASSIGN;
+            } else if (op == "<<=") {
+                pnk = PNK_LSHASSIGN;
+            } else if (op == ">>=") {
+                pnk = PNK_RSHASSIGN;
+            } else if (op == ">>>=") {
+                pnk = PNK_URSHASSIGN;
+            } else if (op == "|=") {
+                pnk = PNK_BITORASSIGN;
+            } else if (op == "^=") {
+                pnk = PNK_BITXORASSIGN;
+            } else if (op == "&=") {
+                pnk = PNK_BITANDASSIGN;
+            } else {
+                return this->raiseError();
+            }
+
+            UniquePtr<ParseNode> list(new_<BinaryNode>(pnk, JSOP_NOP, TokenPos(), left.get(), right.get()));
+            if (!list) {
+                return false;
+            }
+            Unused << left.release();
+            Unused << right.release();
+        }
         case BinKind::logical_expression:
             // FIXME: Implement
             break;
         case BinKind::member_expression:
             // FIXME: Implement
             break;
         case BinKind::conditional_expression:
             // FIXME: Implement