fix corner case in side_effects (#4545)

fixes #4544
This commit is contained in:
Alex Lam S.L
2021-01-12 17:08:16 +00:00
committed by GitHub
parent 46ad273df4
commit fc816628c1
2 changed files with 54 additions and 3 deletions

View File

@@ -8243,7 +8243,7 @@ merge(Compressor.prototype, {
if (compressor.option("side_effects")
&& can_drop
&& all(fn.body, is_empty)
&& (fn === exp ? fn_name_unused(fn, compressor) : !has_default && !has_destructured)
&& (fn === exp ? fn_name_unused(fn, compressor) : !fn.rest && !has_default && !has_destructured)
&& !(is_arrow(fn) && fn.value)) {
return make_sequence(self, convert_args()).optimize(compressor);
}
@@ -8286,7 +8286,7 @@ merge(Compressor.prototype, {
function convert_args(value) {
var args = self.args.slice();
var destructured = has_default > 1 || has_destructured;
var destructured = fn.rest || has_default > 1 || has_destructured;
if (destructured || has_spread) args = [ make_node(AST_Array, self, { elements: args }) ];
if (destructured) {
var tt = new TreeTransformer(function(node, descend) {
@@ -8332,10 +8332,15 @@ merge(Compressor.prototype, {
argname = argname.transform(tt);
if (argname) lhs[index] = argname;
});
var rest = fn.rest && fn.rest.transform(tt);
if (rest) lhs.length = fn.argnames.length;
fill_holes(fn, lhs);
args[0] = make_node(AST_Assign, self, {
operator: "=",
left: make_node(AST_DestructuredArray, fn, { elements: lhs }),
left: make_node(AST_DestructuredArray, fn, {
elements: lhs,
rest: rest,
}),
right: args[0],
});
} else fn.argnames.forEach(function(argname) {

View File

@@ -600,3 +600,49 @@ issue_4538: {
expect_stdout: "function"
node_version: ">=6"
}
issue_4544_1: {
options = {
keep_fnames: true,
side_effects: true,
}
input: {
try {
(function f(...[ {} ]) {})();
} catch (e) {
console.log("PASS");
}
}
expect: {
try {
[ ...[ {} ] ] = [];
} catch (e) {
console.log("PASS");
}
}
expect_stdout: "PASS"
node_version: ">=6"
}
issue_4544_2: {
options = {
keep_fnames: true,
side_effects: true,
}
input: {
try {
(function f(a, ...[ {} ]) {})([]);
} catch (e) {
console.log("PASS");
}
}
expect: {
try {
[ , ...[ {} ] ] = [ [] ];
} catch (e) {
console.log("PASS");
}
}
expect_stdout: "PASS"
node_version: ">=6"
}