From: Alex Lam S.L Date: Thu, 14 Dec 2017 11:24:54 +0000 (+0800) Subject: inline single-use `function` across loop (#2594) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=90313875f75f68fecfc23c6c6f96f921da730301;p=UglifyJS.git inline single-use `function` across loop (#2594) --- diff --git a/lib/compress.js b/lib/compress.js index 96ed24a5..9b0a5350 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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; diff --git a/test/compress/functions.js b/test/compress/functions.js index 7e87692d..c4281d5c 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -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(); + }; + } +}