@@ -8156,12 +8156,12 @@ Compressor.prototype.compress = function(node) {
|
|||||||
var self = this;
|
var self = this;
|
||||||
var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
|
var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
|
||||||
var defs_by_id = Object.create(null);
|
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 instanceof AST_Assign) {
|
||||||
if (node.operator != "=") return;
|
if (node.operator != "=") return;
|
||||||
if (!node.write_only) return;
|
if (!node.write_only) return;
|
||||||
if (!can_hoist(node.left, node.right, 1)) return;
|
if (!can_hoist(node.left, node.right, 1)) return;
|
||||||
descend(node, this);
|
descend(node, tt);
|
||||||
var defs = new Dictionary();
|
var defs = new Dictionary();
|
||||||
var assignments = [];
|
var assignments = [];
|
||||||
var decls = [];
|
var decls = [];
|
||||||
@@ -8185,15 +8185,20 @@ Compressor.prototype.compress = function(node) {
|
|||||||
});
|
});
|
||||||
defs.value = node.right;
|
defs.value = node.right;
|
||||||
defs_by_id[node.left.definition().id] = defs;
|
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,
|
definitions: decls,
|
||||||
}));
|
}));
|
||||||
return make_sequence(node, assignments);
|
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 (node instanceof AST_VarDef) {
|
||||||
if (!can_hoist(node.name, node.value, 0)) return;
|
if (!can_hoist(node.name, node.value, 0)) return;
|
||||||
descend(node, this);
|
descend(node, tt);
|
||||||
var defs = new Dictionary();
|
var defs = new Dictionary();
|
||||||
var var_defs = [];
|
var var_defs = [];
|
||||||
var decl = node.clone();
|
var decl = node.clone();
|
||||||
@@ -8215,7 +8220,8 @@ Compressor.prototype.compress = function(node) {
|
|||||||
defs.set(key, new_var.definition());
|
defs.set(key, new_var.definition());
|
||||||
return new_var;
|
return new_var;
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
self.transform(tt);
|
||||||
self.transform(new TreeTransformer(function(node, descend) {
|
self.transform(new TreeTransformer(function(node, descend) {
|
||||||
if (node instanceof AST_PropAccess) {
|
if (node instanceof AST_PropAccess) {
|
||||||
if (!(node.expression instanceof AST_SymbolRef)) return;
|
if (!(node.expression instanceof AST_SymbolRef)) return;
|
||||||
@@ -8245,6 +8251,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
if (def.assignments != count) return;
|
if (def.assignments != count) return;
|
||||||
if (def.references.length - def.replaced == count) return;
|
if (def.references.length - def.replaced == count) return;
|
||||||
if (def.single_use) return;
|
if (def.single_use) return;
|
||||||
|
if (self.find_variable(sym.name) !== def) return;
|
||||||
if (top_retain(def)) return;
|
if (top_retain(def)) return;
|
||||||
if (sym.fixed_value() !== right) return;
|
if (sym.fixed_value() !== right) return;
|
||||||
var fixed = sym.fixed || def.fixed;
|
var fixed = sym.fixed || def.fixed;
|
||||||
|
|||||||
@@ -1176,3 +1176,30 @@ issue_5182: {
|
|||||||
"42",
|
"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: {
|
expect: {
|
||||||
var o = 0, o_p = "PASS";
|
var o, o_p = "PASS";
|
||||||
console.log(o_p);
|
console.log(o_p);
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
|
|||||||
Reference in New Issue
Block a user