Skip to content

Commit

Permalink
parse octal literals correctly (#4843)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl committed Apr 6, 2021
1 parent 231c3d7 commit b179a24
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 11 deletions.
25 changes: 14 additions & 11 deletions lib/parse.js
Expand Up @@ -351,32 +351,35 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {

function read_while(pred) {
var ret = "", ch;
while ((ch = peek()) && pred(ch)) ret += next();
while ((ch = peek()) && pred(ch, ret)) ret += next();
return ret;
}

function parse_error(err) {
js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
}

function is_octal(num) {
return /^0[0-7_]+$/.test(num);
}

function read_num(prefix) {
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
var num = read_while(function(ch) {
var code = ch.charCodeAt(0);
switch (code) {
case 120: case 88: // xX
var num = read_while(function(ch, str) {
switch (ch) {
case "x": case "X":
return has_x ? false : (has_x = true);
case 101: case 69: // eE
case "e": case "E":
return has_x ? true : has_e ? false : (has_e = after_e = true);
case 43: case 45: // +-
case "+": case "-":
return after_e;
case (after_e = false, 46): // .
return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;
case (after_e = false, "."):
return has_dot || has_e || has_x || is_octal(str) ? false : (has_dot = true);
}
return is_digit(code) || /[_0-9a-fo]/i.test(ch);
return /[_0-9a-dfo]/i.test(ch);
});
if (prefix) num = prefix + num;
if (/^0[0-7_]+$/.test(num)) {
if (is_octal(num)) {
if (next_token.has_directive("use strict")) parse_error("Legacy octal literals are not allowed in strict mode");
} else {
num = num.replace(has_x ? /([1-9a-f]|.0)_(?=[0-9a-f])/gi : /([1-9]|.0)_(?=[0-9])/gi, "$1");
Expand Down
34 changes: 34 additions & 0 deletions test/compress/numbers.js
Expand Up @@ -104,6 +104,40 @@ parentheses_for_prototype_functions_galio: {
expect_stdout: true
}

octal: {
beautify = {
beautify: true,
}
input: {
(function() {
console.log(052);
console.log(-052);

console.log(018);
console.log(-018);

console.log(052.toFixed(0));
console.log(-052.toFixed(0));

console.log(018..toFixed(0));
console.log(-018..toFixed(0));
})();
}
expect_exact: [
"(function() {",
" console.log(42);",
" console.log(-42);",
" console.log(18);",
" console.log(-18);",
" console.log(42..toFixed(0));",
" console.log(-42..toFixed(0));",
" console.log(18..toFixed(0));",
" console.log(-18..toFixed(0));",
"})();",
]
expect_stdout: true
}

comparisons: {
options = {
comparisons: true,
Expand Down

0 comments on commit b179a24

Please sign in to comment.