diff --git a/lib/output.js b/lib/output.js index 7c42fe3786..6d7b0723ee 100644 --- a/lib/output.js +++ b/lib/output.js @@ -1459,23 +1459,27 @@ function OutputStream(options) { } function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".").replace('e+', 'e') ], m; + var str = num.toString(10).replace(/^0\./, ".").replace("e+", "e"); + var candidates = [ str ]; if (Math.floor(num) === num) { - if (num >= 0) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. + if (num < 0) { + candidates.push("-0x" + (-num).toString(16).toLowerCase()); } else { - a.push("-0x" + (-num).toString(16).toLowerCase(), // probably pointless - "-0" + (-num).toString(8)); // same. + candidates.push("0x" + num.toString(16).toLowerCase()); } - if ((m = /^(.*?)(0+)$/.exec(num))) { - a.push(m[1] + "e" + m[2].length); - } - } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) { - a.push(m[2] + "e-" + (m[1].length + m[2].length), - str.substr(str.indexOf("."))); } - return best_of(a); + var match, len, digits; + if (match = /^\.0+/.exec(str)) { + len = match[0].length; + digits = str.slice(len); + candidates.push(digits + "e-" + (digits.length + len - 1)); + } else if (match = /0+$/.exec(str)) { + len = match[0].length; + candidates.push(str.slice(0, -len) + "e" + len); + } else if (match = /^(\d)\.(\d+)e(-?\d+)$/.exec(str)) { + candidates.push(match[1] + match[2] + "e" + (match[3] - match[2].length)); + } + return best_of(candidates); } function make_block(stmt, output) { diff --git a/test/compress/numbers.js b/test/compress/numbers.js index 86545fba7e..000b9ab5ac 100644 --- a/test/compress/numbers.js +++ b/test/compress/numbers.js @@ -1,21 +1,49 @@ hex_numbers_in_parentheses_for_prototype_functions: { + beautify = { + beautify: true, + } input: { - (-2); - (-2).toFixed(0); + function f() { + (-2); + (-2).toFixed(0); - (2); - (2).toFixed(0); + (2); + (2).toFixed(0); - (0.2); - (0.2).toFixed(0); + (0.2); + (0.2).toFixed(0); - (0.00000002); - (0.00000002).toFixed(0); + (2.34e20); + (2.34e20).toFixed(0); - (1000000000000000128); - (1000000000000000128).toFixed(0); - } - expect_exact: "-2;(-2).toFixed(0);2;2..toFixed(0);.2;.2.toFixed(0);2e-8;2e-8.toFixed(0);0xde0b6b3a7640080;(0xde0b6b3a7640080).toFixed(0);" + (0.00000002); + (0.00000002).toFixed(0); + + (1000000000000000128); + (1000000000000000128).toFixed(0); + + (-1000000000000000128); + (-1000000000000000128).toFixed(0); + } + } + expect_exact: [ + "function f() {", + " -2;", + " (-2).toFixed(0);", + " 2;", + " 2..toFixed(0);", + " .2;", + " .2.toFixed(0);", + " 234e18;", + " 234e18.toFixed(0);", + " 2e-8;", + " 2e-8.toFixed(0);", + " 0xde0b6b3a7640080;", + " (0xde0b6b3a7640080).toFixed(0);", + " -0xde0b6b3a7640080;", + " (-0xde0b6b3a7640080).toFixed(0);", + "}", + ] } comparisons: {