[JSC] use ExpressionErrorClassifier for AwaitExpression operand
authorcaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Apr 2017 19:50:24 +0000 (19:50 +0000)
committercaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Apr 2017 19:50:24 +0000 (19:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=170844

Reviewed by Saam Barati.

JSTests:

* stress/regress-170732.js: Added.

Source/JavaScriptCore:

In parseAssignmentExpression(), several cover grammars are handled, and
use ExpressionErrorClassifier to record hints about which grammars to
try.

In parseAwaitExpression(), the hints recorded during parsing of the
operand need to be discarded, because if they propagate to the outer
parseAssignmentExpression(), the hints will lead the parser down invalid
branches that should be skipped.

This change adds an additional ExpressionErrorClassifier to
parseAwaitExpression(), in order to discard hints recorded trying to
parse the operand.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseAwaitExpression):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@215370 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/regress-170732.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 3a002f7..439e090 100644 (file)
@@ -1,3 +1,12 @@
+2017-04-14  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] use ExpressionErrorClassifier for AwaitExpression operand
+        https://bugs.webkit.org/show_bug.cgi?id=170844
+
+        Reviewed by Saam Barati.
+
+        * stress/regress-170732.js: Added.
+
 2017-04-14  Oleksandr Skachkov  <gskachkov@gmail.com>
 
         Safari 10.1 JSON.parse returns incorrect object for numeric keys with decimal values
diff --git a/JSTests/stress/regress-170732.js b/JSTests/stress/regress-170732.js
new file mode 100644 (file)
index 0000000..b4474c2
--- /dev/null
@@ -0,0 +1,4 @@
+//@ runDefault("--exception=SyntaxError")
+async function f() {
+    await async()=>{}
+}
index fa99720..a511a44 100644 (file)
@@ -1,3 +1,26 @@
+2017-04-14  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] use ExpressionErrorClassifier for AwaitExpression operand
+        https://bugs.webkit.org/show_bug.cgi?id=170844
+
+        Reviewed by Saam Barati.
+
+        In parseAssignmentExpression(), several cover grammars are handled, and
+        use ExpressionErrorClassifier to record hints about which grammars to
+        try.
+
+        In parseAwaitExpression(), the hints recorded during parsing of the
+        operand need to be discarded, because if they propagate to the outer
+        parseAssignmentExpression(), the hints will lead the parser down invalid
+        branches that should be skipped.
+
+        This change adds an additional ExpressionErrorClassifier to
+        parseAwaitExpression(), in order to discard hints recorded trying to
+        parse the operand.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseAwaitExpression):
+
 2017-04-14  Saam Barati  <sbarati@apple.com>
 
         WebAssembly: There is a short window of time where a CodeBlock could be destroyed before all of its async compilation callbacks are called
index 975e10c..b77f877 100644 (file)
@@ -3555,6 +3555,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseAwaitExpress
     JSTextPosition divotStart = tokenStartPosition();
     next();
     JSTextPosition argumentStart = tokenStartPosition();
+    ExpressionErrorClassifier classifier(this);
     TreeExpression argument = parseUnaryExpression(context);
     failIfFalse(argument, "Failed to parse await expression");
     return context.createAwait(location, argument, divotStart, argumentStart, lastTokenEndPosition());