[JSC] disallow references to `await` in AsyncFunction formal parameters
authorcaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Oct 2016 18:30:59 +0000 (18:30 +0000)
committercaitp@igalia.com <caitp@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Oct 2016 18:30:59 +0000 (18:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=163694

Reviewed by Saam Barati.

JSTests:

* stress/async-await-syntax.js:

Source/JavaScriptCore:

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

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

JSTests/ChangeLog
JSTests/stress/async-await-syntax.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Parser.cpp

index 11fb219..dd37502 100644 (file)
@@ -1,3 +1,12 @@
+2016-10-20  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] disallow references to `await` in AsyncFunction formal parameters
+        https://bugs.webkit.org/show_bug.cgi?id=163694
+
+        Reviewed by Saam Barati.
+
+        * stress/async-await-syntax.js:
+
 2016-10-20  Keith Miller  <keith_miller@apple.com>
 
         Invalid assertion in arguments elimination
index bdae77d..200d5ea 100644 (file)
@@ -278,3 +278,80 @@ function testSyntaxError(script, message) {
 
     testSyntaxError(`"use strict"; var O = { async method(dupe, dupe) {} }`);
 })();
+
+(function testAwaitInFormalParameters() {
+    var testData = [
+        `async function f(await) {}`,
+        `async function f(...await) {}`,
+        `async function f(await = 1) {}`,
+        `async function f([await]) {}`,
+        `async function f([await = 1]) {}`,
+        `async function f({ await }) {}`,
+        `async function f({ await = 1 }) {}`,
+        `async function f({ } = await) {}`,
+
+        `(async function(await) {})`,
+        `(async function(...await) {})`,
+        `(async function(await = 1) {})`,
+        `(async function([await]) {})`,
+        `(async function([await = 1]) {})`,
+        `(async function({ await }) {})`,
+        `(async function({ await = 1 }) {})`,
+        `(async function({ } = await) {})`,
+
+        `var asyncArrow = async(await) => 1;`,
+        `var asyncArrow = async(await) => {};`,
+        `var asyncArrow = async(...await) => 1;`,
+        `var asyncArrow = async(...await) => {};`,
+        `var asyncArrow = async(await = 1) => 1;`,
+        `var asyncArrow = async(await = 1) => {};`,
+        `var asyncArrow = async([await]) => 1;`,
+        `var asyncArrow = async([await]) => {};`,
+        `var asyncArrow = async([await = 1]) => 1;`,
+        `var asyncArrow = async([await = 1]) => {};`,
+        `var asyncArrow = async([] = await) => 1;`,
+        `var asyncArrow = async([] = await) => {};`,
+        `var asyncArrow = async({ await }) => 1;`,
+        `var asyncArrow = async({ await } ) => {};`,
+        `var asyncArrow = async({ await = 1}) => 1;`,
+        `var asyncArrow = async({ await = 1}) => {};`,
+        `var asyncArrow = async({ } = await) => 1;`,
+        `var asyncArrow = async({ } = await) => {};`,
+
+        `({ async method(await) {} })`,
+        `({ async method(...await) {} })`,
+        `({ async method(await = 1) {} })`,
+        `({ async method([await]) {} })`,
+        `({ async method([await = 1]) {} })`,
+        `({ async method({ await }) {} })`,
+        `({ async method({ await = 1 }) {} })`,
+        `({ async method({ } = await) {} })`,
+
+        `(class { async method(await) {} })`,
+        `(class { async method(...await) {} })`,
+        `(class { async method(await = 1) {} })`,
+        `(class { async method([await]) {} })`,
+        `(class { async method([await = 1]) {} })`,
+        `(class { async method({ await }) {} })`,
+        `(class { async method({ await = 1 }) {} })`,
+        `(class { async method({ } = await) {} })`,
+
+        `(class { static async method(await) {} })`,
+        `(class { static async method(...await) {} })`,
+        `(class { static async method(await = 1) {} })`,
+        `(class { static async method([await]) {} })`,
+        `(class { static async method([await = 1]) {} })`,
+        `(class { static async method({ await }) {} })`,
+        `(class { static async method({ await = 1 }) {} })`,
+        `(class { static async method({ } = await) {} })`,
+    ];
+
+    for (let script of testData) {
+        testSyntaxError(script);
+        testSyntaxError(`"use strict"; ${script}`);
+
+        var nested = `var await; var f = (async function() { ${script} });`;
+        testSyntaxError(nested);
+        testSyntaxError(`"use strict"; ${nested}`);
+    }
+})();
index 15e0a84..73c8b22 100644 (file)
@@ -1,3 +1,13 @@
+2016-10-20  Caitlin Potter  <caitp@igalia.com>
+
+        [JSC] disallow references to `await` in AsyncFunction formal parameters
+        https://bugs.webkit.org/show_bug.cgi?id=163694
+
+        Reviewed by Saam Barati.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseAssignmentExpression):
+
 2016-10-19  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [JSC] Move InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero to out of line type info flags
index 67724e3..4908841 100644 (file)
@@ -4247,6 +4247,11 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre
         return context.createThisExpr(location);
     }
     case AWAIT:
+#if ENABLE(ES2017_ASYNCFUNCTION_SYNTAX)
+        if (m_parserState.functionParsePhase == FunctionParsePhase::Parameters)
+            failIfFalse(m_parserState.allowAwait, "Cannot use await expression within parameters");
+        FALLTHROUGH;
+#endif
     case IDENT: {
     identifierExpression:
         JSTextPosition start = tokenStartPosition();