Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[parser] Invalid NonOctal Decimal #10467

Merged
merged 12 commits into from Sep 23, 2019
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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you want to open another PR to fix these tests, you are welcome to do so!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, i would like to do so! Should i make an issue or just as a follow up of this PR?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naa, just a PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Goodd 👌

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