From 5e60ad66883894657d7c65eef40484fcf49f468b Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Thu, 24 Aug 2017 19:00:52 -0500 Subject: [PATCH 1/2] Fix some cases of invalid labeled declarations --- scripts/test262_whitelist.txt | 38 +----- src/parser/statement.js | 10 ++ .../statements/label-invalid-class/actual.js | 1 + .../label-invalid-class/options.json | 3 + .../statements/label-invalid-const/actual.js | 1 + .../label-invalid-const/options.json | 3 + .../label-invalid-func-async/actual.js | 1 + .../label-invalid-func-async/options.json | 3 + .../label-invalid-func-generator/actual.js | 1 + .../label-invalid-func-generator/options.json | 3 + .../label-invalid-func-strict/actual.js | 1 + .../label-invalid-func-strict/options.json | 3 + .../statements/label-invalid-let/actual.js | 1 + .../statements/label-invalid-let/options.json | 3 + .../label-valid-func-non-strict/actual.js | 1 + .../label-valid-func-non-strict/expected.json | 119 ++++++++++++++++++ .../statements/label-valid-var/actual.js | 1 + .../statements/label-valid-var/expected.json | 117 +++++++++++++++++ 18 files changed, 274 insertions(+), 36 deletions(-) create mode 100644 test/fixtures/es2015/statements/label-invalid-class/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-class/options.json create mode 100644 test/fixtures/es2015/statements/label-invalid-const/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-const/options.json create mode 100644 test/fixtures/es2015/statements/label-invalid-func-async/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-func-async/options.json create mode 100644 test/fixtures/es2015/statements/label-invalid-func-generator/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-func-generator/options.json create mode 100644 test/fixtures/es2015/statements/label-invalid-func-strict/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-func-strict/options.json create mode 100644 test/fixtures/es2015/statements/label-invalid-let/actual.js create mode 100644 test/fixtures/es2015/statements/label-invalid-let/options.json create mode 100644 test/fixtures/es2015/statements/label-valid-func-non-strict/actual.js create mode 100644 test/fixtures/es2015/statements/label-valid-func-non-strict/expected.json create mode 100644 test/fixtures/es2015/statements/label-valid-var/actual.js create mode 100644 test/fixtures/es2015/statements/label-valid-var/expected.json diff --git a/scripts/test262_whitelist.txt b/scripts/test262_whitelist.txt index ef6f801ab9..bb5530d590 100644 --- a/scripts/test262_whitelist.txt +++ b/scripts/test262_whitelist.txt @@ -430,22 +430,16 @@ language/statements/class/syntax/early-errors/class-definition-evaluation-script language/statements/class/syntax/escaped-static.js(default) language/statements/class/syntax/escaped-static.js(strict mode) language/statements/const/redeclaration-error-from-within-strict-mode-function-const.js(default) -language/statements/const/syntax/with-initializer-label-statement.js(default) -language/statements/const/syntax/with-initializer-label-statement.js(strict mode) language/statements/do-while/decl-async-fun.js(default) language/statements/do-while/decl-async-fun.js(strict mode) language/statements/do-while/labelled-fn-stmt.js(default) -language/statements/do-while/labelled-fn-stmt.js(strict mode) language/statements/for/decl-async-fun.js(default) language/statements/for/decl-async-fun.js(strict mode) language/statements/for/head-let-bound-names-in-stmt.js(default) language/statements/for/head-let-bound-names-in-stmt.js(strict mode) language/statements/for/labelled-fn-stmt-expr.js(default) -language/statements/for/labelled-fn-stmt-expr.js(strict mode) language/statements/for/labelled-fn-stmt-let.js(default) -language/statements/for/labelled-fn-stmt-let.js(strict mode) language/statements/for/labelled-fn-stmt-var.js(default) -language/statements/for/labelled-fn-stmt-var.js(strict mode) language/statements/for-in/decl-async-fun.js(default) language/statements/for-in/decl-async-fun.js(strict mode) language/statements/for-in/dstr-array-rest-before-elision.js(default) @@ -461,13 +455,9 @@ language/statements/for-in/head-let-bound-names-dup.js(strict mode) language/statements/for-in/head-let-bound-names-in-stmt.js(default) language/statements/for-in/head-let-bound-names-in-stmt.js(strict mode) language/statements/for-in/labelled-fn-stmt-const.js(default) -language/statements/for-in/labelled-fn-stmt-const.js(strict mode) language/statements/for-in/labelled-fn-stmt-let.js(default) -language/statements/for-in/labelled-fn-stmt-let.js(strict mode) language/statements/for-in/labelled-fn-stmt-lhs.js(default) -language/statements/for-in/labelled-fn-stmt-lhs.js(strict mode) language/statements/for-in/labelled-fn-stmt-var.js(default) -language/statements/for-in/labelled-fn-stmt-var.js(strict mode) language/statements/for-of/decl-async-fun.js(default) language/statements/for-of/decl-async-fun.js(strict mode) language/statements/for-of/dstr-array-rest-before-elision.js(default) @@ -491,13 +481,9 @@ language/statements/for-of/head-let-bound-names-in-stmt.js(strict mode) language/statements/for-of/head-var-no-expr.js(default) language/statements/for-of/head-var-no-expr.js(strict mode) language/statements/for-of/labelled-fn-stmt-const.js(default) -language/statements/for-of/labelled-fn-stmt-const.js(strict mode) language/statements/for-of/labelled-fn-stmt-let.js(default) -language/statements/for-of/labelled-fn-stmt-let.js(strict mode) language/statements/for-of/labelled-fn-stmt-lhs.js(default) -language/statements/for-of/labelled-fn-stmt-lhs.js(strict mode) language/statements/for-of/labelled-fn-stmt-var.js(default) -language/statements/for-of/labelled-fn-stmt-var.js(strict mode) language/statements/function/dflt-params-duplicates.js(default) language/statements/function/param-dflt-yield-strict.js(strict mode) language/statements/generators/dflt-params-duplicates.js(default) @@ -515,32 +501,13 @@ language/statements/if/if-async-fun-no-else.js(strict mode) language/statements/if/if-stmt-else-async-fun.js(default) language/statements/if/if-stmt-else-async-fun.js(strict mode) language/statements/if/labelled-fn-stmt-first.js(default) -language/statements/if/labelled-fn-stmt-first.js(strict mode) language/statements/if/labelled-fn-stmt-lone.js(default) -language/statements/if/labelled-fn-stmt-lone.js(strict mode) language/statements/if/labelled-fn-stmt-second.js(default) -language/statements/if/labelled-fn-stmt-second.js(strict mode) -language/statements/labeled/decl-async-function.js(default) -language/statements/labeled/decl-async-function.js(strict mode) -language/statements/labeled/decl-cls.js(default) -language/statements/labeled/decl-cls.js(strict mode) -language/statements/labeled/decl-const.js(default) -language/statements/labeled/decl-const.js(strict mode) -language/statements/labeled/decl-fun-strict.js(strict mode) -language/statements/labeled/decl-gen.js(default) -language/statements/labeled/decl-gen.js(strict mode) -language/statements/labeled/decl-let.js(default) -language/statements/labeled/decl-let.js(strict mode) -language/statements/labeled/let-array-with-newline.js(default) language/statements/let/redeclaration-error-from-within-strict-mode-function.js(default) language/statements/let/syntax/attempt-to-redeclare-let-binding-with-function-declaration.js(default) language/statements/let/syntax/attempt-to-redeclare-let-binding-with-function-declaration.js(strict mode) language/statements/let/syntax/attempt-to-redeclare-let-binding-with-var.js(default) language/statements/let/syntax/attempt-to-redeclare-let-binding-with-var.js(strict mode) -language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(default) -language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(strict mode) -language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(default) -language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(strict mode) language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-function-declaration.js(default) language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-function-declaration.js(strict mode) language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-class-declaration.js(default) @@ -643,7 +610,6 @@ language/statements/try/early-catch-var.js(strict mode) language/statements/while/decl-async-fun.js(default) language/statements/while/decl-async-fun.js(strict mode) language/statements/while/labelled-fn-stmt.js(default) -language/statements/while/labelled-fn-stmt.js(strict mode) language/statements/with/decl-async-fun.js(default) language/statements/with/labelled-fn-stmt.js(default) language/white-space/mongolian-vowel-separator.js(default) @@ -1012,8 +978,6 @@ language/statements/if/if-async-gen-no-else.js(default) language/statements/if/if-async-gen-no-else.js(strict mode) language/statements/if/if-stmt-else-async-gen.js(default) language/statements/if/if-stmt-else-async-gen.js(strict mode) -language/statements/labeled/decl-async-generator.js(default) -language/statements/labeled/decl-async-generator.js(strict mode) language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-generator-declaration.js(default) language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-generator-declaration.js(strict mode) language/statements/switch/syntax/redeclaration/async-generator-declaration-attempt-to-redeclare-with-async-function-declaration.js(default) @@ -1532,3 +1496,5 @@ language/statements/try/optional-catch-binding-throws.js(default) language/statements/try/optional-catch-binding-throws.js(strict mode) language/statements/try/optional-catch-binding.js(default) language/statements/try/optional-catch-binding.js(strict mode) + +language/statements/labeled/let-identifier-with-newline.js(default) \ No newline at end of file diff --git a/src/parser/statement.js b/src/parser/statement.js index 8478373c47..43cc1a00fe 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -576,6 +576,16 @@ export default class StatementParser extends ExpressionParser { statementStart: this.state.start, }); node.body = this.parseStatement(true); + + if ( + node.body.type == "ClassDeclaration" || + (node.body.type == "VariableDeclaration" && node.body.kind !== "var") || + (node.body.type == "FunctionDeclaration" && + (this.state.strict || node.body.generator || node.body.async)) + ) { + this.raise(node.body.start, "Invalid labeled declaration"); + } + this.state.labels.pop(); node.label = expr; return this.finishNode(node, "LabeledStatement"); diff --git a/test/fixtures/es2015/statements/label-invalid-class/actual.js b/test/fixtures/es2015/statements/label-invalid-class/actual.js new file mode 100644 index 0000000000..5b418f08e1 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-class/actual.js @@ -0,0 +1 @@ +foo: class X {} diff --git a/test/fixtures/es2015/statements/label-invalid-class/options.json b/test/fixtures/es2015/statements/label-invalid-class/options.json new file mode 100644 index 0000000000..b283ca722e --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-class/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:5)" +} diff --git a/test/fixtures/es2015/statements/label-invalid-const/actual.js b/test/fixtures/es2015/statements/label-invalid-const/actual.js new file mode 100644 index 0000000000..4e959fc106 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-const/actual.js @@ -0,0 +1 @@ +foo: const bar = null; diff --git a/test/fixtures/es2015/statements/label-invalid-const/options.json b/test/fixtures/es2015/statements/label-invalid-const/options.json new file mode 100644 index 0000000000..b283ca722e --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-const/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:5)" +} diff --git a/test/fixtures/es2015/statements/label-invalid-func-async/actual.js b/test/fixtures/es2015/statements/label-invalid-func-async/actual.js new file mode 100644 index 0000000000..d01c6194d0 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-async/actual.js @@ -0,0 +1 @@ +foo: async function bar() {} diff --git a/test/fixtures/es2015/statements/label-invalid-func-async/options.json b/test/fixtures/es2015/statements/label-invalid-func-async/options.json new file mode 100644 index 0000000000..b283ca722e --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-async/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:5)" +} diff --git a/test/fixtures/es2015/statements/label-invalid-func-generator/actual.js b/test/fixtures/es2015/statements/label-invalid-func-generator/actual.js new file mode 100644 index 0000000000..b6cb40a659 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-generator/actual.js @@ -0,0 +1 @@ +foo: function* bar() {} diff --git a/test/fixtures/es2015/statements/label-invalid-func-generator/options.json b/test/fixtures/es2015/statements/label-invalid-func-generator/options.json new file mode 100644 index 0000000000..b283ca722e --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-generator/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:5)" +} diff --git a/test/fixtures/es2015/statements/label-invalid-func-strict/actual.js b/test/fixtures/es2015/statements/label-invalid-func-strict/actual.js new file mode 100644 index 0000000000..3502c5033d --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-strict/actual.js @@ -0,0 +1 @@ +function foo() {"use strict"; bar: function baz() {}} diff --git a/test/fixtures/es2015/statements/label-invalid-func-strict/options.json b/test/fixtures/es2015/statements/label-invalid-func-strict/options.json new file mode 100644 index 0000000000..e54e8652f3 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-func-strict/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:35)" +} diff --git a/test/fixtures/es2015/statements/label-invalid-let/actual.js b/test/fixtures/es2015/statements/label-invalid-let/actual.js new file mode 100644 index 0000000000..7bfccd3ce7 --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-let/actual.js @@ -0,0 +1 @@ +foo: let bar; diff --git a/test/fixtures/es2015/statements/label-invalid-let/options.json b/test/fixtures/es2015/statements/label-invalid-let/options.json new file mode 100644 index 0000000000..b283ca722e --- /dev/null +++ b/test/fixtures/es2015/statements/label-invalid-let/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Invalid labeled declaration (1:5)" +} diff --git a/test/fixtures/es2015/statements/label-valid-func-non-strict/actual.js b/test/fixtures/es2015/statements/label-valid-func-non-strict/actual.js new file mode 100644 index 0000000000..73d27da12f --- /dev/null +++ b/test/fixtures/es2015/statements/label-valid-func-non-strict/actual.js @@ -0,0 +1 @@ +foo: function bar() {} diff --git a/test/fixtures/es2015/statements/label-valid-func-non-strict/expected.json b/test/fixtures/es2015/statements/label-valid-func-non-strict/expected.json new file mode 100644 index 0000000000..127eac7560 --- /dev/null +++ b/test/fixtures/es2015/statements/label-valid-func-non-strict/expected.json @@ -0,0 +1,119 @@ +{ + "type": "File", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "sourceType": "script", + "body": [ + { + "type": "LabeledStatement", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "body": { + "type": "FunctionDeclaration", + "start": 5, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "id": { + "type": "Identifier", + "start": 14, + "end": 17, + "loc": { + "start": { + "line": 1, + "column": 14 + }, + "end": { + "line": 1, + "column": 17 + }, + "identifierName": "bar" + }, + "name": "bar" + }, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 20, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 20 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "body": [], + "directives": [] + } + }, + "label": { + "type": "Identifier", + "start": 0, + "end": 3, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 3 + }, + "identifierName": "foo" + }, + "name": "foo" + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/es2015/statements/label-valid-var/actual.js b/test/fixtures/es2015/statements/label-valid-var/actual.js new file mode 100644 index 0000000000..9e4fff5851 --- /dev/null +++ b/test/fixtures/es2015/statements/label-valid-var/actual.js @@ -0,0 +1 @@ +foo: var bar; diff --git a/test/fixtures/es2015/statements/label-valid-var/expected.json b/test/fixtures/es2015/statements/label-valid-var/expected.json new file mode 100644 index 0000000000..692620cccf --- /dev/null +++ b/test/fixtures/es2015/statements/label-valid-var/expected.json @@ -0,0 +1,117 @@ +{ + "type": "File", + "start": 0, + "end": 13, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 13 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 13, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 13 + } + }, + "sourceType": "script", + "body": [ + { + "type": "LabeledStatement", + "start": 0, + "end": 13, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 13 + } + }, + "body": { + "type": "VariableDeclaration", + "start": 5, + "end": 13, + "loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 13 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 9, + "end": 12, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 12 + } + }, + "id": { + "type": "Identifier", + "start": 9, + "end": 12, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 12 + }, + "identifierName": "bar" + }, + "name": "bar" + }, + "init": null + } + ], + "kind": "var" + }, + "label": { + "type": "Identifier", + "start": 0, + "end": 3, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 3 + }, + "identifierName": "foo" + }, + "name": "foo" + } + } + ], + "directives": [] + } +} \ No newline at end of file From 2bc124bf49a5aec5d1a9d250439e50b506c1088d Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Thu, 24 Aug 2017 19:27:09 -0500 Subject: [PATCH 2/2] Fix some cases of keywords with escape sequences --- scripts/test262_whitelist.txt | 182 +----------------- src/tokenizer/index.js | 8 +- .../invalid-escape-seq-const/actual.js | 1 + .../invalid-escape-seq-const/options.json | 3 + .../invalid-escape-seq-export/actual.js | 1 + .../invalid-escape-seq-export/options.json | 3 + .../invalid-escape-seq-if/actual.js | 1 + .../invalid-escape-seq-if/options.json | 3 + .../invalid-escape-seq-import/actual.js | 1 + .../invalid-escape-seq-import/options.json | 3 + .../invalid-escape-seq-null/actual.js | 1 + .../invalid-escape-seq-null/options.json | 3 + .../invalid-escape-seq-true/actual.js | 1 + .../invalid-escape-seq-true/options.json | 3 + .../new-target-invalid-escaped-new/actual.js | 1 + .../options.json | 3 + 16 files changed, 38 insertions(+), 180 deletions(-) create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-const/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-const/options.json create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-export/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-export/options.json create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-if/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-if/options.json create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-import/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-import/options.json create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-null/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-null/options.json create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-true/actual.js create mode 100644 test/fixtures/es2015/identifiers/invalid-escape-seq-true/options.json create mode 100644 test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/actual.js create mode 100644 test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/options.json diff --git a/scripts/test262_whitelist.txt b/scripts/test262_whitelist.txt index bb5530d590..6b6afda233 100644 --- a/scripts/test262_whitelist.txt +++ b/scripts/test262_whitelist.txt @@ -134,17 +134,9 @@ language/expressions/async-function/nameless-dflt-params-duplicates.js(default) language/expressions/function/dflt-params-duplicates.js(default) language/expressions/function/param-dflt-yield-strict.js(strict mode) language/expressions/generators/dflt-params-duplicates.js(default) -language/expressions/generators/named-yield-as-binding-identifier-escaped.js(default) -language/expressions/generators/named-yield-as-identifier-reference-escaped.js(default) -language/expressions/generators/named-yield-as-label-identifier-escaped.js(default) language/expressions/generators/param-dflt-yield.js(default) -language/expressions/generators/yield-as-binding-identifier-escaped.js(default) language/expressions/generators/yield-as-generator-expression-binding-identifier.js(default) -language/expressions/generators/yield-as-identifier-reference-escaped.js(default) -language/expressions/generators/yield-as-label-identifier-escaped.js(default) language/expressions/generators/yield-as-parameter.js(default) -language/expressions/new.target/escaped-new.js(default) -language/expressions/new.target/escaped-new.js(strict mode) language/expressions/new.target/escaped-target.js(default) language/expressions/new.target/escaped-target.js(strict mode) language/expressions/object/method-definition/async-meth-escaped-async.js(default) @@ -161,9 +153,6 @@ language/expressions/object/method-definition/escaped-get.js(strict mode) language/expressions/object/method-definition/escaped-set.js(default) language/expressions/object/method-definition/escaped-set.js(strict mode) language/expressions/object/method-definition/gen-meth-dflt-params-duplicates.js(default) -language/expressions/object/method-definition/gen-yield-as-binding-identifier-escaped.js(default) -language/expressions/object/method-definition/gen-yield-as-identifier-reference-escaped.js(default) -language/expressions/object/method-definition/gen-yield-as-label-identifier-escaped.js(default) language/expressions/object/method-definition/generator-param-id-yield.js(default) language/expressions/object/method-definition/generator-param-init-yield.js(default) language/expressions/object/method-definition/generator-param-redecl-const.js(default) @@ -182,146 +171,6 @@ language/expressions/yield/star-in-iteration-stmt.js(default) language/expressions/yield/star-in-iteration-stmt.js(strict mode) language/global-code/new.target-arrow.js(default) language/global-code/new.target-arrow.js(strict mode) -language/identifiers/val-break-via-escape-hex.js(default) -language/identifiers/val-break-via-escape-hex.js(strict mode) -language/identifiers/val-break-via-escape-hex4.js(default) -language/identifiers/val-break-via-escape-hex4.js(strict mode) -language/identifiers/val-case-via-escape-hex.js(default) -language/identifiers/val-case-via-escape-hex.js(strict mode) -language/identifiers/val-case-via-escape-hex4.js(default) -language/identifiers/val-case-via-escape-hex4.js(strict mode) -language/identifiers/val-catch-via-escape-hex.js(default) -language/identifiers/val-catch-via-escape-hex.js(strict mode) -language/identifiers/val-catch-via-escape-hex4.js(default) -language/identifiers/val-catch-via-escape-hex4.js(strict mode) -language/identifiers/val-class-via-escape-hex.js(default) -language/identifiers/val-class-via-escape-hex.js(strict mode) -language/identifiers/val-class-via-escape-hex4.js(default) -language/identifiers/val-class-via-escape-hex4.js(strict mode) -language/identifiers/val-const-via-escape-hex.js(default) -language/identifiers/val-const-via-escape-hex.js(strict mode) -language/identifiers/val-const-via-escape-hex4.js(default) -language/identifiers/val-const-via-escape-hex4.js(strict mode) -language/identifiers/val-continue-via-escape-hex.js(default) -language/identifiers/val-continue-via-escape-hex.js(strict mode) -language/identifiers/val-continue-via-escape-hex4.js(default) -language/identifiers/val-continue-via-escape-hex4.js(strict mode) -language/identifiers/val-debugger-via-escape-hex.js(default) -language/identifiers/val-debugger-via-escape-hex.js(strict mode) -language/identifiers/val-debugger-via-escape-hex4.js(default) -language/identifiers/val-debugger-via-escape-hex4.js(strict mode) -language/identifiers/val-default-via-escape-hex.js(default) -language/identifiers/val-default-via-escape-hex.js(strict mode) -language/identifiers/val-default-via-escape-hex4.js(default) -language/identifiers/val-default-via-escape-hex4.js(strict mode) -language/identifiers/val-delete-via-escape-hex.js(default) -language/identifiers/val-delete-via-escape-hex.js(strict mode) -language/identifiers/val-delete-via-escape-hex4.js(default) -language/identifiers/val-delete-via-escape-hex4.js(strict mode) -language/identifiers/val-do-via-escape-hex.js(default) -language/identifiers/val-do-via-escape-hex.js(strict mode) -language/identifiers/val-do-via-escape-hex4.js(default) -language/identifiers/val-do-via-escape-hex4.js(strict mode) -language/identifiers/val-else-via-escape-hex.js(default) -language/identifiers/val-else-via-escape-hex.js(strict mode) -language/identifiers/val-else-via-escape-hex4.js(default) -language/identifiers/val-else-via-escape-hex4.js(strict mode) -language/identifiers/val-export-via-escape-hex.js(default) -language/identifiers/val-export-via-escape-hex.js(strict mode) -language/identifiers/val-export-via-escape-hex4.js(default) -language/identifiers/val-export-via-escape-hex4.js(strict mode) -language/identifiers/val-extends-via-escape-hex.js(default) -language/identifiers/val-extends-via-escape-hex.js(strict mode) -language/identifiers/val-extends-via-escape-hex4.js(default) -language/identifiers/val-extends-via-escape-hex4.js(strict mode) -language/identifiers/val-false-via-escape-hex.js(default) -language/identifiers/val-false-via-escape-hex.js(strict mode) -language/identifiers/val-false-via-escape-hex4.js(default) -language/identifiers/val-false-via-escape-hex4.js(strict mode) -language/identifiers/val-finally-via-escape-hex.js(default) -language/identifiers/val-finally-via-escape-hex.js(strict mode) -language/identifiers/val-finally-via-escape-hex4.js(default) -language/identifiers/val-finally-via-escape-hex4.js(strict mode) -language/identifiers/val-for-via-escape-hex.js(default) -language/identifiers/val-for-via-escape-hex.js(strict mode) -language/identifiers/val-for-via-escape-hex4.js(default) -language/identifiers/val-for-via-escape-hex4.js(strict mode) -language/identifiers/val-function-via-escape-hex.js(default) -language/identifiers/val-function-via-escape-hex.js(strict mode) -language/identifiers/val-function-via-escape-hex4.js(default) -language/identifiers/val-function-via-escape-hex4.js(strict mode) -language/identifiers/val-if-via-escape-hex.js(default) -language/identifiers/val-if-via-escape-hex.js(strict mode) -language/identifiers/val-if-via-escape-hex4.js(default) -language/identifiers/val-if-via-escape-hex4.js(strict mode) -language/identifiers/val-import-via-escape-hex.js(default) -language/identifiers/val-import-via-escape-hex.js(strict mode) -language/identifiers/val-import-via-escape-hex4.js(default) -language/identifiers/val-import-via-escape-hex4.js(strict mode) -language/identifiers/val-in-via-escape-hex.js(default) -language/identifiers/val-in-via-escape-hex.js(strict mode) -language/identifiers/val-in-via-escape-hex4.js(default) -language/identifiers/val-in-via-escape-hex4.js(strict mode) -language/identifiers/val-instanceof-via-escape-hex.js(default) -language/identifiers/val-instanceof-via-escape-hex.js(strict mode) -language/identifiers/val-instanceof-via-escape-hex4.js(default) -language/identifiers/val-instanceof-via-escape-hex4.js(strict mode) -language/identifiers/val-new-via-escape-hex.js(default) -language/identifiers/val-new-via-escape-hex.js(strict mode) -language/identifiers/val-new-via-escape-hex4.js(default) -language/identifiers/val-new-via-escape-hex4.js(strict mode) -language/identifiers/val-null-via-escape-hex.js(default) -language/identifiers/val-null-via-escape-hex.js(strict mode) -language/identifiers/val-null-via-escape-hex4.js(default) -language/identifiers/val-null-via-escape-hex4.js(strict mode) -language/identifiers/val-return-via-escape-hex.js(default) -language/identifiers/val-return-via-escape-hex.js(strict mode) -language/identifiers/val-return-via-escape-hex4.js(default) -language/identifiers/val-return-via-escape-hex4.js(strict mode) -language/identifiers/val-super-via-escape-hex.js(default) -language/identifiers/val-super-via-escape-hex.js(strict mode) -language/identifiers/val-super-via-escape-hex4.js(default) -language/identifiers/val-super-via-escape-hex4.js(strict mode) -language/identifiers/val-switch-via-escape-hex.js(default) -language/identifiers/val-switch-via-escape-hex.js(strict mode) -language/identifiers/val-switch-via-escape-hex4.js(default) -language/identifiers/val-switch-via-escape-hex4.js(strict mode) -language/identifiers/val-this-via-escape-hex.js(default) -language/identifiers/val-this-via-escape-hex.js(strict mode) -language/identifiers/val-this-via-escape-hex4.js(default) -language/identifiers/val-this-via-escape-hex4.js(strict mode) -language/identifiers/val-throw-via-escape-hex.js(default) -language/identifiers/val-throw-via-escape-hex.js(strict mode) -language/identifiers/val-throw-via-escape-hex4.js(default) -language/identifiers/val-throw-via-escape-hex4.js(strict mode) -language/identifiers/val-true-via-escape-hex.js(default) -language/identifiers/val-true-via-escape-hex.js(strict mode) -language/identifiers/val-true-via-escape-hex4.js(default) -language/identifiers/val-true-via-escape-hex4.js(strict mode) -language/identifiers/val-try-via-escape-hex.js(default) -language/identifiers/val-try-via-escape-hex.js(strict mode) -language/identifiers/val-try-via-escape-hex4.js(default) -language/identifiers/val-try-via-escape-hex4.js(strict mode) -language/identifiers/val-typeof-via-escape-hex.js(default) -language/identifiers/val-typeof-via-escape-hex.js(strict mode) -language/identifiers/val-typeof-via-escape-hex4.js(default) -language/identifiers/val-typeof-via-escape-hex4.js(strict mode) -language/identifiers/val-var-via-escape-hex.js(default) -language/identifiers/val-var-via-escape-hex.js(strict mode) -language/identifiers/val-var-via-escape-hex4.js(default) -language/identifiers/val-var-via-escape-hex4.js(strict mode) -language/identifiers/val-void-via-escape-hex.js(default) -language/identifiers/val-void-via-escape-hex.js(strict mode) -language/identifiers/val-void-via-escape-hex4.js(default) -language/identifiers/val-void-via-escape-hex4.js(strict mode) -language/identifiers/val-while-via-escape-hex.js(default) -language/identifiers/val-while-via-escape-hex.js(strict mode) -language/identifiers/val-while-via-escape-hex4.js(default) -language/identifiers/val-while-via-escape-hex4.js(strict mode) -language/identifiers/val-with-via-escape-hex.js(default) -language/identifiers/val-with-via-escape-hex.js(strict mode) -language/identifiers/val-with-via-escape-hex4.js(default) -language/identifiers/val-with-via-escape-hex4.js(strict mode) language/import/dup-bound-names.js(default) language/import/dup-bound-names.js(strict mode) language/import/escaped-as-import-specifier.js(default) @@ -391,18 +240,6 @@ language/module-code/parse-err-hoist-lex-fun.js(default) language/module-code/parse-err-hoist-lex-fun.js(strict mode) language/module-code/parse-err-hoist-lex-gen.js(default) language/module-code/parse-err-hoist-lex-gen.js(strict mode) -language/reserved-words/ident-reference-false-escaped.js(default) -language/reserved-words/ident-reference-false-escaped.js(strict mode) -language/reserved-words/ident-reference-null-escaped.js(default) -language/reserved-words/ident-reference-null-escaped.js(strict mode) -language/reserved-words/ident-reference-true-escaped.js(default) -language/reserved-words/ident-reference-true-escaped.js(strict mode) -language/reserved-words/label-ident-false-escaped.js(default) -language/reserved-words/label-ident-false-escaped.js(strict mode) -language/reserved-words/label-ident-null-escaped.js(default) -language/reserved-words/label-ident-null-escaped.js(strict mode) -language/reserved-words/label-ident-true-escaped.js(default) -language/reserved-words/label-ident-true-escaped.js(strict mode) language/statements/async-function/dflt-params-duplicates.js(default) language/statements/async-function/early-errors-declaration-await-in-formals-default.js(default) language/statements/async-function/early-errors-declaration-await-in-formals-default.js(strict mode) @@ -488,9 +325,6 @@ language/statements/function/dflt-params-duplicates.js(default) language/statements/function/param-dflt-yield-strict.js(strict mode) language/statements/generators/dflt-params-duplicates.js(default) language/statements/generators/param-dflt-yield.js(default) -language/statements/generators/yield-as-binding-identifier-escaped.js(default) -language/statements/generators/yield-as-identifier-reference-escaped.js(default) -language/statements/generators/yield-as-label-identifier-escaped.js(default) language/statements/generators/yield-as-parameter.js(default) language/statements/if/if-async-fun-else-async-fun.js(default) language/statements/if/if-async-fun-else-async-fun.js(strict mode) @@ -935,25 +769,13 @@ language/expressions/async-generator/early-errors-expression-yield-as-function-b language/expressions/async-generator/escaped-async.js(default) language/expressions/async-generator/escaped-async.js(strict mode) language/expressions/async-generator/named-dflt-params-duplicates.js(default) -language/expressions/async-generator/named-yield-as-binding-identifier-escaped.js(default) -language/expressions/async-generator/named-yield-as-identifier-reference-escaped.js(default) -language/expressions/async-generator/named-yield-as-label-identifier-escaped.js(default) -language/expressions/async-generator/yield-as-binding-identifier-escaped.js(default) -language/expressions/async-generator/yield-as-identifier-reference-escaped.js(default) -language/expressions/async-generator/yield-as-label-identifier-escaped.js(default) language/expressions/object/method-definition/async-gen-meth-dflt-params-duplicates.js(default) language/expressions/object/method-definition/async-gen-meth-escaped-async.js(default) language/expressions/object/method-definition/async-gen-meth-escaped-async.js(strict mode) -language/expressions/object/method-definition/async-gen-yield-as-binding-identifier-escaped.js(default) -language/expressions/object/method-definition/async-gen-yield-as-identifier-reference-escaped.js(default) -language/expressions/object/method-definition/async-gen-yield-as-label-identifier-escaped.js(default) language/expressions/object/method-definition/async-meth-dflt-params-duplicates.js(default) language/statements/async-generator/dflt-params-duplicates.js(default) language/statements/async-generator/escaped-async.js(default) language/statements/async-generator/escaped-async.js(strict mode) -language/statements/async-generator/yield-as-binding-identifier-escaped.js(default) -language/statements/async-generator/yield-as-identifier-reference-escaped.js(default) -language/statements/async-generator/yield-as-label-identifier-escaped.js(default) language/statements/class/async-gen-meth-escaped-async.js(default) language/statements/class/async-gen-meth-escaped-async.js(strict mode) language/statements/do-while/decl-async-gen.js(default) @@ -1497,4 +1319,6 @@ language/statements/try/optional-catch-binding-throws.js(strict mode) language/statements/try/optional-catch-binding.js(default) language/statements/try/optional-catch-binding.js(strict mode) -language/statements/labeled/let-identifier-with-newline.js(default) \ No newline at end of file +language/statements/labeled/let-identifier-with-newline.js(default) +language/statements/labeled/value-yield-non-strict-escaped.js(default) +language/statements/let/syntax/escaped-let.js(default) \ No newline at end of file diff --git a/src/tokenizer/index.js b/src/tokenizer/index.js index 760ccf5ee8..cb3fd8b57d 100644 --- a/src/tokenizer/index.js +++ b/src/tokenizer/index.js @@ -1105,9 +1105,15 @@ export default class Tokenizer extends LocationParser { readWord(): void { const word = this.readWord1(); let type = tt.name; - if (!this.state.containsEsc && this.isKeyword(word)) { + + if (this.isKeyword(word)) { + if (this.state.containsEsc) { + this.raise(this.state.pos, `Escape sequence in keyword ${word}`); + } + type = keywordTypes[word]; } + return this.finishToken(type, word); } diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-const/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-const/actual.js new file mode 100644 index 0000000000..7db67c0d2d --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-const/actual.js @@ -0,0 +1 @@ +var co\u{6e}st = 123; diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-const/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-const/options.json new file mode 100644 index 0000000000..d6c0b22e30 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-const/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword const (1:14)" +} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-export/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-export/actual.js new file mode 100644 index 0000000000..2c49151ea9 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-export/actual.js @@ -0,0 +1 @@ +var expor\u{74} = 123; diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-export/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-export/options.json new file mode 100644 index 0000000000..80870219d5 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-export/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword export (1:15)" +} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-if/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-if/actual.js new file mode 100644 index 0000000000..4e66a381c2 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-if/actual.js @@ -0,0 +1 @@ +\u0069\u{66} (true) {} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-if/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-if/options.json new file mode 100644 index 0000000000..52faf91d36 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-if/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword if (1:12)" +} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-import/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-import/actual.js new file mode 100644 index 0000000000..f23c79e20f --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-import/actual.js @@ -0,0 +1 @@ +var \u{69}\u{6d}\u{70}\u{6f}\u{72}\u{74} = 123; diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-import/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-import/options.json new file mode 100644 index 0000000000..45763ffa38 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-import/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword import (1:40)" +} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-null/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-null/actual.js new file mode 100644 index 0000000000..a2fdf9fb41 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-null/actual.js @@ -0,0 +1 @@ +nul\u{6c} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-null/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-null/options.json new file mode 100644 index 0000000000..34db9f6413 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-null/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword null (1:9)" +} diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-true/actual.js b/test/fixtures/es2015/identifiers/invalid-escape-seq-true/actual.js new file mode 100644 index 0000000000..ae848b68f2 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-true/actual.js @@ -0,0 +1 @@ +\u0074rue diff --git a/test/fixtures/es2015/identifiers/invalid-escape-seq-true/options.json b/test/fixtures/es2015/identifiers/invalid-escape-seq-true/options.json new file mode 100644 index 0000000000..c1c2620da0 --- /dev/null +++ b/test/fixtures/es2015/identifiers/invalid-escape-seq-true/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword true (1:9)" +} diff --git a/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/actual.js b/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/actual.js new file mode 100644 index 0000000000..54934a3f36 --- /dev/null +++ b/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/actual.js @@ -0,0 +1 @@ +function f() { n\u0065w.target; } diff --git a/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/options.json b/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/options.json new file mode 100644 index 0000000000..112b0adc3e --- /dev/null +++ b/test/fixtures/es2015/meta-properties/new-target-invalid-escaped-new/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Escape sequence in keyword new (1:23)" +}