Prevent async methods named 'function' in Object literal
authorgskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 May 2017 21:35:49 +0000 (21:35 +0000)
committergskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 May 2017 21:35:49 +0000 (21:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172660

Reviewed by Saam Barati.

JSTests:

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

Source/JavaScriptCore:

Prevent async method named 'function' in object.
https://github.com/tc39/ecma262/pull/884

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

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

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

index 5b19edd..574c11b 100644 (file)
@@ -1,5 +1,15 @@
 2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
 
+        Prevent async methods named 'function' in Object literal
+        https://bugs.webkit.org/show_bug.cgi?id=172660
+
+        Reviewed by Saam Barati.
+
+        * stress/async-await-syntax.js:
+        (testTopLevelAsyncAwaitSyntaxSloppyMode.testSyntaxError):
+
+2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
+
         ASSERTION FAILED: generator.isConstructor() || generator.derivedContextType() == DerivedContextType::DerivedConstructorContext
         https://bugs.webkit.org/show_bug.cgi?id=171274
 
index c66d4c8..183899c 100644 (file)
@@ -173,6 +173,8 @@ function testSyntaxError(script, message) {
     testSyntaxError(`var O = { async *asyncGeneratorMethod() {} };`);
     testSyntaxError(`var O = { async asyncGeneratorMethod*() {} };`);
 
+    testSyntaxError(`var O = { async function() {} };`);
+
     testSyntaxError(`var asyncFn = async function(x = await 1) { return x; }`);
     testSyntaxError(`async function f(x = await 1) { return x; }`);
     testSyntaxError(`var f = async(x = await 1) => x;`);
@@ -252,6 +254,8 @@ function testSyntaxError(script, message) {
     testSyntaxError(`"use strict"; var O = { async *asyncGeneratorMethod() {} };`);
     testSyntaxError(`"use strict"; var O = { async asyncGeneratorMethod*() {} };`);
 
+    testSyntaxError(`"use strict"; var O = { async function() {} };`);
+
     testSyntaxError(`"use strict"; var asyncFn = async function(x = await 1) { return x; }`);
     testSyntaxError(`"use strict"; async function f(x = await 1) { return x; }`);
     testSyntaxError(`"use strict"; var f = async(x = await 1) => x;`);
index 78aed48..1a71c59 100644 (file)
@@ -1,5 +1,18 @@
 2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
 
+        Prevent async methods named 'function' in Object literal
+        https://bugs.webkit.org/show_bug.cgi?id=172660
+
+        Reviewed by Saam Barati.
+
+        Prevent async method named 'function' in object.
+        https://github.com/tc39/ecma262/pull/884
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parsePropertyMethod):
+
+2017-05-30  Oleksandr Skachkov  <gskachkov@gmail.com>
+
         ASSERTION FAILED: generator.isConstructor() || generator.derivedContextType() == DerivedContextType::DerivedConstructorContext
         https://bugs.webkit.org/show_bug.cgi?id=171274
 
index 374f80e..400cb25 100644 (file)
@@ -3808,6 +3808,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePropertyMeth
     unsigned methodStart = tokenStart();
     ParserFunctionInfo<TreeBuilder> methodInfo;
     methodInfo.name = methodName;
+    semanticFailIfTrue(isAsyncMethod && *methodName == m_vm->propertyNames->functionKeyword, "Cannot declare an async method named 'function'");
     SourceParseMode parseMode = isGenerator ? SourceParseMode::GeneratorWrapperMethodMode : isAsyncMethod ? SourceParseMode::AsyncMethodMode : SourceParseMode::MethodMode;
     failIfFalse((parseFunctionInfo(context, FunctionNameRequirements::Unnamed, parseMode, false, ConstructorKind::None, SuperBinding::Needed, methodStart, methodInfo, FunctionDefinitionType::Method)), "Cannot parse this method");
     return context.createMethodDefinition(methodLocation, methodInfo);