fix corner cases in `functions` & `merge_vars` (#4156)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 26 Sep 2020 07:31:33 +0000 (08:31 +0100)
committerGitHub <noreply@github.com>
Sat, 26 Sep 2020 07:31:33 +0000 (15:31 +0800)
fixes #4155

lib/compress.js
test/compress/functions.js
test/compress/merge_vars.js

index 3f7eee6..25a993f 100644 (file)
@@ -4449,7 +4449,9 @@ merge(Compressor.prototype, {
                 segment.block = node;
                 walk_body(node, tw);
                 if (node.bcatch) {
-                    references[node.bcatch.argname.definition().id] = false;
+                    var def = node.bcatch.argname.definition();
+                    references[def.id] = false;
+                    if (def = def.redefined()) references[def.id] = false;
                     pop();
                     push();
                     walk_body(node.bcatch, tw);
@@ -4843,8 +4845,10 @@ merge(Compressor.prototype, {
                             && !compressor.option("ie8")
                             && var_defs.length == 1
                             && sym.assignments == 0
-                            && def.value === def.name.fixed_value()
                             && def.value instanceof AST_Function
+                            && (sym.references.length ? all(sym.references, function(ref) {
+                                    return def.value === ref.fixed_value();
+                                }) : def.value === def.name.fixed_value())
                             && (!def.value.name || (old_def = def.value.name.definition()).assignments == 0
                                 && (old_def.name == def.name.name || all(old_def.references, function(ref) {
                                     return ref.scope.find_variable(def.name) === def.name.definition();
index 3027d59..1be0116 100644 (file)
@@ -4777,3 +4777,34 @@ issue_4006: {
     }
     expect_stdout: "-1"
 }
+
+issue_4155: {
+    options = {
+        functions: true,
+        inline: true,
+        merge_vars: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        (function() {
+            var a;
+            (function() {
+                console.log(a);
+            })(a);
+            var b = function() {};
+            b && console.log(typeof b);
+        })();
+    }
+    expect: {
+        (function() {
+            void console.log(b);
+            var b = function() {};
+            b && console.log(typeof b);
+        })();
+    }
+    expect_stdout: [
+        "undefined",
+        "function",
+    ]
+}
index b86b0e9..7eb3f13 100644 (file)
@@ -2822,3 +2822,41 @@ conditional_write: {
     }
     expect_stdout: "PASS,42"
 }
+
+issue_4155: {
+    options = {
+        inline: true,
+        merge_vars: true,
+    }
+    input: {
+        (function() {
+            try {
+                throw "PASS";
+            } catch (e) {
+                var a;
+                (function() {
+                    console.log(e, a);
+                })(a = NaN);
+            }
+            var e = function() {};
+            e && console.log(typeof e);
+        })();
+    }
+    expect: {
+        (function() {
+            try {
+                throw "PASS";
+            } catch (e) {
+                var a;
+                a = NaN,
+                void console.log(e, a);
+            }
+            var e = function() {};
+            e && console.log(typeof e);
+        })();
+    }
+    expect_stdout: [
+        "PASS NaN",
+        "function",
+    ]
+}