WIP: parseSwitchCaseList draft
authorDavid Teller <dteller@mozilla.com>
Fri, 04 Aug 2017 23:05:36 +0200
changeset 641379 1dc1228db3f0bb3ea9fcfed60e4f459abb53c48a
parent 641378 0e31855a1a18e971cc1474e02935a4418145ab07
child 641380 c3a8b7d4a349bc402bbea1080d3cdaed95f6c25c
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: parseSwitchCaseList MozReview-Commit-ID: 17d3sJTIXqZ
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -98,25 +98,26 @@ public:
     }
 
     bool parse(char* start, char* stop, GlobalSharedContext* sc, UniquePtr<ParseNode>& out);
 private:
     bool raiseError();
 
     // --- Parse full nodes.
 
+    bool parseBlockStatement(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+    bool parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
+    bool parseExpression(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parsePattern(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseProgram(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
+    bool parsePropertyName(SimpleTokenReader* reader, UniquePtr<PropertyName>& out);
+    bool parseScope(SimpleTokenReader* reader, ScopeData& 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 parseSwitchCase(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
     bool parseVariableDeclarator(SimpleTokenReader* reader, UniquePtr<ParseNode>&);
 
     // --- Parse lists of nodes.
 
 
     // Produces a list of expressions. Empty expressions are replaced with PNK_ELISION.
     bool parseExpressionOrElisionList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out);
 
@@ -2161,16 +2162,52 @@ ASTReader::parseExpressionOrElisionList(
     }
 
     out = Move(result);
     return true;
 }
 
 
 bool
+ASTReader::parseSwitchCaseList(SimpleTokenReader* reader, UniquePtr<ParseNode>& out) {
+    if (out) {
+        return this->raiseError();
+    }
+
+    uint32_t length;
+    SimpleTokenReader sub(this->cx);
+
+    if (!reader->readList(&length, &sub)) {
+        return false;
+    }
+
+    UniquePtr<ParseNode> result(new_<ListNode>(PNK_ARRAY, TokenPos()));
+    if (!result) {
+        return false;
+    }
+
+    for (uint32_t i = 0; i < length; ++i) {
+        UniquePtr<ParseNode> case_;
+        if (!this->parseSwitchCase(&sub, case_)) {
+            return false;
+        }
+
+        if (!case_) {
+            return this->raiseError();
+        }
+
+        result->append(case_.release());
+    }
+
+    out = Move(result);
+    return true;
+}
+
+
+bool
 ASTReader::readNumber(SimpleTokenReader* reader, Maybe<double>& out) {
     if (out) {
         return this->raiseError();
     }
 
     return reader->readMaybeF64(&out);
 }