more sequence optimizations (lift some sequences above binary/unary expressions so that we can avoid parens)
This commit is contained in:
@@ -1380,6 +1380,10 @@ merge(Compressor.prototype, {
|
||||
});
|
||||
|
||||
OPT(AST_Seq, function(self, compressor){
|
||||
if (!compressor.option("side_effects"))
|
||||
return self;
|
||||
if (!self.car.has_side_effects())
|
||||
return self.cdr;
|
||||
if (compressor.option("cascade")) {
|
||||
if (self.car instanceof AST_Assign
|
||||
&& !self.car.left.has_side_effects()
|
||||
@@ -1395,7 +1399,26 @@ merge(Compressor.prototype, {
|
||||
return self;
|
||||
});
|
||||
|
||||
AST_Unary.DEFMETHOD("lift_sequences", function(compressor){
|
||||
if (compressor.option("sequences")) {
|
||||
if (this.expression instanceof AST_Seq) {
|
||||
var seq = this.expression;
|
||||
var x = seq.to_array();
|
||||
this.expression = x.pop();
|
||||
x.push(this);
|
||||
seq = AST_Seq.from_array(x).transform(compressor);
|
||||
return seq;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
});
|
||||
|
||||
OPT(AST_UnaryPostfix, function(self, compressor){
|
||||
return self.lift_sequences(compressor);
|
||||
});
|
||||
|
||||
OPT(AST_UnaryPrefix, function(self, compressor){
|
||||
self = self.lift_sequences(compressor);
|
||||
var e = self.expression;
|
||||
if (compressor.option("booleans") && compressor.in_boolean_context()) {
|
||||
switch (self.operator) {
|
||||
@@ -1418,7 +1441,32 @@ merge(Compressor.prototype, {
|
||||
return self.evaluate(compressor)[0];
|
||||
});
|
||||
|
||||
AST_Binary.DEFMETHOD("lift_sequences", function(compressor){
|
||||
if (compressor.option("sequences")) {
|
||||
if (this.left instanceof AST_Seq) {
|
||||
var seq = this.left;
|
||||
var x = seq.to_array();
|
||||
this.left = x.pop();
|
||||
x.push(this);
|
||||
seq = AST_Seq.from_array(x).transform(compressor);
|
||||
return seq;
|
||||
}
|
||||
if (this.right instanceof AST_Seq
|
||||
&& !(this.operator == "||" || this.operator == "&&")
|
||||
&& !this.left.has_side_effects()) {
|
||||
var seq = this.right;
|
||||
var x = seq.to_array();
|
||||
this.right = x.pop();
|
||||
x.push(this);
|
||||
seq = AST_Seq.from_array(x).transform(compressor);
|
||||
return seq;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
});
|
||||
|
||||
OPT(AST_Binary, function(self, compressor){
|
||||
self = self.lift_sequences(compressor);
|
||||
if (compressor.option("comparisons")) switch (self.operator) {
|
||||
case "===":
|
||||
case "!==":
|
||||
@@ -1557,6 +1605,7 @@ merge(Compressor.prototype, {
|
||||
|
||||
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
|
||||
OPT(AST_Assign, function(self, compressor){
|
||||
self = self.lift_sequences(compressor);
|
||||
if (self.operator == "="
|
||||
&& self.left instanceof AST_SymbolRef
|
||||
&& self.right instanceof AST_Binary
|
||||
|
||||
Reference in New Issue
Block a user