improve numeral compression (#3108)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 27 Apr 2018 18:47:49 +0000 (02:47 +0800)
committerGitHub <noreply@github.com>
Fri, 27 Apr 2018 18:47:49 +0000 (02:47 +0800)
lib/output.js
test/compress/numbers.js

index 7c42fe3..6d7b072 100644 (file)
@@ -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) {
index 86545fb..000b9ab 100644 (file)
@@ -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: {