fix corner cases in `ie8` (#3472)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 14 Oct 2019 10:15:40 +0000 (18:15 +0800)
committerGitHub <noreply@github.com>
Mon, 14 Oct 2019 10:15:40 +0000 (18:15 +0800)
fixes #3471

lib/compress.js
test/compress/ie8.js

index 06ba43c..be9e8dc 100644 (file)
@@ -3716,6 +3716,7 @@ merge(Compressor.prototype, {
                         if (!def.value) {
                             head.push(def);
                         } else if (compressor.option("functions")
+                            && !compressor.option("ie8")
                             && def.value === def.name.fixed_value()
                             && def.value instanceof AST_Function
                             && !(def.value.name && def.value.name.definition().assignments)
@@ -6183,7 +6184,9 @@ merge(Compressor.prototype, {
                             var fn = node.fixed_value();
                             if (!(fn instanceof AST_Lambda)) return;
                             if (!fn.name) return;
-                            if (fixed.variables.get(fn.name.name) !== fn.name.definition()) return;
+                            var fn_def = fn.name.definition();
+                            if (fn_def.scope !== fn.name.scope) return;
+                            if (fixed.variables.get(fn.name.name) !== fn_def) return;
                             fn.name = fn.name.clone();
                             var value_def = value.variables.get(fn.name.name) || value.def_function(fn.name);
                             node.thedef = value_def;
index f0298de..94b83de 100644 (file)
@@ -1013,3 +1013,71 @@ issue_3468_ie8: {
     }
     expect_stdout: "function"
 }
+
+issue_3471: {
+    options = {
+        ie8: false,
+        functions: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var c = 1;
+        function f() {
+            var a = function g() {
+                --c && f();
+                g.p = 0;
+            };
+            for (var p in a)
+                a[p];
+        }
+        f();
+    }
+    expect: {
+        var c = 1;
+        (function f() {
+            function a() {
+                --c && f();
+                a.p = 0;
+            }
+            for (var p in a)
+                a[p];
+        })();
+    }
+    expect_stdout: true
+}
+
+issue_3471_ie8: {
+    options = {
+        ie8: true,
+        functions: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var c = 1;
+        function f() {
+            var a = function g() {
+                --c && f();
+                g.p = 0;
+            };
+            for (var p in a)
+                a[p];
+        }
+        f();
+    }
+    expect: {
+        var c = 1;
+        (function f() {
+            var a = function g() {
+                --c && f();
+                g.p = 0;
+            };
+            for (var p in a)
+                a[p];
+        })();
+    }
+    expect_stdout: true
+}