don't change order in binary expressions if both operands have side effects

This commit is contained in:
Mihai Bazon
2012-11-13 14:32:07 +02:00
parent a9fa178f86
commit e02771a5f2

View File

@@ -554,12 +554,24 @@ merge(Compressor.prototype, {
def(AST_UnaryPrefix, function(){ def(AST_UnaryPrefix, function(){
return this.operator == "typeof"; return this.operator == "typeof";
}); });
def(AST_Binary, function(){ def(AST_Binary, function(compressor){
return this.operator == "+" && return this.operator == "+" &&
(this.left.is_string() || this.right.is_string()); (this.left.is_string(compressor) || this.right.is_string(compressor));
}); });
def(AST_Assign, function(){ def(AST_Assign, function(compressor){
return this.operator == "=" && this.right.is_string(); return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor);
});
def(AST_Seq, function(compressor){
return this.cdr.is_string(compressor);
});
def(AST_Conditional, function(compressor){
return this.consequent.is_string(compressor) && this.alternative.is_string(compressor);
});
def(AST_Call, function(compressor){
return compressor.option("unsafe")
&& this.expression instanceof AST_SymbolRef
&& this.expression.name == "String"
&& this.expression.undeclared();
}); });
})(function(node, func){ })(function(node, func){
node.DEFMETHOD("is_string", func); node.DEFMETHOD("is_string", func);
@@ -1549,10 +1561,12 @@ merge(Compressor.prototype, {
OPT(AST_Binary, function(self, compressor){ OPT(AST_Binary, function(self, compressor){
function reverse(op) { function reverse(op) {
if (op) self.operator = op; if (!(self.left.has_side_effects() && self.right.has_side_effects())) {
var tmp = self.left; if (op) self.operator = op;
self.left = self.right; var tmp = self.left;
self.right = tmp; self.left = self.right;
self.right = tmp;
}
}; };
if (commutativeOperators(self.operator)) { if (commutativeOperators(self.operator)) {
if (self.right instanceof AST_Constant if (self.right instanceof AST_Constant
@@ -1564,7 +1578,7 @@ merge(Compressor.prototype, {
if (compressor.option("comparisons")) switch (self.operator) { if (compressor.option("comparisons")) switch (self.operator) {
case "===": case "===":
case "!==": case "!==":
if ((self.left.is_string() && self.right.is_string()) || if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||
(self.left.is_boolean() && self.right.is_boolean())) { (self.left.is_boolean() && self.right.is_boolean())) {
self.operator = self.operator.substr(0, 2); self.operator = self.operator.substr(0, 2);
} }