WIP: Implemented array_expression draft
authorDavid Teller <dteller@mozilla.com>
Mon, 31 Jul 2017 16:49:20 +0200
changeset 641362 3228b9db4034d9c15a9487127fe1bbafd3c13176
parent 641361 8e3cb5a7687297396e59ca1ee956f247cb9d4f27
child 641363 314520b84053ade060ab3616aee187038b332bc4
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented array_expression MozReview-Commit-ID: 1z2efqYlh3W
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -88,36 +88,41 @@ public:
         , alloc(alloc_)
     { }
 
     bool parse(char* start, char* stop, GlobalSharedContext* sc, UniquePtr<ParseNode>& out);
 private:
     bool raiseError();
 
     // --- Parse full nodes.
-    //
-    // By convention, all parse*List() that take a `UniquePtr<ParseNode>`
-    // construct an instance of `ListNode`.
 
     bool parseBool(SimpleTokenReader*, Maybe<bool>*);
     bool parseProgram(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseStatementList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
+    bool parseScope(SimpleTokenReader* reader, ScopeData& out);
+    bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
+    bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
+    bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+    bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+    bool parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+
+    // --- Parse lists of nodes.
+    //
+    // By convention, all parse*List() that take a `UniquePtr<ParseNode>`
+    // construct an instance of `ListNode`. Since `ListNode` cannot represent
+    // `nullptr`, we follow the conventions of `PNK_ARRAY` and represent
+    // null nodes as `PNK_ELISIION`.
+
     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);
     bool parseExpressionList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
-    bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
     bool parseSwitchCaseList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
-    bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
-    bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
-    bool parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
     bool parsePatternList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
     bool parseDirectiveList(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
 
     // --- Parse the contents of a node whose kind has already been determined.
 
     bool parseFunctionAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
     bool parsePatternAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
     bool parseBlockStatementAux(SimpleTokenReader* reader, const BinKind kind, const SimpleTokenReader::BinFields& fields, UniquePtr<ParseNode>& out);
@@ -1469,19 +1474,27 @@ ASTReader::parseExpression(SimpleTokenRe
             if (!result) {
                 return false;
             }
             Unused << thisName.release();
 
             out = Move(result);
             break;
         }
-        case BinKind::array_expression:
-            // FIXME: Implement
+        case BinKind::array_expression: {
+            UniquePtr<ParseNode> result;
+            if (!this->parseExpressionList(&sub, result)) {
+                return false;
+            }
+
+            result->setKind(PNK_ARRAY);
+            result->setOp(JSOP_NEWINIT);
+            out = Move(result);
             break;
+        }
         case BinKind::object_expression:
             // FIXME: Implement
             break;
         case BinKind::function_expression:
             // FIXME: Implement
             break;
         case BinKind::unary_expression:
         case BinKind::update_expression: {