fix corner case in sequences (#4073)

This commit is contained in:
Alex Lam S.L
2020-08-25 18:26:49 +01:00
committed by GitHub
parent a7e15fe73c
commit 09525c7530
3 changed files with 65 additions and 13 deletions

View File

@@ -554,13 +554,6 @@ merge(Compressor.prototype, {
if (is_arguments(def) && node.property instanceof AST_Number) def.reassigned = true;
}
var suppressor = new TreeWalker(function(node) {
if (!(node instanceof AST_Symbol)) return;
var d = node.definition();
if (!d) return;
if (node instanceof AST_SymbolRef) push_ref(d, node);
d.fixed = false;
});
def(AST_Accessor, function(tw, descend, compressor) {
push(tw);
reset_variables(tw, compressor, this);
@@ -740,11 +733,19 @@ merge(Compressor.prototype, {
return true;
});
def(AST_ForIn, function(tw) {
this.init.walk(suppressor);
this.object.walk(tw);
var saved_loop = tw.in_loop;
tw.in_loop = this;
push(tw);
var init = this.init;
init.walk(tw);
if (init instanceof AST_Var) {
init = init.definitions[0].name;
} else while (init instanceof AST_PropAccess) {
init = init.expression.tail_node();
}
var def = init.definition();
if (def) def.fixed = false;
this.body.walk(tw);
pop(tw);
tw.in_loop = saved_loop;
@@ -8521,7 +8522,9 @@ merge(Compressor.prototype, {
}
}
if (is_lhs(compressor.self(), parent)) return self;
if (compressor.option("sequences") && compressor.parent().TYPE != "Call") {
if (compressor.option("sequences")
&& parent.TYPE != "Call"
&& !(parent instanceof AST_ForIn && parent.init === self)) {
var seq = lift_sequence_in_expression(self, compressor);
if (seq !== self) return seq.optimize(compressor);
}
@@ -8632,8 +8635,11 @@ merge(Compressor.prototype, {
col: self.start.col
});
}
if (is_lhs(compressor.self(), compressor.parent())) return self;
if (compressor.option("sequences") && compressor.parent().TYPE != "Call") {
var parent = compressor.parent();
if (is_lhs(compressor.self(), parent)) return self;
if (compressor.option("sequences")
&& parent.TYPE != "Call"
&& !(parent instanceof AST_ForIn && parent.init === self)) {
var seq = lift_sequence_in_expression(self, compressor);
if (seq !== self) return seq.optimize(compressor);
}