Skip to content

Commit

Permalink
[parser] Invalid NonOctal Decimal (#10467)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
zant authored and nicolo-ribaudo committed Sep 23, 2019
1 parent f339d2d commit 69d00dc
Show file tree
Hide file tree
Showing 9 changed files with 27 additions and 17 deletions.
22 changes: 20 additions & 2 deletions packages/babel-parser/src/tokenizer/index.js
Expand Up @@ -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");
Expand All @@ -1009,6 +1010,7 @@ export default class Tokenizer extends LocationParser {
}
if (/[89]/.test(this.input.slice(start, this.state.pos))) {
octal = false;
isNonOctalDecimalInt = true;
}
}

Expand All @@ -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;
}
Expand Down
@@ -0,0 +1 @@
089n
@@ -0,0 +1 @@
{ "throws": "Invalid BigIntLiteral (1:0)" }
@@ -0,0 +1 @@
0_8
@@ -0,0 +1 @@
{ "throws": "Numeric separator can not be used after leading 0 (1:1)" }
@@ -0,0 +1 @@
08_0n
@@ -0,0 +1 @@
{ "throws": "Numeric separator can not be used after leading 0 (1:2)" }
@@ -1,3 +1,3 @@
{
"plugins": ["numericSeparator"]
"plugins": ["bigInt", "numericSeparator"]
}
14 changes: 0 additions & 14 deletions scripts/tests/test262/test262_whitelist.txt
Expand Up @@ -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)
Expand Down

0 comments on commit 69d00dc

Please sign in to comment.