@@ -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;
|
||||
|
||||
@@ -1176,3 +1176,30 @@ issue_5182: {
|
||||
"42",
|
||||
]
|
||||
}
|
||||
|
||||
issue_5441: {
|
||||
options = {
|
||||
hoist_props: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
console.log(function(a) {
|
||||
(function() {
|
||||
a = { p: this };
|
||||
})();
|
||||
return typeof a;
|
||||
}());
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
(function() {
|
||||
a_p = this;
|
||||
})();
|
||||
var a_p;
|
||||
return typeof {};
|
||||
}());
|
||||
}
|
||||
expect_stdout: "object"
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ hoist_props_const: {
|
||||
}
|
||||
}
|
||||
expect: {
|
||||
var o = 0, o_p = "PASS";
|
||||
var o, o_p = "PASS";
|
||||
console.log(o_p);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
|
||||
Reference in New Issue
Block a user