aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2018-04-28 02:47:49 +0800
committerGitHub <noreply@github.com>2018-04-28 02:47:49 +0800
commit22cea023d1f1f54eaba036ddfd63800f3fa50be6 (patch)
treefe2f9956d9f15f3797e55f451eeb1ef0c667e410
parent70d4477e0532f79b6d9cacb610cce6bb1d0819a0 (diff)
downloadtracifyjs-22cea023d1f1f54eaba036ddfd63800f3fa50be6.tar.gz
tracifyjs-22cea023d1f1f54eaba036ddfd63800f3fa50be6.zip
improve numeral compression (#3108)
-rw-r--r--lib/output.js30
-rw-r--r--test/compress/numbers.js52
2 files changed, 57 insertions, 25 deletions
diff --git a/lib/output.js b/lib/output.js
index 7c42fe37..6d7b0723 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 86545fba..000b9ab5 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: {