fix corner case in hoist_props (#5442)

fixes #5441
This commit is contained in:
Alex Lam S.L
2022-05-15 23:49:09 +01:00
committed by GitHub
parent e31bbe329a
commit 7db2ada880
3 changed files with 41 additions and 7 deletions

View File

@@ -8156,12 +8156,12 @@ Compressor.prototype.compress = function(node) {
var self = this;
var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
var defs_by_id = Object.create(null);
self.transform(new TreeTransformer(function(node, descend) {
var tt = new TreeTransformer(function(node, descend) {
if (node instanceof AST_Assign) {
if (node.operator != "=") return;
if (!node.write_only) return;
if (!can_hoist(node.left, node.right, 1)) return;
descend(node, this);
descend(node, tt);
var defs = new Dictionary();
var assignments = [];
var decls = [];
@@ -8185,15 +8185,20 @@ Compressor.prototype.compress = function(node) {
});
defs.value = node.right;
defs_by_id[node.left.definition().id] = defs;
self.body.splice(self.body.indexOf(this.stack[1]) + 1, 0, make_node(AST_Var, node, {
self.body.splice(self.body.indexOf(tt.stack[1]) + 1, 0, make_node(AST_Var, node, {
definitions: decls,
}));
return make_sequence(node, assignments);
}
if (node instanceof AST_Scope) return node === self ? undefined : node;
if (node instanceof AST_Scope) {
if (node === self) return;
var parent = tt.parent();
if (parent.TYPE == "Call" && parent.expression === node) return;
return node;
}
if (node instanceof AST_VarDef) {
if (!can_hoist(node.name, node.value, 0)) return;
descend(node, this);
descend(node, tt);
var defs = new Dictionary();
var var_defs = [];
var decl = node.clone();
@@ -8215,7 +8220,8 @@ Compressor.prototype.compress = function(node) {
defs.set(key, new_var.definition());
return new_var;
}
}));
});
self.transform(tt);
self.transform(new TreeTransformer(function(node, descend) {
if (node instanceof AST_PropAccess) {
if (!(node.expression instanceof AST_SymbolRef)) return;
@@ -8245,6 +8251,7 @@ Compressor.prototype.compress = function(node) {
if (def.assignments != count) return;
if (def.references.length - def.replaced == count) return;
if (def.single_use) return;
if (self.find_variable(sym.name) !== def) return;
if (top_retain(def)) return;
if (sym.fixed_value() !== right) return;
var fixed = sym.fixed || def.fixed;