compress apply() & call() of function (#2613)
- `fn.apply(a, [ ... ])` => `fn.call(a, ...)` - `fn.call(a, ... )` => `a, fn(...)` where `fn` can be `function` literal or symbol reference linked through `reduce_vars`
This commit is contained in:
@@ -3857,6 +3857,34 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "apply":
|
||||
if (self.args.length == 2 && self.args[1] instanceof AST_Array) {
|
||||
var args = self.args[1].elements.slice();
|
||||
args.unshift(self.args[0]);
|
||||
return make_node(AST_Call, self, {
|
||||
expression: make_node(AST_Dot, exp, {
|
||||
expression: exp.expression,
|
||||
property: "call"
|
||||
}),
|
||||
args: args
|
||||
}).optimize(compressor);
|
||||
}
|
||||
break;
|
||||
case "call":
|
||||
var func = exp.expression;
|
||||
if (func instanceof AST_SymbolRef) {
|
||||
func = func.fixed_value();
|
||||
}
|
||||
if (func instanceof AST_Function && !func.contains_this()) {
|
||||
return make_sequence(this, [
|
||||
self.args[0],
|
||||
make_node(AST_Call, self, {
|
||||
expression: exp.expression,
|
||||
args: self.args.slice(1)
|
||||
})
|
||||
]).optimize(compressor);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (compressor.option("unsafe_Func")
|
||||
|
||||
Reference in New Issue
Block a user