inline single-use `function` across loop (#2594)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 14 Dec 2017 11:24:54 +0000 (19:24 +0800)
committerGitHub <noreply@github.com>
Thu, 14 Dec 2017 11:24:54 +0000 (19:24 +0800)
lib/compress.js
test/compress/functions.js

index 96ed24a..9b0a535 100644 (file)
@@ -3862,12 +3862,15 @@ merge(Compressor.prototype, {
             }
         }
         if (fn instanceof AST_Function) {
+            var def;
             if (compressor.option("inline")
-                && exp === fn
-                && !fn.name
                 && !fn.uses_arguments
                 && !fn.uses_eval
                 && fn.body.length == 1
+                && (exp === fn ? !fn.name
+                    : compressor.option("unused")
+                        && (def = exp.definition()).references.length == 1
+                        && !recursive_ref(compressor, def))
                 && !fn.contains_this()
                 && all(fn.argnames, function(arg) {
                     return arg.__unused;
index 7e87692..c4281d5 100644 (file)
@@ -672,3 +672,78 @@ empty_body: {
         }
     }
 }
+
+inline_loop_1: {
+    options = {
+        inline: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            return x();
+        }
+        for (;;) f();
+    }
+    expect: {
+        for (;;) x();
+    }
+}
+
+inline_loop_2: {
+    options = {
+        inline: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        for (;;) f();
+        function f() {
+            return x();
+        }
+    }
+    expect: {
+        for (;;) x();
+    }
+}
+
+inline_loop_3: {
+    options = {
+        inline: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var f = function() {
+            return x();
+        };
+        for (;;) f();
+    }
+    expect: {
+        for (;;) x();
+    }
+}
+
+inline_loop_4: {
+    options = {
+        inline: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        for (;;) f();
+        var f = function() {
+            return x();
+        };
+    }
+    expect: {
+        for (;;) f();
+        var f = function() {
+            return x();
+        };
+    }
+}