compress self comparisons (#2398)

This commit is contained in:
Alex Lam S.L
2017-10-26 01:16:12 +08:00
committed by GitHub
parent ae67a49850
commit ee082ace1b
3 changed files with 90 additions and 3 deletions

View File

@@ -581,7 +581,7 @@ merge(Compressor.prototype, {
if (!value && props[i].key === key) value = props[i].value;
}
}
return value instanceof AST_SymbolRef ? value.fixed_value() : value;
return value instanceof AST_SymbolRef && value.fixed_value() || value;
}
function is_modified(node, value, level, immutable) {
@@ -3824,6 +3824,11 @@ merge(Compressor.prototype, {
});
var commutativeOperators = makePredicate("== === != !== * & | ^");
function is_object(node) {
return node instanceof AST_Array
|| node instanceof AST_Lambda
|| node instanceof AST_Object;
}
OPT(AST_Binary, function(self, compressor){
function reversible() {
@@ -3859,7 +3864,8 @@ merge(Compressor.prototype, {
case "!==":
if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||
(self.left.is_number(compressor) && self.right.is_number(compressor)) ||
(self.left.is_boolean() && self.right.is_boolean())) {
(self.left.is_boolean() && self.right.is_boolean()) ||
self.left.equivalent_to(self.right)) {
self.operator = self.operator.substr(0, 2);
}
// XXX: intentionally falling down to the next case
@@ -3879,6 +3885,13 @@ merge(Compressor.prototype, {
if (self.operator.length == 2) self.operator += "=";
}
}
// obj !== obj => false
else if (self.left instanceof AST_SymbolRef
&& self.right instanceof AST_SymbolRef
&& self.left.definition() === self.right.definition()
&& is_object(self.left.fixed_value())) {
return make_node(self.operator[0] == "=" ? AST_True : AST_False, self);
}
break;
}
if (compressor.option("booleans") && self.operator == "+" && compressor.in_boolean_context()) {