fix corner case in `evaluate` (#4215)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 13 Oct 2020 18:49:45 +0000 (19:49 +0100)
committerGitHub <noreply@github.com>
Tue, 13 Oct 2020 18:49:45 +0000 (02:49 +0800)
fixes #4214

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

index 5dd10c6..baa501f 100644 (file)
@@ -3804,6 +3804,8 @@ merge(Compressor.prototype, {
                 if (fn.evaluating) return this;
                 if (fn.name && fn.name.definition().recursive_refs > 0) return this;
                 if (this.is_expr_pure(compressor)) return this;
+                var args = eval_args(this.args);
+                if (!args && !ignore_side_effects) return this;
                 var stat = fn.first_statement();
                 if (!(stat instanceof AST_Return)) {
                     if (ignore_side_effects) {
@@ -3811,7 +3813,9 @@ merge(Compressor.prototype, {
                         fn.walk(new TreeWalker(function(node) {
                             if (found) return true;
                             if (node instanceof AST_Return) {
-                                if (node.value && node.value.evaluate(compressor, true) !== undefined) found = true;
+                                if (node.value && node.value._eval(compressor, true, cached, depth) !== undefined) {
+                                    found = true;
+                                }
                                 return true;
                             }
                             if (node instanceof AST_Scope && node !== fn) return true;
@@ -3820,8 +3824,6 @@ merge(Compressor.prototype, {
                     }
                     return this;
                 }
-                var args = eval_args(this.args);
-                if (!args && !ignore_side_effects) return this;
                 var val = stat.value;
                 if (!val) return;
                 var cached_args = [];
index 9504afb..9fa6520 100644 (file)
@@ -3014,3 +3014,36 @@ issue_4119_4: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4214: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f(a) {
+            return function() {
+                try {
+                    return a;
+                } finally {
+                    var b = 0;
+                }
+            }(a++ && this());
+        }
+        var c = f();
+        console.log(c);
+    }
+    expect: {
+        var c = function(a) {
+            return function() {
+                try {
+                    return a;
+                } finally {}
+            }(a++ && this());
+        }();
+        console.log(c);
+    }
+    expect_stdout: "NaN"
+}