fix corner case in side_effects (#4343)

fixes #4342
This commit is contained in:
Alex Lam S.L
2020-12-07 09:25:04 +00:00
committed by GitHub
parent fbecedf94c
commit 4bde50ce85
2 changed files with 34 additions and 10 deletions

View File

@@ -6240,18 +6240,20 @@ merge(Compressor.prototype, {
if (!exp.is_string(compressor)) return node; if (!exp.is_string(compressor)) return node;
return exp.drop_side_effect_free(compressor, first_in_statement); return exp.drop_side_effect_free(compressor, first_in_statement);
} }
function convert_spread(node) {
return node instanceof AST_Spread ? make_node(AST_Array, node, {
elements: [ node ]
}) : node;
}
def(AST_Node, return_this); def(AST_Node, return_this);
def(AST_Accessor, return_null); def(AST_Accessor, return_null);
def(AST_Array, function(compressor, first_in_statement) { def(AST_Array, function(compressor, first_in_statement) {
var values = trim(this.elements, compressor, first_in_statement, array_spread); var values = trim(this.elements, compressor, first_in_statement, array_spread);
if (!values) return null; if (!values) return null;
if (all(values, function(node) { if (values === this.elements && all(values, function(node) {
return !(node instanceof AST_Spread); return node instanceof AST_Spread;
})) return make_sequence(this, values); })) return this;
if (values === this.elements) return this; return make_sequence(this, values.map(convert_spread));
var node = this.clone();
node.elements = values;
return node;
}); });
def(AST_Assign, function(compressor) { def(AST_Assign, function(compressor) {
var left = this.left; var left = this.left;
@@ -6304,14 +6306,14 @@ merge(Compressor.prototype, {
if (self.is_expr_pure(compressor)) { if (self.is_expr_pure(compressor)) {
if (self.pure) AST_Node.warn("Dropping __PURE__ call [{file}:{line},{col}]", self.start); if (self.pure) AST_Node.warn("Dropping __PURE__ call [{file}:{line},{col}]", self.start);
var args = trim(self.args, compressor, first_in_statement, array_spread); var args = trim(self.args, compressor, first_in_statement, array_spread);
return args && make_sequence(self, args); return args && make_sequence(self, args.map(convert_spread));
} }
var exp = self.expression; var exp = self.expression;
if (self.is_call_pure(compressor)) { if (self.is_call_pure(compressor)) {
var exprs = self.args.slice(); var exprs = self.args.slice();
exprs.unshift(exp.expression); exprs.unshift(exp.expression);
exprs = trim(exprs, compressor, first_in_statement, array_spread); exprs = trim(exprs, compressor, first_in_statement, array_spread);
return exprs && make_sequence(self, exprs); return exprs && make_sequence(self, exprs.map(convert_spread));
} }
var def; var def;
if (exp instanceof AST_Function if (exp instanceof AST_Function
@@ -6342,7 +6344,7 @@ merge(Compressor.prototype, {
var exprs = self.args.slice(); var exprs = self.args.slice();
exprs.unshift(exp); exprs.unshift(exp);
exprs = trim(exprs, compressor, first_in_statement, array_spread); exprs = trim(exprs, compressor, first_in_statement, array_spread);
return exprs && make_sequence(self, exprs); return exprs && make_sequence(self, exprs.map(convert_spread));
} }
if (!fn.contains_this()) return make_node(AST_Call, self, self); if (!fn.contains_this()) return make_node(AST_Call, self, self);
} }

View File

@@ -425,3 +425,25 @@ issue_4331: {
expect_stdout: "PASS" expect_stdout: "PASS"
node_version: ">=8" node_version: ">=8"
} }
issue_4342: {
options = {
side_effects: true,
}
input: {
try {
new function() {}(...42);
} catch (e) {
console.log("PASS");
}
}
expect: {
try {
[ ...42 ];
} catch (e) {
console.log("PASS");
}
}
expect_stdout: "PASS"
node_version: ">=6"
}