fix corner cases in collapse_vars & unused (#4807)

fixes #4806
This commit is contained in:
Alex Lam S.L
2021-03-20 19:51:03 +00:00
committed by GitHub
parent b89cc84c3a
commit 24619daf68
3 changed files with 121 additions and 13 deletions

View File

@@ -2701,8 +2701,8 @@ merge(Compressor.prototype, {
function patch_sequence(node) {
if (node instanceof AST_Sequence) switch (node.expressions.length) {
case 0: return null;
case 1: return node.expressions[0];
case 0: return null;
case 1: return maintain_this_binding(compressor, this.parent(), node, node.expressions[0]);
}
}
@@ -6386,14 +6386,13 @@ merge(Compressor.prototype, {
scope = save_scope;
}
}, function(node, in_list) {
if (node instanceof AST_BlockStatement) {
return trim_block(node, tt.parent(), in_list);
} else if (node instanceof AST_For) {
// Certain combination of unused name + side effect leads to invalid AST:
// https://github.com/mishoo/UglifyJS/issues/44
// https://github.com/mishoo/UglifyJS/issues/1838
// https://github.com/mishoo/UglifyJS/issues/3371
// We fix it at this stage by moving the `var` outside the `for`.
if (node instanceof AST_BlockStatement) return trim_block(node, tt.parent(), in_list);
// Certain combination of unused name + side effect leads to invalid AST:
// https://github.com/mishoo/UglifyJS/issues/44
// https://github.com/mishoo/UglifyJS/issues/1838
// https://github.com/mishoo/UglifyJS/issues/3371
// We fix it at this stage by moving the `var` outside the `for`.
if (node instanceof AST_For) {
var block;
if (node.init instanceof AST_BlockStatement) {
block = node.init;
@@ -6414,7 +6413,8 @@ merge(Compressor.prototype, {
node.init = null;
}
return !block ? node : in_list ? List.splice(block.body) : block;
} else if (node instanceof AST_ForIn) {
}
if (node instanceof AST_ForIn) {
if (!drop_vars || !compressor.option("loops")) return;
if (!is_empty(node.body)) return;
var sym = get_init_symbol(node);
@@ -6435,8 +6435,10 @@ merge(Compressor.prototype, {
body.push(node.init);
}
return insert_statements(body, node, in_list);
} else if (node instanceof AST_Sequence) {
if (node.expressions.length == 1) return node.expressions[0];
}
if (node instanceof AST_Sequence) {
if (node.expressions.length > 1) return;
return maintain_this_binding(compressor, tt.parent(), node, node.expressions[0]);
}
});
tt.push(compressor.parent());