From 35795758c645adf5347e9e178358d8a4f9f35301 Mon Sep 17 00:00:00 2001 From: "caitp@igalia.com" Date: Thu, 20 Oct 2016 18:30:59 +0000 Subject: [PATCH] [JSC] disallow references to `await` in AsyncFunction formal parameters 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::parseAssignmentExpression): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207628 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- JSTests/ChangeLog | 9 ++++ JSTests/stress/async-await-syntax.js | 77 +++++++++++++++++++++++++++++++++ Source/JavaScriptCore/ChangeLog | 10 +++++ Source/JavaScriptCore/parser/Parser.cpp | 5 +++ 4 files changed, 101 insertions(+) diff --git a/JSTests/ChangeLog b/JSTests/ChangeLog index 11fb219..dd37502 100644 --- a/JSTests/ChangeLog +++ b/JSTests/ChangeLog @@ -1,3 +1,12 @@ +2016-10-20 Caitlin Potter + + [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 Invalid assertion in arguments elimination diff --git a/JSTests/stress/async-await-syntax.js b/JSTests/stress/async-await-syntax.js index bdae77d..200d5ea 100644 --- a/JSTests/stress/async-await-syntax.js +++ b/JSTests/stress/async-await-syntax.js @@ -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}`); + } +})(); diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 15e0a84..73c8b22 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,13 @@ +2016-10-20 Caitlin Potter + + [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::parseAssignmentExpression): + 2016-10-19 Yusuke Suzuki [JSC] Move InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero to out of line type info flags diff --git a/Source/JavaScriptCore/parser/Parser.cpp b/Source/JavaScriptCore/parser/Parser.cpp index 67724e3..4908841 100644 --- a/Source/JavaScriptCore/parser/Parser.cpp +++ b/Source/JavaScriptCore/parser/Parser.cpp @@ -4247,6 +4247,11 @@ template TreeExpression Parser::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(); -- 1.8.3.1