WIP: parseCatchClause draft
authorDavid Teller <dteller@mozilla.com>
Sun, 06 Aug 2017 10:56:05 +0200
changeset 641388 d8dfa3ef84a0573a298c4bcd02146d534290d595
parent 641387 5237c781673f893446d93169f7ffcc7edf8c207c
child 641389 d25624af658f8f584ee078ae6ccfba1e5ec5a7d3
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: parseCatchClause MozReview-Commit-ID: 46zKg3yNG32
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -2289,16 +2289,85 @@ ASTReader::parseSwitchCase(SimpleTokenRe
     Unused << test.release();
     Unused << statements.release();
 
     out = Move(result);
     return true;
 }
 
 bool
+ASTReader::parseCatchClause(SimpleTokenReader* reader, UniquePtr<ParseNode>& out) {
+    if (out) {
+        return this->raiseError();
+    }
+
+
+    BinKind kind;
+    SimpleTokenReader::BinFields fields(this->cx);
+    SimpleTokenReader sub(this->cx);
+
+    if (!reader->taggedTuple(kind, fields, &sub)) {
+        return false;
+    }
+
+    if (kind != BinKind::catch_clause) {
+        return this->raiseError();
+    }
+
+    UniquePtr<ParseNode> param;
+    UniquePtr<ParseNode> body;
+
+    for (auto field: fields) {
+        switch (field) {
+            case BinField::param:
+                if (!this->parsePattern(&sub, param)) {
+                    return false;
+                }
+                break;
+            case BinField::body:
+                if (!this->parseStatementList(&sub, body)) {
+                    return false;
+                }
+                break;
+            default:
+                return this->raiseError();
+        }
+    }
+
+    if (!param || !body) {
+        return this->raiseError();
+    }
+
+    UniquePtr<ParseNode> catchClause(new_<TernaryNode>(PNK_CATCH, JSOP_NOP, param.get(), nullptr, body.get()));
+    if (!catchClause) {
+        return false;
+    }
+
+    Unused << param.release();
+    Unused << body.release();
+
+    UniquePtr<ParseNode> lexNode(new_<LexicalScopeNode>(/*FIXME: Implement*/nullptr, catchClause.get()));
+    if (!lexNode) {
+        return false;
+    }
+    Unused << catchClause.release();
+
+    UniquePtr<ParseNode> catchList(new_<ListNode>(PNK_CATCHLIST, TokenPos()));// FIXME: We need a PNK_CATCHLIST of a single PNK_CATCH
+    if (!catchList) {
+        return false;
+    }
+
+    catchList->append(catchClause.release());
+
+    out = Move(catchList);
+    return true;
+}
+
+
+bool
 ASTReader::readString(SimpleTokenReader* reader, MutableHandle<PropertyName*> out) {
     if (out) {
         return this->raiseError();
     }
 
     RootedAtom atom(cx);
 
     if (!this->readString(reader, &atom)) {