Skip to content

Commit

Permalink
Parse non-octals with leading zeros in non strict mode correctly (#9114)
Browse files Browse the repository at this point in the history
* Parse non-octals with leading zeros in non strict mode correctly

* Better error message
  • Loading branch information
danez committed Dec 3, 2018
1 parent 07eaa3c commit 3932830
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 23 deletions.
29 changes: 15 additions & 14 deletions packages/babel-parser/src/tokenizer/index.js
Expand Up @@ -971,14 +971,26 @@ export default class Tokenizer extends LocationParser {

readNumber(startsWithDot: boolean): void {
const start = this.state.pos;
let octal = this.input.charCodeAt(start) === charCodes.digit0;
let isFloat = false;
let isBigInt = false;

if (!startsWithDot && this.readInt(10) === null) {
this.raise(start, "Invalid number");
}
if (octal && this.state.pos == start + 1) octal = false; // number === 0
let octal =
this.state.pos - start >= 2 &&
this.input.charCodeAt(start) === charCodes.digit0;
if (octal) {
if (this.state.strict) {
this.raise(
start,
"Legacy octal literals are not allowed in strict mode",
);
}
if (/[89]/.test(this.input.slice(start, this.state.pos))) {
octal = false;
}
}

let next = this.input.charCodeAt(this.state.pos);
if (next === charCodes.dot && !octal) {
Expand Down Expand Up @@ -1022,18 +1034,7 @@ export default class Tokenizer extends LocationParser {
return;
}

let val;
if (isFloat) {
val = parseFloat(str);
} else if (!octal || str.length === 1) {
val = parseInt(str, 10);
} else if (this.state.strict) {
this.raise(start, "Invalid number");
} else if (/[89]/.test(str)) {
val = parseInt(str, 10);
} else {
val = parseInt(str, 8);
}
const val = octal ? parseInt(str, 8) : parseFloat(str);
this.finishToken(tt.num, val);
}

Expand Down
@@ -0,0 +1 @@
09.5
@@ -0,0 +1,4 @@
{
"sourceType": "module",
"throws": "Legacy octal literals are not allowed in strict mode (1:0)"
}
@@ -0,0 +1 @@
09.5
@@ -0,0 +1,70 @@
{
"type": "File",
"start": 0,
"end": 4,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 4
}
},
"program": {
"type": "Program",
"start": 0,
"end": 4,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 4
}
},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ExpressionStatement",
"start": 0,
"end": 4,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 4
}
},
"expression": {
"type": "NumericLiteral",
"start": 0,
"end": 4,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 4
}
},
"extra": {
"rawValue": 9.5,
"raw": "09.5"
},
"value": 9.5
}
}
],
"directives": []
}
}
@@ -0,0 +1 @@
07.5
@@ -0,0 +1,3 @@
{
"throws": "Unexpected token, expected \";\" (1:2)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:33)"
"throws": "Legacy octal literals are not allowed in strict mode (1:33)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:36)"
"throws": "Legacy octal literals are not allowed in strict mode (1:36)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:65)"
"throws": "Legacy octal literals are not allowed in strict mode (1:65)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (2:10)"
"throws": "Legacy octal literals are not allowed in strict mode (2:10)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (2:10)"
"throws": "Legacy octal literals are not allowed in strict mode (2:10)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:21)"
"throws": "Legacy octal literals are not allowed in strict mode (1:21)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:21)"
"throws": "Legacy octal literals are not allowed in strict mode (1:21)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:33)"
"throws": "Legacy octal literals are not allowed in strict mode (1:33)"
}
@@ -1,3 +1,3 @@
{
"throws": "Invalid number (1:36)"
"throws": "Legacy octal literals are not allowed in strict mode (1:36)"
}

0 comments on commit 3932830

Please sign in to comment.