Skip to content

Commit

Permalink
improve literal return optimization (#1860)
Browse files Browse the repository at this point in the history
  • Loading branch information
kzc authored and alexlamsl committed May 1, 2017
1 parent 2cb55b2 commit ea92897
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 12 deletions.
31 changes: 30 additions & 1 deletion lib/compress.js
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
}
Expand Down
22 changes: 22 additions & 0 deletions test/compress/functions.js
Expand Up @@ -145,3 +145,25 @@ issue_1841_2: {
}
expect_exact: "42"
}

function_returning_constant_literal: {
options = {
reduce_vars: true,
unsafe: true,
toplevel: true,
evaluate: true,
cascade: true,
unused: true,
}
input: {
function greeter() {
return { message: 'Hello there' };
}
var greeting = greeter();
console.log(greeting.message);
}
expect: {
console.log("Hello there");
}
expect_stdout: "Hello there"
}
6 changes: 1 addition & 5 deletions test/compress/issue-1787.js
Expand Up @@ -10,10 +10,6 @@ unary_prefix: {
return x;
}());
}
expect: {
console.log(function() {
return -2 / 3;
}());
}
expect_exact: "console.log(-2/3);"
expect_stdout: true
}
8 changes: 2 additions & 6 deletions test/compress/negate-iife.js
Expand Up @@ -25,11 +25,9 @@ negate_iife_2: {
negate_iife: true
};
input: {
(function(){ return {} })().x = 10; // should not transform this one
}
expect: {
(function(){ return {} })().x = 10;
}
expect_exact: "({}).x=10;"
}

negate_iife_2_side_effects: {
Expand All @@ -38,11 +36,9 @@ negate_iife_2_side_effects: {
side_effects: true,
}
input: {
(function(){ return {} })().x = 10; // should not transform this one
}
expect: {
(function(){ return {} })().x = 10;
}
expect_exact: "({}).x=10;"
}

negate_iife_3: {
Expand Down

0 comments on commit ea92897

Please sign in to comment.