improve literal return optimization (#1860)
This commit is contained in:
@@ -1780,6 +1780,35 @@ merge(Compressor.prototype, {
|
||||
node.DEFMETHOD("has_side_effects", func);
|
||||
});
|
||||
|
||||
// determine if expression is constant
|
||||
(function(def){
|
||||
function all(list) {
|
||||
for (var i = list.length; --i >= 0;)
|
||||
if (!list[i].is_constant_expression())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
def(AST_Node, return_false);
|
||||
def(AST_Constant, return_true);
|
||||
def(AST_Unary, function(){
|
||||
return this.expression.is_constant_expression();
|
||||
});
|
||||
def(AST_Binary, function(){
|
||||
return this.left.is_constant_expression() && this.right.is_constant_expression();
|
||||
});
|
||||
def(AST_Array, function(){
|
||||
return all(this.elements);
|
||||
});
|
||||
def(AST_Object, function(){
|
||||
return all(this.properties);
|
||||
});
|
||||
def(AST_ObjectProperty, function(){
|
||||
return this.value.is_constant_expression();
|
||||
});
|
||||
})(function(node, func){
|
||||
node.DEFMETHOD("is_constant_expression", func);
|
||||
});
|
||||
|
||||
// tell me if a statement aborts
|
||||
function aborts(thing) {
|
||||
return thing && thing.aborts();
|
||||
@@ -3004,7 +3033,7 @@ merge(Compressor.prototype, {
|
||||
if (exp instanceof AST_Function) {
|
||||
if (exp.body[0] instanceof AST_Return) {
|
||||
var value = exp.body[0].value;
|
||||
if (!value || value.is_constant()) {
|
||||
if (!value || value.is_constant_expression()) {
|
||||
var args = self.args.concat(value || make_node(AST_Undefined, self));
|
||||
return make_sequence(self, args).transform(compressor);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user