WIP: Implemented sequence_expression draft
authorDavid Teller <dteller@mozilla.com>
Thu, 27 Jul 2017 17:40:07 +0200
changeset 641352 fc49c4f1318e40ece0f3051df3f05279f029b684
parent 641351 cb9e3aff091eed8a3301a5ebccb90fb1276e9c96
child 641353 b10ce742139f4d35d90061e4f6196dc1dfed1b95
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented sequence_expression MozReview-Commit-ID: 6t0ghbT4IBK
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -87,27 +87,31 @@ 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 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>&);
 
@@ -1480,19 +1484,39 @@ ASTReader::parseExpression(SimpleTokenRe
             break;
         }
         case BinKind::call_expression:
             // FIXME: Implement
             break;
         case BinKind::new_expression:
             // FIXME: Implement
             break;
-        case BinKind::sequence_expression:
-            // FIXME: Implement
+        case BinKind::sequence_expression: {
+            UniquePtr<ParseNode> sequence;
+
+            for (auto field: fields) {
+                switch (field) {
+                    case BinField::expressions:
+                        if (!this->parseExpressionList(&sub, sequence)) {
+                            return false;
+                        }
+                        break;
+                    default:
+                        return this->raiseError();
+                }
+            }
+
+            if (!sequence) {
+                this->raiseError();
+            }
+
+            sequence->setKind(PNK_COMMA);
+            out = Move(sequence);
             break;
+        }
         default:
             return this->raiseError();
     }
 
     return false;
 }