WIP: Implemented SwitchCaseStatement draft
authorDavid Teller <dteller@mozilla.com>
Mon, 24 Jul 2017 20:42:25 +0200
changeset 641336 11764e5bedbd2ea117e4964bd4144ceb1e537e64
parent 641335 dd14b5b2f7ab619e7572552932e76e7e9cc5aa91
child 641337 cb3f1296e080388979feacede40d87163442f785
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented SwitchCaseStatement MozReview-Commit-ID: IldRkCeK9dP
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -9,16 +9,21 @@
 #include <frontend/ParseNode.h>
 #include <frontend/BinTokenReader.h>
 
 
 using namespace mozilla;
 using NameBag = GCHashSet<JSString*>;
 using Names = GCVector<JSString*, 8>;
 
+// FIXME: Better error handling.
+// FIXME: Proper error handling if `new_` fails.
+// FIXME: Check that subnodes have the right type.
+// FIXME: Check scope information.
+
 namespace js {
 namespace frontend {
 
 
 // Copied from Parser.cpp
 
 template <typename Scope>
 static typename Scope::Data*
@@ -567,17 +572,41 @@ ASTReader::parseStatement(SimpleTokenRea
         UniquePtr<ParseNode> result(new_<BinaryNode>(PNK_SWITCH, JSOP_NOP, TokenPos(), discriminant.release(), cases.release()));
         if (!result) {
             return false;
         }
 
         out = Move(result);
 
     } else if (name == "SwitchCase") {
-        // FIXME: Implement
+
+        UniquePtr<ParseNode> test;
+        UniquePtr<ParseNode> consequent;
+
+        for (auto field: fields) {
+            if (field == "test") {
+                if (!this->parseExpression(&sub, test)) {
+                    return false;
+                }
+            } else if (field == "consequent") {
+                if (!this->parseStatementList(&sub, consequent)) {
+                    return false;
+                }
+            } else {
+                return this->raiseError();
+            }
+        }
+
+        UniquePtr<ParseNode> result(new_<CaseClause>(test.release(), consequent.release(), 0));
+        if (!result) {
+            return false;
+        }
+
+        out = Move(result);
+        
     } else if (name == "ThrowStatement") {
         // FIXME: Implement
     } else if (name == "TryStatement") {
         // FIXME: Implement
     } else if (name == "WhileStatement") {
         // FIXME: Implement
     } else if (name == "DoWhileStatement") {
         // FIXME: Implement