WIP: Implemented BreakStatement/ContinueStatement draft
authorDavid Teller <dteller@mozilla.com>
Mon, 24 Jul 2017 19:06:32 +0200
changeset 641334 0f3d922122bfce624ea495cb352b5f420ce95a6e
parent 641333 29801100444078abc8091304c25b98a4837bc3b8
child 641335 dd14b5b2f7ab619e7572552932e76e7e9cc5aa91
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented BreakStatement/ContinueStatement MozReview-Commit-ID: Fnl8ncyd5xm
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -414,17 +414,17 @@ ASTReader::parseStatement(SimpleTokenRea
         }
         if (!body || !expr) {
             return false;
         }
 
         UniquePtr<ParseNode> result(new_<BinaryNode>(PNK_WITH, JSOP_NOP, TokenPos(),
                                         expr.release(), body.release()));
         if (!result) {
-            return false;
+            return this->raiseError();
         }
         out = Move(result);
 
     } else if (name == "ReturnStatement") {
 
         UniquePtr<ParseNode> arg;
         for (auto field: fields) {
             if (field == "argument") {
@@ -434,17 +434,17 @@ ASTReader::parseStatement(SimpleTokenRea
             } else {
                 return this->raiseError();
             }
         }
 
         // `arg` is optional, so we don't check whether it's `nullptr`.
         UniquePtr<ParseNode> result(new_<UnaryNode>(PNK_RETURN, JSOP_RETURN, TokenPos(), arg.release()));
         if (!result) {
-            return false;
+            return this->raiseError();
         }
         out = Move(result);
 
     } else if (name == "LabeledStatement") {
 
         UniquePtr<PropertyName> label;
         UniquePtr<ParseNode> body;
 
@@ -458,30 +458,58 @@ ASTReader::parseStatement(SimpleTokenRea
                     return false;
                 }
             } else {
                 return this->raiseError();
             }
         }
 
         if (!label || !body) {
-            return false;
+            return this->raiseError();
         }
 
         UniquePtr<ParseNode> result(new_<LabeledStatement>(label.release(), body.release(), 0));
         if (!result) {
             return false;
         }
 
         out = Move(result);
 
-    } else if (name == "BreakStatement") {
-        // FIXME: Implement
-    } else if (name == "ContinueStatement") {
-        // FIXME: Implement
+    } else if (name == "BreakStatement" || name == "ContinueStatement") {
+
+        UniquePtr<PropertyName> label;
+
+        for (auto field: fields) {
+            if (field == "label") {
+                if (!this->parsePropertyName(&sub, label)) {
+                    return false;
+                }
+            } else {
+                return this->raiseError();
+            }
+        }
+
+        if (!label) {
+            return this->raiseError();
+        }
+
+        if (name == "BreakStatement") {
+            UniquePtr<ParseNode> result(new_<BreakStatement>(label.release(), TokenPos()));
+            if (!result) {
+                return false;
+            }
+            out = Move(result);
+        } else {
+            UniquePtr<ParseNode> result(new_<ContinueStatement>(label.release(), TokenPos()));
+            if (!result) {
+                return false;
+            }
+            out = Move(result);
+        }
+
     } else if (name == "IfStatement") {
         // FIXME: Implement
     } else if (name == "SwitchStatement") {
         // FIXME: Implement
     } else if (name == "SwitchCase") {
         // FIXME: Implement
     } else if (name == "ThrowStatement") {
         // FIXME: Implement