From f339d2d034aadb01f4f0ccca74e0e99fed1f79b9 Mon Sep 17 00:00:00 2001 From: Ivan Medina Date: Mon, 23 Sep 2019 15:47:18 -0500 Subject: [PATCH] [parser] Disallow numeric separator in unicode scape sequences (#10468) * [parser] Disallow numeric separator in unicode scape sequences (#10460) * raise error only when numeric separator plugin is set * Adds argument for checking numeric separator * Fix condition for readability * Add test for hex escape sequence and rephrase error message * Remove exposure for allowNumSeparator in readHexChar method --- packages/babel-parser/src/tokenizer/index.js | 15 +++++++++++++-- .../numeric-separator/invalid-hex/input.js | 1 + .../numeric-separator/invalid-hex/options.json | 1 + .../numeric-separator/invalid-unicode-2/input.js | 1 + .../invalid-unicode-2/options.json | 1 + .../numeric-separator/invalid-unicode/input.js | 1 + .../invalid-unicode/options.json | 1 + scripts/tests/test262/test262_whitelist.txt | 8 -------- 8 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/options.json diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index c8773f9bbe2a..46d156efe7c8 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -880,7 +880,11 @@ export default class Tokenizer extends LocationParser { // were read, the integer value otherwise. When `len` is given, this // will return `null` unless the integer has exactly `len` digits. - readInt(radix: number, len?: number): number | null { + readInt( + radix: number, + len?: number, + allowNumSeparator: boolean = true, + ): number | null { const start = this.state.pos; const forbiddenSiblings = radix === 16 @@ -917,6 +921,13 @@ export default class Tokenizer extends LocationParser { this.raise(this.state.pos, "Invalid or unexpected token"); } + if (!allowNumSeparator) { + this.raise( + this.state.pos, + "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences", + ); + } + // Ignore this _ character ++this.state.pos; continue; @@ -1252,7 +1263,7 @@ export default class Tokenizer extends LocationParser { readHexChar(len: number, throwOnInvalid: boolean): number | null { const codePos = this.state.pos; - const n = this.readInt(16, len); + const n = this.readInt(16, len, false); if (n === null) { if (throwOnInvalid) { this.raise(codePos, "Bad character escape sequence"); diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/input.js b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/input.js new file mode 100644 index 000000000000..4027187fe79d --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/input.js @@ -0,0 +1 @@ +"\x1_0"; diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/options.json new file mode 100644 index 000000000000..fd0b1c7f0a7d --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-hex/options.json @@ -0,0 +1 @@ +{ "throws": "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences (1:4)" } diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/input.js b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/input.js new file mode 100644 index 000000000000..7d45889c6dec --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/input.js @@ -0,0 +1 @@ +"\u12_34" diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/options.json new file mode 100644 index 000000000000..ca0ceaeaaea6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode-2/options.json @@ -0,0 +1 @@ +{ "throws": "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences (1:5)" } diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/input.js b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/input.js new file mode 100644 index 000000000000..e670fc0c3264 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/input.js @@ -0,0 +1 @@ +"\u{1F_639}" diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/options.json new file mode 100644 index 000000000000..e42d95d86acf --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-unicode/options.json @@ -0,0 +1 @@ +{ "throws": "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences (1:6)" } diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 851b2ddb9f5e..32c8348cb5af 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -104,10 +104,6 @@ language/expressions/object/method-definition/private-name-early-error-gen-insid language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(strict mode) language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(default) language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode) -language/expressions/template-literal/unicode-escape-nls-err.js(default) -language/expressions/template-literal/unicode-escape-nls-err.js(strict mode) -language/identifiers/unicode-escape-nls-err.js(default) -language/identifiers/unicode-escape-nls-err.js(strict mode) language/literals/bigint/non-octal-like-invalid-0008n.js(default) language/literals/bigint/non-octal-like-invalid-012348n.js(default) language/literals/bigint/non-octal-like-invalid-08n.js(default) @@ -128,10 +124,6 @@ language/literals/numeric/numeric-separators/numeric-separator-literal-nonoctal- language/literals/numeric/numeric-separators/numeric-separator-literal-nonoctal-0_8-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-nonoctal-0_9-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-nzd-nsl-dds-leading-zero-err.js(default) -language/literals/string/unicode-escape-nls-err-double.js(default) -language/literals/string/unicode-escape-nls-err-double.js(strict mode) -language/literals/string/unicode-escape-nls-err-single.js(default) -language/literals/string/unicode-escape-nls-err-single.js(strict mode) language/module-code/privatename-not-valid-earlyerr-module-1.js(default) language/module-code/privatename-not-valid-earlyerr-module-1.js(strict mode) language/module-code/privatename-not-valid-earlyerr-module-2.js(default)