enhance `evaluate` (#3339)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 14 Mar 2019 18:48:23 +0000 (02:48 +0800)
committerGitHub <noreply@github.com>
Thu, 14 Mar 2019 18:48:23 +0000 (02:48 +0800)
fixes #3299

lib/compress.js
test/compress/collapse_vars.js

index 2a4f0df..b5d155e 100644 (file)
@@ -2727,19 +2727,25 @@ merge(Compressor.prototype, {
                 return typeof function(){};
             }
             if (!non_converting_unary[this.operator]) depth++;
-            e = e._eval(compressor, cached, depth);
-            if (e === this.expression) return this;
+            var v = e._eval(compressor, cached, depth);
+            if (v === this.expression) return this;
             switch (this.operator) {
-              case "!": return !e;
+              case "!": return !v;
               case "typeof":
                 // typeof <RegExp> returns "object" or "function" on different platforms
                 // so cannot evaluate reliably
-                if (e instanceof RegExp) return this;
-                return typeof e;
-              case "void": return void e;
-              case "~": return ~e;
-              case "-": return -e;
-              case "+": return +e;
+                if (v instanceof RegExp) return this;
+                return typeof v;
+              case "void": return void v;
+              case "~": return ~v;
+              case "-": return -v;
+              case "+": return +v;
+              case "++":
+              case "--":
+                if (e instanceof AST_SymbolRef) {
+                    var refs = e.definition().references;
+                    if (refs[refs.length - 1] === e) return v;
+                }
             }
             return this;
         });
index 9873e48..6c86712 100644 (file)
@@ -947,7 +947,7 @@ collapse_vars_misc1: {
         function f8() { var b = window.a * window.z; return b + (b + 5) }
         function f9() { var b = window.a * window.z; return bar() || b }
         function f10(x) { var a = 5; return a += 3; }
-        function f11(x) { var a = 5, b = 3; return a += --b; }
+        function f11(x) { var a = 5; return a += 2; }
     }
 }