From 604c05b38105dc5c8eeec06a1cf44a16acab6701 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Mon, 21 Jan 2019 23:55:48 -0800 Subject: [PATCH] Class declarations are always in strict mode including its identifier --- acorn/src/statement.js | 6 ++++++ bin/test262.whitelist | 22 ---------------------- test/tests-async-iteration.js | 2 +- test/tests-harmony.js | 4 +++- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/acorn/src/statement.js b/acorn/src/statement.js index 7a61d4b01..f8daf3cd4 100644 --- a/acorn/src/statement.js +++ b/acorn/src/statement.js @@ -529,6 +529,11 @@ pp.parseFunctionParams = function(node) { pp.parseClass = function(node, isStatement) { this.next() + // ecma-262 14.6 Class Definitions + // A class definition is always strict mode code. + const oldStrict = this.strict; + this.strict = true; + this.parseClassId(node, isStatement) this.parseClassSuper(node) let classBody = this.startNode() @@ -546,6 +551,7 @@ pp.parseClass = function(node, isStatement) { } } node.body = this.finishNode(classBody, "ClassBody") + this.strict = oldStrict; return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") } diff --git a/bin/test262.whitelist b/bin/test262.whitelist index f9bde2968..541480baa 100644 --- a/bin/test262.whitelist +++ b/bin/test262.whitelist @@ -115,14 +115,6 @@ language/expressions/async-arrow-function/await-as-param-rest-nested-arrow-param language/expressions/async-arrow-function/await-as-param-rest-nested-arrow-parameter-position.js (strict mode) language/expressions/async-arrow-function/early-errors-arrow-await-in-formals-default.js (default) language/expressions/async-arrow-function/early-errors-arrow-await-in-formals-default.js (strict mode) -language/expressions/class/class-name-ident-let-escaped.js (default) -language/expressions/class/class-name-ident-let.js (default) -language/expressions/class/class-name-ident-static-escaped.js (default) -language/expressions/class/class-name-ident-static.js (default) -language/expressions/class/class-name-ident-yield-escaped.js (default) -language/expressions/class/class-name-ident-yield.js (default) -language/expressions/class/method-param-dflt-yield.js (default) -language/expressions/class/static-method-param-dflt-yield.js (default) language/expressions/object/method-definition/early-errors-object-method-duplicate-parameters.js (default) language/expressions/object/prop-def-invalid-async-prefix.js (default) language/expressions/object/prop-def-invalid-async-prefix.js (strict mode) @@ -134,20 +126,6 @@ language/module-code/early-export-global.js (default) language/module-code/early-export-global.js (strict mode) language/module-code/early-export-unresolvable.js (default) language/module-code/early-export-unresolvable.js (strict mode) -language/statements/class/class-name-ident-let-escaped.js (default) -language/statements/class/class-name-ident-let.js (default) -language/statements/class/class-name-ident-static-escaped.js (default) -language/statements/class/class-name-ident-static.js (default) -language/statements/class/class-name-ident-yield-escaped.js (default) -language/statements/class/class-name-ident-yield.js (default) -language/statements/class/definition/early-errors-class-method-arguments-in-formal-parameters.js (default) -language/statements/class/definition/early-errors-class-method-duplicate-parameters.js (default) -language/statements/class/definition/early-errors-class-method-eval-in-formal-parameters.js (default) -language/statements/class/definition/methods-gen-yield-as-function-expression-binding-identifier.js (default) -language/statements/class/definition/methods-gen-yield-as-identifier-in-nested-function.js (default) -language/statements/class/method-param-yield.js (default) -language/statements/class/static-method-param-yield.js (default) -language/statements/class/strict-mode/with.js (default) language/statements/class/syntax/early-errors/class-definition-evaluation-block-duplicate-binding.js (default) language/statements/class/syntax/early-errors/class-definition-evaluation-block-duplicate-binding.js (strict mode) language/statements/class/syntax/early-errors/class-definition-evaluation-scriptbody-duplicate-binding.js (default) diff --git a/test/tests-async-iteration.js b/test/tests-async-iteration.js index 9db423f0d..8984fba9f 100644 --- a/test/tests-async-iteration.js +++ b/test/tests-async-iteration.js @@ -1099,7 +1099,7 @@ testFail("class A { async\n* f() {} }", "Unexpected token (2:0)", { ecmaVersion: testFail("class A { *async f() {} }", "Unexpected token (1:17)", { ecmaVersion: 9 }) testFail("class A { *async* f() {} }", "Unexpected token (1:16)", { ecmaVersion: 9 }) testFail("class A { async* f() { () => await a; } }", "Unexpected token (1:35)", { ecmaVersion: 9 }) -testFail("class A { async* f() { () => yield a; } }", "Unexpected token (1:35)", { ecmaVersion: 9 }) +testFail("class A { async* f() { () => yield a; } }", "The keyword 'yield' is reserved (1:29)", { ecmaVersion: 9 }) testFail("f = async function*() { await a; yield b; }", "Unexpected token (1:18)", { ecmaVersion: 8 }) testFail("obj = { async* f() { await a; yield b; } }", "Unexpected token (1:13)", { ecmaVersion: 8 }) diff --git a/test/tests-harmony.js b/test/tests-harmony.js index d5bd2f4bd..52409e87b 100644 --- a/test/tests-harmony.js +++ b/test/tests-harmony.js @@ -13247,10 +13247,12 @@ testFail("(function() { \"use strict\"; f(yield v) })", "The keyword 'yield' is testFail("var obj = { *test** }", "Unexpected token (1:17)", {ecmaVersion: 6}); -testFail("class A extends yield B { }", "Unexpected token (1:22)", {ecmaVersion: 6}); +testFail("class A extends yield B { }", "The keyword 'yield' is reserved (1:16)", {ecmaVersion: 6}); testFail("class default", "Unexpected token (1:6)", {ecmaVersion: 6}); +testFail("class let {}", "The keyword 'let' is reserved (1:6)", {ecmaVersion: 6}) + testFail("`test", "Unterminated template (1:1)", {ecmaVersion: 6}); testFail("switch `test`", "Unexpected token (1:7)", {ecmaVersion: 6});