WIP: Implemented call_expression draft
authorDavid Teller <dteller@mozilla.com>
Fri, 04 Aug 2017 18:41:05 +0200
changeset 641375 946d93dcb6d3b2a7813d5ed766b0af6ad33bd393
parent 641374 1884c68b64ecb632a828316a63f5144dee7a52f4
child 641376 455c1dc1d17a173be5309ac8309aaadb800a45bb
push id72504
push userdteller@mozilla.com
push dateSun, 06 Aug 2017 22:28:40 +0000
milestone57.0a1
WIP: Implemented call_expression MozReview-Commit-ID: COwGw8tBz2O
js/src/frontend/BinSource.cpp
--- a/js/src/frontend/BinSource.cpp
+++ b/js/src/frontend/BinSource.cpp
@@ -1933,19 +1933,48 @@ ASTReader::parseExpression(SimpleTokenRe
 
             Unused << test.release();
             Unused << alternate.release();
             Unused << consequent.release();
 
             out = Move(result);
             break;
         }
-        case BinKind::call_expression:
-            // FIXME: Implement
+        case BinKind::call_expression: {
+            UniquePtr<ParseNode> callee;
+            UniquePtr<ParseNode> arguments;
+
+            for (auto field: fields) {
+                switch (field) {
+                    case BinField::callee:
+                        if (!this->parseExpression(&sub, callee)) {
+                            return false;
+                        }
+                        break;
+                    case BinField::arguments:
+                        if (!this->parseExpressionList(&sub, arguments)) {
+                            return false;
+                        }
+                        break;
+                    default:
+                        return this->raiseError();
+                }
+            }
+
+            if (!callee || !arguments) {
+                return this->raiseError();
+            }
+
+            UniquePtr<ParseNode> result(new_<ListNode>(PNK_CALL, TokenPos()));
+            result->initList(arguments.release());
+            result->prepend(callee.release());
+
+            out = Move(result);
             break;
+        }
         case BinKind::new_expression:
             // FIXME: Implement
             break;
         case BinKind::sequence_expression: {
             UniquePtr<ParseNode> sequence;
 
             for (auto field: fields) {
                 switch (field) {