[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
This commit is contained in:
parent
f339d2d034
commit
69d00dc5b0
@ -993,6 +993,7 @@ export default class Tokenizer extends LocationParser {
|
|||||||
const start = this.state.pos;
|
const start = this.state.pos;
|
||||||
let isFloat = false;
|
let isFloat = false;
|
||||||
let isBigInt = false;
|
let isBigInt = false;
|
||||||
|
let isNonOctalDecimalInt = false;
|
||||||
|
|
||||||
if (!startsWithDot && this.readInt(10) === null) {
|
if (!startsWithDot && this.readInt(10) === null) {
|
||||||
this.raise(start, "Invalid number");
|
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))) {
|
if (/[89]/.test(this.input.slice(start, this.state.pos))) {
|
||||||
octal = false;
|
octal = false;
|
||||||
|
isNonOctalDecimalInt = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1033,10 +1035,26 @@ export default class Tokenizer extends LocationParser {
|
|||||||
next = this.input.charCodeAt(this.state.pos);
|
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 (this.hasPlugin("bigInt")) {
|
||||||
if (next === charCodes.lowercaseN) {
|
if (next === charCodes.lowercaseN) {
|
||||||
// disallow floats and legacy octal syntax, new style octal ("0o") is handled in this.readRadixNumber
|
// disallow floats, legacy octal syntax and non octal decimals
|
||||||
if (isFloat || octal) this.raise(start, "Invalid BigIntLiteral");
|
// new style octal ("0o") is handled in this.readRadixNumber
|
||||||
|
if (isFloat || octal || isNonOctalDecimalInt) {
|
||||||
|
this.raise(start, "Invalid BigIntLiteral");
|
||||||
|
}
|
||||||
++this.state.pos;
|
++this.state.pos;
|
||||||
isBigInt = true;
|
isBigInt = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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-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(default)
|
||||||
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode)
|
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-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-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-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_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_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-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(default)
|
||||||
language/module-code/privatename-not-valid-earlyerr-module-1.js(strict mode)
|
language/module-code/privatename-not-valid-earlyerr-module-1.js(strict mode)
|
||||||
language/module-code/privatename-not-valid-earlyerr-module-2.js(default)
|
language/module-code/privatename-not-valid-earlyerr-module-2.js(default)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user