enhance dead_code (#3990)

This commit is contained in:
Alex Lam S.L
2020-06-11 19:16:13 +01:00
committed by GitHub
parent e89031f1af
commit e9465717ab
2 changed files with 152 additions and 17 deletions

View File

@@ -571,7 +571,14 @@ merge(Compressor.prototype, {
});
def(AST_Assign, function(tw, descend, compressor) {
var node = this;
var eq = node.operator == "=";
var sym = node.left;
if (eq && sym.equivalent_to(node.right) && !sym.has_side_effects(compressor)) {
node.right.walk(tw);
walk_prop(sym);
node.__drop = true;
return true;
}
if (!(sym instanceof AST_SymbolRef)) {
mark_assignment_to_arguments(sym);
return;
@@ -579,7 +586,6 @@ merge(Compressor.prototype, {
var d = sym.definition();
d.assignments++;
var fixed = d.fixed;
var eq = node.operator == "=";
var value = eq ? node.right : node;
if (is_modified(compressor, tw, node, value, 0)) return;
var safe = eq || safe_to_read(tw, d);
@@ -609,6 +615,21 @@ merge(Compressor.prototype, {
d.fixed = false;
}
return true;
function walk_prop(node) {
if (node instanceof AST_Dot) {
walk_prop(node.expression);
} else if (node instanceof AST_Sub) {
walk_prop(node.expression);
node.property.walk(tw);
} else if (node instanceof AST_SymbolRef) {
var d = node.definition();
push_ref(d, node);
node.fixed = d.fixed;
} else {
node.walk(tw);
}
}
});
def(AST_Binary, function(tw) {
if (!lazy_op[this.operator]) return;
@@ -7843,8 +7864,15 @@ merge(Compressor.prototype, {
if (compressor.option("dead_code")) {
if (self.left instanceof AST_PropAccess) {
if (self.operator == "=") {
if (self.left.equivalent_to(self.right)
&& (self.left instanceof AST_Dot || !self.left.property.has_side_effects(compressor))) {
if (self.__drop) {
var props = [];
flatten(self.left, props);
flatten(self.right, props);
return props.length == 0 ? make_node(AST_Number, self, {
value: 0
}) : make_sequence(self, props).optimize(compressor);
}
if (self.left.equivalent_to(self.right) && !self.left.has_side_effects(compressor)) {
return self.right;
}
var exp = self.left.expression;
@@ -7934,6 +7962,11 @@ merge(Compressor.prototype, {
}
return try_evaluate(compressor, self);
function flatten(node, props) {
if (!(node.expression instanceof AST_SymbolRef)) props.push(node.expression);
if (node instanceof AST_Sub) props.push(node.property);
}
function in_try(level, node) {
var right = self.right;
self.right = make_node(AST_Null, right);