From 69d00dc5b035eede17d24cc7211166e3d5bc600c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Rodr=C3=ADguez?= <13141462+gonzarodriguezt@users.noreply.github.com> Date: Mon, 23 Sep 2019 17:07:52 -0400 Subject: [PATCH] [parser] Invalid NonOctal Decimal (#10467) * Add test * Add nonOctalDecimal verification * Update regex and code style * Refactor non octal detection * Add numeric separator test * Disallow numeric separators in non octals * Update whitelist * Better test naming * Disallow numeric separators in non oct for all numbers * Specific error above the general error * Add test for invalid leading zero in num separator * Add start position to error --- packages/babel-parser/src/tokenizer/index.js | 22 +++++++++++++++++-- .../invalid-non-octal-decimal-int/input.js | 1 + .../options.json | 1 + .../invalid-leading-zero/input.js | 1 + .../invalid-leading-zero/options.json | 1 + .../invalid-non-octal-decimal-int/input.js | 1 + .../options.json | 1 + .../numeric-separator/options.json | 2 +- scripts/tests/test262/test262_whitelist.txt | 14 ------------ 9 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/options.json diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 46d156efe7c8..6d2c046457aa 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -993,6 +993,7 @@ export default class Tokenizer extends LocationParser { const start = this.state.pos; let isFloat = false; let isBigInt = false; + let isNonOctalDecimalInt = false; if (!startsWithDot && this.readInt(10) === null) { this.raise(start, "Invalid number"); @@ -1009,6 +1010,7 @@ export default class Tokenizer extends LocationParser { } if (/[89]/.test(this.input.slice(start, this.state.pos))) { octal = false; + isNonOctalDecimalInt = true; } } @@ -1033,10 +1035,26 @@ export default class Tokenizer extends LocationParser { next = this.input.charCodeAt(this.state.pos); } + // disallow numeric separators in non octal decimals + if (this.hasPlugin("numericSeparator") && isNonOctalDecimalInt) { + const underscorePos = this.input + .slice(start, this.state.pos) + .indexOf("_"); + if (underscorePos > 0) { + this.raise( + underscorePos + start, + "Numeric separator can not be used after leading 0", + ); + } + } + if (this.hasPlugin("bigInt")) { if (next === charCodes.lowercaseN) { - // disallow floats and legacy octal syntax, new style octal ("0o") is handled in this.readRadixNumber - if (isFloat || octal) this.raise(start, "Invalid BigIntLiteral"); + // disallow floats, legacy octal syntax and non octal decimals + // new style octal ("0o") is handled in this.readRadixNumber + if (isFloat || octal || isNonOctalDecimalInt) { + this.raise(start, "Invalid BigIntLiteral"); + } ++this.state.pos; isBigInt = true; } diff --git a/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/input.js b/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/input.js new file mode 100644 index 000000000000..488077f06c3f --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/input.js @@ -0,0 +1 @@ +089n \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/options.json b/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/options.json new file mode 100644 index 000000000000..a1fd77a3341e --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/bigint/invalid-non-octal-decimal-int/options.json @@ -0,0 +1 @@ +{ "throws": "Invalid BigIntLiteral (1:0)" } diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/input.js b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/input.js new file mode 100644 index 000000000000..cf0bdcda2ea0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/input.js @@ -0,0 +1 @@ +0_8 \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/options.json new file mode 100644 index 000000000000..57c99a94dbd6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-leading-zero/options.json @@ -0,0 +1 @@ +{ "throws": "Numeric separator can not be used after leading 0 (1:1)" } diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/input.js b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/input.js new file mode 100644 index 000000000000..50e4a5af8a70 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/input.js @@ -0,0 +1 @@ +08_0n \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/options.json new file mode 100644 index 000000000000..5a4fb4525d02 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/invalid-non-octal-decimal-int/options.json @@ -0,0 +1 @@ +{ "throws": "Numeric separator can not be used after leading 0 (1:2)" } diff --git a/packages/babel-parser/test/fixtures/experimental/numeric-separator/options.json b/packages/babel-parser/test/fixtures/experimental/numeric-separator/options.json index 7832463eea97..d6659f4863e6 100644 --- a/packages/babel-parser/test/fixtures/experimental/numeric-separator/options.json +++ b/packages/babel-parser/test/fixtures/experimental/numeric-separator/options.json @@ -1,3 +1,3 @@ { - "plugins": ["numericSeparator"] + "plugins": ["bigInt", "numericSeparator"] } diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 32c8348cb5af..3eb50c7c2d4e 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -104,26 +104,12 @@ 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/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) -language/literals/bigint/non-octal-like-invalid-09n.js(default) -language/literals/bigint/numeric-separators/numeric-separator-literal-nonoctal-08-err.js(default) -language/literals/bigint/numeric-separators/numeric-separator-literal-nonoctal-09-err.js(default) -language/literals/bigint/numeric-separators/numeric-separator-literal-nonoctal-0_8-err.js(default) -language/literals/bigint/numeric-separators/numeric-separator-literal-nonoctal-0_9-err.js(default) -language/literals/bigint/numeric-separators/numeric-separator-literal-nzd-nsl-dds-leading-zero-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-00-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-01-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-07-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-0_0-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-0_1-err.js(default) language/literals/numeric/numeric-separators/numeric-separator-literal-lol-0_7-err.js(default) -language/literals/numeric/numeric-separators/numeric-separator-literal-nonoctal-08-err.js(default) -language/literals/numeric/numeric-separators/numeric-separator-literal-nonoctal-09-err.js(default) -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/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)