WIP: Implemented WithStatement draft
authorDavid Teller <dteller@mozilla.com>
Mon, 24 Jul 2017 17:40:51 +0200
changeset 641331 4dd2ecb8c3b33519ed48f02ae3fab9dee8deb298
parent 641330 8ad72c5790321039eccc4955d0ee0b576abab8d6
child 641332 4a4cdba6501a7e0cf738ca8c9e1dd4ee0d1a746d
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented WithStatement MozReview-Commit-ID: 5MTlKhDskpm
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -84,16 +84,17 @@ private:
     bool parseProgram(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseStatementList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseStringList(SimpleTokenReader* reader, MutableHandle<Maybe<Names>> out);
     bool parseStringList(SimpleTokenReader* reader, MutableHandle<Names> out);
     bool parseStringSet(SimpleTokenReader* reader, MutableHandle<Maybe<NameBag>>);
     bool parseStringSet(SimpleTokenReader* reader, MutableHandle<NameBag>);
     bool parseScope(SimpleTokenReader* reader, ScopeData& out);
+    bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
 
     // --- Parse the contents of a node whose kind has already been determined.
 
     bool parseBlockStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
     bool parseExpressionStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
 
     // --- Utilities.
     bool readString(SimpleTokenReader* reader, MutableHandleString);
@@ -388,17 +389,41 @@ ASTReader::parseStatement(SimpleTokenRea
         out = Move(body);
     } else if (name == "DebuggerStatement") {
         UniquePtr<ParseNode> result(new_<DebuggerStatement>(TokenPos()));
         if (!result) {
             return false;
         }
         out = Move(result);
     } else if (name == "WithStatement") {
-        // FIXME: Implement
+        UniquePtr<ParseNode> body;
+        UniquePtr<ParseNode> expr;
+        for (auto field: fields) {
+            if (field == "body") {
+                if (!this->parseStatement(&sub, body)) {
+                    return false;
+                }
+            } else if (field == "object") {
+                if (!this->parseExpression(&sub, body)) {
+                    return false;
+                }
+            } else {
+                return this->raiseError();
+            }
+        }
+        if (!body || !expr) {
+            return false;
+        }
+
+        UniquePtr<ParseNode> result(new_<BinaryNode>(PNK_WITH, JSOP_NOP, TokenPos(),
+                                        expr.release(), body.release()));
+        if (!result) {
+            return false;
+        }
+        out = Move(result);
     } else if (name == "ReturnStatement") {
         // FIXME: Implement
     } else if (name == "LabeledStatement") {
         // FIXME: Implement
     } else if (name == "BreakStatement") {
         // FIXME: Implement
     } else if (name == "ContinueStatement") {
         // FIXME: Implement