WIP: Implemented CatchStatement draft
authorDavid Teller <dteller@mozilla.com>
Mon, 24 Jul 2017 20:52:07 +0200
changeset 641338 2d490e8c494e68db65fa2cf710cf03a549d7177c
parent 641337 cb3f1296e080388979feacede40d87163442f785
child 641339 e62a6960920252cdeb167c35b5068f10b49f69e8
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented CatchStatement MozReview-Commit-ID: 2dzY7joOhXi
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -92,16 +92,18 @@ private:
     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 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>&);
 
     // --- Parse the contents of a node whose kind has already been determined.
 
     bool parseBlockStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
     bool parseExpressionStatementAux(SimpleTokenReader* reader, const SimpleTokenReader::Fields* fields, UniquePtr<ParseNode>& out);
 
     // --- Utilities.
     bool readString(SimpleTokenReader* reader, MutableHandleString);
@@ -621,17 +623,49 @@ ASTReader::parseStatement(SimpleTokenRea
 
         UniquePtr<ParseNode> result(new_<UnaryNode>(PNK_THROW, JSOP_THROW, TokenPos(), arg.release()));
         if (!result) {
             return this->raiseError();
         }
         out = Move(result);
 
     } else if (name == "TryStatement") {
-        // FIXME: Implement
+
+        UniquePtr<ParseNode> block;
+        UniquePtr<ParseNode> handler;
+        UniquePtr<ParseNode> finalizer;
+
+        for (auto field: fields) {
+            if (field == "block") {
+                if (!this->parseBlockStatement(&sub, block)) {
+                    return false;
+                }
+            } else if (field == "handler") {
+                if (!this->parseCatchClause(&sub, handler)) {
+                    return false;
+                }
+            } else if (field == "finalizer") {
+                if (!this->parseBlockStatement(&sub, finalizer)) {
+                    return false;
+                }
+            } else {
+                return this->raiseError();
+            }
+        }
+
+        if (!block || !handler) { // `finalizer` is optional
+            return this->raiseError();
+        }
+
+        UniquePtr<ParseNode> result(new_<TernaryNode>(PNK_TRY, JSOP_NOP, block.release(), handler.release(), finalizer.release(), TokenPos()));
+        if (!result) {
+            return false;
+        }
+
+        out = Move(result);
     } else if (name == "WhileStatement") {
         // FIXME: Implement
     } else if (name == "DoWhileStatement") {
         // FIXME: Implement
     } else if (name == "ForStatement") {
         // FIXME: Implement
     } else if (name == "ForInStatement") {
         // FIXME: Implement