inline single-use function across loop

This commit is contained in:
alexlamsl 2017-12-14 18:35:52 +08:00
parent 02a6ce07eb
commit 90ba8bf516
2 changed files with 80 additions and 2 deletions

View File

@ -3857,12 +3857,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;

View 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();
};
}
}