fix inline & unused on AST_Expansion (#2138)
- handle rest parameters - suppress cases with spread arguments fixes #2136
This commit is contained in:
@@ -3111,7 +3111,11 @@ merge(Compressor.prototype, {
|
|||||||
OPT(AST_Call, function(self, compressor){
|
OPT(AST_Call, function(self, compressor){
|
||||||
var exp = self.expression;
|
var exp = self.expression;
|
||||||
var fn = exp;
|
var fn = exp;
|
||||||
|
var simple_args = all(self.args, function(arg) {
|
||||||
|
return !(arg instanceof AST_Expansion);
|
||||||
|
});
|
||||||
if (compressor.option("unused")
|
if (compressor.option("unused")
|
||||||
|
&& simple_args
|
||||||
&& (fn instanceof AST_Function
|
&& (fn instanceof AST_Function
|
||||||
|| compressor.option("reduce_vars")
|
|| compressor.option("reduce_vars")
|
||||||
&& fn instanceof AST_SymbolRef
|
&& fn instanceof AST_SymbolRef
|
||||||
@@ -3120,6 +3124,18 @@ merge(Compressor.prototype, {
|
|||||||
&& !fn.uses_eval) {
|
&& !fn.uses_eval) {
|
||||||
var pos = 0, last = 0;
|
var pos = 0, last = 0;
|
||||||
for (var i = 0, len = self.args.length; i < len; i++) {
|
for (var i = 0, len = self.args.length; i < len; i++) {
|
||||||
|
if (fn.argnames[i] instanceof AST_Expansion) {
|
||||||
|
if (fn.argnames[i].__unused) while (i < len) {
|
||||||
|
var node = self.args[i++].drop_side_effect_free(compressor);
|
||||||
|
if (node) {
|
||||||
|
self.args[pos++] = node;
|
||||||
|
}
|
||||||
|
} else while (i < len) {
|
||||||
|
self.args[pos++] = self.args[i++];
|
||||||
|
}
|
||||||
|
last = pos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
var trim = i >= fn.argnames.length;
|
var trim = i >= fn.argnames.length;
|
||||||
if (trim || fn.argnames[i].__unused) {
|
if (trim || fn.argnames[i].__unused) {
|
||||||
var node = self.args[i].drop_side_effect_free(compressor);
|
var node = self.args[i].drop_side_effect_free(compressor);
|
||||||
@@ -3340,6 +3356,7 @@ merge(Compressor.prototype, {
|
|||||||
&& exp.body.length == 1
|
&& exp.body.length == 1
|
||||||
&& !exp.uses_arguments
|
&& !exp.uses_arguments
|
||||||
&& !exp.uses_eval
|
&& !exp.uses_eval
|
||||||
|
&& simple_args
|
||||||
&& !self.has_pure_annotation(compressor)) {
|
&& !self.has_pure_annotation(compressor)) {
|
||||||
var value;
|
var value;
|
||||||
if (stat instanceof AST_Return) {
|
if (stat instanceof AST_Return) {
|
||||||
@@ -3357,6 +3374,16 @@ merge(Compressor.prototype, {
|
|||||||
if (exp.argnames.length > 0) {
|
if (exp.argnames.length > 0) {
|
||||||
fn.body.push(make_node(AST_Var, self, {
|
fn.body.push(make_node(AST_Var, self, {
|
||||||
definitions: exp.argnames.map(function(sym, i) {
|
definitions: exp.argnames.map(function(sym, i) {
|
||||||
|
if (sym instanceof AST_Expansion) {
|
||||||
|
return make_node(AST_VarDef, sym, {
|
||||||
|
name: sym.expression,
|
||||||
|
value: make_node(AST_Array, self, {
|
||||||
|
elements: self.args.slice(i).map(function(arg) {
|
||||||
|
return arg.clone(true);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
var arg = self.args[i];
|
var arg = self.args[i];
|
||||||
return make_node(AST_VarDef, sym, {
|
return make_node(AST_VarDef, sym, {
|
||||||
name: sym,
|
name: sym,
|
||||||
@@ -3365,7 +3392,7 @@ merge(Compressor.prototype, {
|
|||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
if (self.args.length > exp.argnames.length) {
|
if (self.args.length > exp.argnames.length && !(exp.argnames[exp.argnames.length - 1] instanceof AST_Expansion)) {
|
||||||
fn.body.push(make_node(AST_SimpleStatement, self, {
|
fn.body.push(make_node(AST_SimpleStatement, self, {
|
||||||
body: make_sequence(self, self.args.slice(exp.argnames.length).map(function(node) {
|
body: make_sequence(self, self.args.slice(exp.argnames.length).map(function(node) {
|
||||||
return node.clone(true);
|
return node.clone(true);
|
||||||
|
|||||||
@@ -1338,3 +1338,74 @@ issue_2105: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2136_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(a, ...b) {
|
||||||
|
console.log(b);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(a, ...b) {
|
||||||
|
console.log(b);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "[]"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
f([2,3][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2136_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
!function(a, ...b) {
|
||||||
|
f(b[0]);
|
||||||
|
}(1, 2, 3);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user