From b98f463aa759979bbed1dd7704e66c7616e89d07 Mon Sep 17 00:00:00 2001 From: Alex Kuzmenko Date: Fri, 21 Apr 2017 16:22:50 +0300 Subject: [PATCH] Fixed invalid number literal parsing (#473) * Fixed invalid number literal parsing * Don't ignore period or E characters after octal numbers cherry-pick fix from acorn * Fix tests --- src/tokenizer/index.js | 12 ++++++++---- test/fixtures/core/uncategorised/554/actual.js | 1 + test/fixtures/core/uncategorised/554/options.json | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/core/uncategorised/554/actual.js create mode 100644 test/fixtures/core/uncategorised/554/options.json diff --git a/src/tokenizer/index.js b/src/tokenizer/index.js index 076b636381..4031b008b1 100644 --- a/src/tokenizer/index.js +++ b/src/tokenizer/index.js @@ -564,30 +564,34 @@ export default class Tokenizer { readNumber(startsWithDot) { const start = this.state.pos; - const firstIsZero = this.input.charCodeAt(start) === 48; // '0' + let octal = this.input.charCodeAt(start) === 48; // '0' let isFloat = false; if (!startsWithDot && this.readInt(10) === null) this.raise(start, "Invalid number"); + if (octal && this.state.pos == start + 1) octal = false; // number === 0 + let next = this.input.charCodeAt(this.state.pos); - if (next === 46) { // '.' + if (next === 46 && !octal) { // '.' ++this.state.pos; this.readInt(10); isFloat = true; next = this.input.charCodeAt(this.state.pos); } - if (next === 69 || next === 101) { // 'eE' + + if ((next === 69 || next === 101) && !octal) { // 'eE' next = this.input.charCodeAt(++this.state.pos); if (next === 43 || next === 45) ++this.state.pos; // '+-' if (this.readInt(10) === null) this.raise(start, "Invalid number"); isFloat = true; } + if (isIdentifierStart(this.fullCharCodeAtPos())) this.raise(this.state.pos, "Identifier directly after number"); const str = this.input.slice(start, this.state.pos); let val; if (isFloat) { val = parseFloat(str); - } else if (!firstIsZero || str.length === 1) { + } else if (!octal || str.length === 1) { val = parseInt(str, 10); } else if (this.state.strict) { this.raise(start, "Invalid number"); diff --git a/test/fixtures/core/uncategorised/554/actual.js b/test/fixtures/core/uncategorised/554/actual.js new file mode 100644 index 0000000000..204735a64f --- /dev/null +++ b/test/fixtures/core/uncategorised/554/actual.js @@ -0,0 +1 @@ +var a = 0123.; \ No newline at end of file diff --git a/test/fixtures/core/uncategorised/554/options.json b/test/fixtures/core/uncategorised/554/options.json new file mode 100644 index 0000000000..e247a786c1 --- /dev/null +++ b/test/fixtures/core/uncategorised/554/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:13)" +}