Prevent async methods named 'function'
authorgskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 May 2017 07:00:43 +0000 (07:00 +0000)
committergskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 May 2017 07:00:43 +0000 (07:00 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172598

Reviewed by Mark Lam.

JSTests:

* stress/async-await-syntax.js:
(testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntax):
(testTopLevelAsyncAwaitSyntaxSloppyMode):
(prototype.testTopLevelAsyncAwaitSyntaxStrictMode.testSyntax):
(prototype.testTopLevelAsyncAwaitSyntaxStrictMode):
(testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntaxError):

Source/JavaScriptCore:

Prevent async method named 'function' in class.
Link to change in ecma262 specification
https://github.com/tc39/ecma262/pull/884

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

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

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

index a689409..b680273 100644 (file)
@@ -1,3 +1,17 @@
+2017-05-26  Oleksandr Skachkov  <gskachkov@gmail.com>
+
+        Prevent async methods named 'function'
+        https://bugs.webkit.org/show_bug.cgi?id=172598
+
+        Reviewed by Mark Lam.
+
+        * stress/async-await-syntax.js:
+        (testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntax):
+        (testTopLevelAsyncAwaitSyntaxSloppyMode):
+        (prototype.testTopLevelAsyncAwaitSyntaxStrictMode.testSyntax):
+        (prototype.testTopLevelAsyncAwaitSyntaxStrictMode):
+        (testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntaxError):
+
 2017-05-25  Keith Miller  <keith_miller@apple.com>
 
         Date should use historical data if it's available.
index 47c1f57..c66d4c8 100644 (file)
@@ -49,6 +49,10 @@ function testSyntaxError(script, message) {
     testSyntax(`var asyncFn = async({ foo = 1 } = {}) => foo;`);
     testSyntax(`function* g() { var f = async(yield); }`);
     testSyntax(`function* g() { var f = async(x = yield); }`);
+    testSyntax(`class C { async ['function']() {} }`);
+    testSyntax(`class C {}; class C2 extends C { async ['function']() {} }`);
+    testSyntax(`class C { static async ['function']() {} }`);
+    testSyntax(`class C {}; class C2 extends C { static async ['function']() {} }`);
 })();
 
 (function testTopLevelAsyncAwaitSyntaxStrictMode() {
@@ -69,6 +73,10 @@ function testSyntaxError(script, message) {
     testSyntax(`"use strict"; var asyncFn = async({ foo = 1 } = {}) => foo;`);
     testSyntax(`"use strict"; function* g() { var f = async(yield); }`);
     testSyntax(`"use strict"; function* g() { var f = async(x = yield); }`);
+    testSyntax(`"use strict"; class C { async ['function']() {} }`);
+    testSyntax(`"use strict"; class C {}; class C2 extends C { async ['function']() {} }`);
+    testSyntax(`"use strict"; class C { static async ['function']() {} }`);
+    testSyntax(`"use strict"; class C {}; class C2 extends C { static async ['function']() {} }`);
 })();
 
 (function testNestedAsyncAwaitSyntax() {
@@ -179,6 +187,14 @@ function testSyntaxError(script, message) {
     testSyntaxError(`class C {}; class C2 extends C { async constructor() {} }`);
     testSyntaxError(`class C { static async prototype() {} }`);
     testSyntaxError(`class C {}; class C2 extends C { static async prototype() {} }`);
+    testSyntaxError(`class C { async function() {} }`);
+    testSyntaxError(`class C {}; class C2 extends C { async function() {} }`);
+    testSyntaxError(`class C { static async function() {} }`);
+    testSyntaxError(`class C {}; class C2 extends C { static async function() {} }`);
+    testSyntaxError(`class C { async 'function'() {} }`);
+    testSyntaxError(`class C {}; class C2 extends C { async 'function'() {} }`);
+    testSyntaxError(`class C { static async 'function'() {} }`);
+    testSyntaxError(`class C {}; class C2 extends C { static async 'function'() {} }`);
 
     testSyntaxError(`var f = async() => ((async(x = await 1) => x)();`);
 
@@ -250,6 +266,17 @@ function testSyntaxError(script, message) {
     testSyntaxError(`"use strict"; class C {}; class C2 extends C { async constructor() {} }`);
     testSyntaxError(`"use strict"; class C { static async prototype() {} }`);
     testSyntaxError(`"use strict"; class C {}; class C2 extends C { static async prototype() {} }`);
+    testSyntaxError(`"use strict"; class C { async function() {} }`);
+    testSyntaxError(`"use strict"; class C {}; class C2 extends C { async function() {} }`);
+    testSyntaxError(`"use strict"; class C { async function() {} }`);
+    testSyntaxError(`"use strict"; class C {}; class C2 extends C { async function() {} }`);
+    testSyntaxError(`"use strict"; class C { static async function() {} }`);
+    testSyntaxError(`"use strict"; class C {}; class C2 extends C { static async function() {} }`);
+    testSyntaxError(`"use strict"; class C { async 'function'() {} }`);
+    testSyntaxError(`"use strict"; class C {}; class C2 extends C { async 'function'() {} }`);
+    testSyntaxError(`"use strict"; class C { static async 'function'() {} }`);
+    testSyntaxError(`"use strict"; class C {}; class C2 extends C { static async 'function'() {} }`);
+
 
     testSyntaxError(`"use strict"; var f = async() => ((async(x = await 1) => x)();`);
 
index b6f3e65..0229c09 100644 (file)
@@ -1,3 +1,17 @@
+2017-05-26  Oleksandr Skachkov  <gskachkov@gmail.com>
+
+        Prevent async methods named 'function'
+        https://bugs.webkit.org/show_bug.cgi?id=172598
+
+        Reviewed by Mark Lam.
+
+        Prevent async method named 'function' in class.
+        Link to change in ecma262 specification
+        https://github.com/tc39/ecma262/pull/884
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseClass):
+
 2017-05-25  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Unreviewed, build fix for GCC
index 9b45da7..374f80e 100644 (file)
@@ -2691,6 +2691,7 @@ parseMethod:
                 parseMode = SourceParseMode::AsyncMethodMode;
                 semanticFailIfTrue(*ident == m_vm->propertyNames->prototype, "Cannot declare an async method named 'prototype'");
                 semanticFailIfTrue(*ident == m_vm->propertyNames->constructor, "Cannot declare an async method named 'constructor'");
+                semanticFailIfTrue(*ident == m_vm->propertyNames->functionKeyword, "Cannot declare an async method named 'function'");
             } else if (isGenerator) {
                 isConstructor = false;
                 parseMode = SourceParseMode::GeneratorWrapperMethodMode;