Skip to content

Commit

Permalink
Class declarations are always in strict mode including its identifier
Browse files Browse the repository at this point in the history
  • Loading branch information
danez authored and marijnh committed Jan 22, 2019
1 parent 654ae4d commit 604c05b
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 24 deletions.
6 changes: 6 additions & 0 deletions acorn/src/statement.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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")
}

Expand Down
22 changes: 0 additions & 22 deletions bin/test262.whitelist
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion test/tests-async-iteration.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 })
Expand Down
4 changes: 3 additions & 1 deletion test/tests-harmony.js
Original file line number Diff line number Diff line change
Expand Up @@ -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});
Expand Down

0 comments on commit 604c05b

Please sign in to comment.