fix corner case in `evaluate` (#3904)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 17 May 2020 14:25:13 +0000 (15:25 +0100)
committerGitHub <noreply@github.com>
Sun, 17 May 2020 14:25:13 +0000 (22:25 +0800)
fixes #3903

lib/compress.js
test/compress/evaluate.js

index 986bed3..02d36d6 100644 (file)
@@ -3571,6 +3571,7 @@ merge(Compressor.prototype, {
                 var args = eval_args(this.args);
                 if (!args && !ignore_side_effects) return this;
                 if (!stat.value) return;
+                var cached_args = [];
                 if (args && !all(fn.argnames, function(sym, i) {
                     var value = args[i];
                     var def = sym.definition();
@@ -3579,13 +3580,16 @@ merge(Compressor.prototype, {
                         node._eval = function() {
                             return value;
                         };
-                        cached.push(node);
+                        cached_args.push(node);
                     });
                     return true;
                 }) && !ignore_side_effects) return this;
                 fn.evaluating = true;
                 var val = stat.value._eval(compressor, ignore_side_effects, cached, depth);
                 delete fn.evaluating;
+                cached_args.forEach(function(node) {
+                    delete node._eval;
+                });
                 if (val === stat.value) return this;
                 return val;
             } else if (compressor.option("unsafe") && exp instanceof AST_PropAccess) {
index 8425abe..3f9f101 100644 (file)
@@ -2418,3 +2418,29 @@ issue_3887: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3903: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = "PASS";
+        function f(b, c) {
+            return console, c;
+        }
+        var d = f(f(), a = a);
+        console.log(d);
+    }
+    expect: {
+        var a = "PASS";
+        function f(b, c) {
+            return console, c;
+        }
+        var d = f(f(), a = a);
+        console.log(d);
+    }
+    expect_stdout: "PASS"
+}