optimize trivial IIFEs returning constants (#1530)

This commit is contained in:
kzc
2017-03-02 02:11:40 -05:00
committed by Alex Lam S.L
parent 9699ffb1af
commit ee3b39b909
5 changed files with 91 additions and 17 deletions

View File

@@ -2690,6 +2690,12 @@ merge(Compressor.prototype, {
} }
} }
} }
if (self.args.length == 0
&& self.expression instanceof AST_Function
&& self.expression.body[0] instanceof AST_Return
&& self.expression.body[0].value.is_constant()) {
return self.expression.body[0].value;
}
if (compressor.option("negate_iife") if (compressor.option("negate_iife")
&& compressor.parent() instanceof AST_SimpleStatement && compressor.parent() instanceof AST_SimpleStatement
&& is_iife_call(self)) { && is_iife_call(self)) {

View File

@@ -1141,7 +1141,7 @@ collapse_vars_constants: {
function f3(x) { function f3(x) {
var b = x.prop; var b = x.prop;
sideeffect1(); sideeffect1();
return b + (function() { return -9; })(); return b + -9;
} }
} }
} }

View File

@@ -6,3 +6,71 @@ non_ascii_function_identifier_name: {
} }
expect_exact: "function fooλ(δλ){}function λ(δλ){}(function λ(δλ){})();" expect_exact: "function fooλ(δλ){}function λ(δλ){}(function λ(δλ){})();"
} }
iifes_returning_constants_keep_fargs_true: {
options = {
keep_fargs : true,
side_effects : true,
evaluate : true,
unused : true,
dead_code : true,
conditionals : true,
comparisons : true,
booleans : true,
if_return : true,
join_vars : true,
reduce_vars : true,
cascade : true,
}
input: {
(function(){ return -1.23; }());
console.log( function foo(){ return "okay"; }() );
console.log( function foo(x, y, z){ return 123; }() );
console.log( function(x, y, z){ return z; }() );
console.log( function(x, y, z){ if (x) return y; return z; }(1, 2, 3) );
console.log( function(x, y){ return x * y; }(2, 3) );
console.log( function(x, y){ return x * y; }(2, 3, a(), b()) );
}
expect: {
console.log("okay");
console.log(123);
console.log(void 0);
console.log(function(x,y,z){return 2}(1,2,3));
console.log(function(x,y){return 6}(2,3));
console.log(function(x, y){return 6}(2,3,a(),b()));
}
}
iifes_returning_constants_keep_fargs_false: {
options = {
keep_fargs : false,
side_effects : true,
evaluate : true,
unused : true,
dead_code : true,
conditionals : true,
comparisons : true,
booleans : true,
if_return : true,
join_vars : true,
reduce_vars : true,
cascade : true,
}
input: {
(function(){ return -1.23; }());
console.log( function foo(){ return "okay"; }() );
console.log( function foo(x, y, z){ return 123; }() );
console.log( function(x, y, z){ return z; }() );
console.log( function(x, y, z){ if (x) return y; return z; }(1, 2, 3) );
console.log( function(x, y){ return x * y; }(2, 3) );
console.log( function(x, y){ return x * y; }(2, 3, a(), b()) );
}
expect: {
console.log("okay");
console.log(123);
console.log(void 0);
console.log(2);
console.log(6);
console.log(function(){return 6}(a(),b()));
}
}

View File

@@ -38,10 +38,10 @@ negate_iife_3: {
conditionals: true conditionals: true
}; };
input: { input: {
(function(){ return true })() ? console.log(true) : console.log(false); (function(){ return t })() ? console.log(true) : console.log(false);
} }
expect: { expect: {
!function(){ return true }() ? console.log(false) : console.log(true); !function(){ return t }() ? console.log(false) : console.log(true);
} }
} }
@@ -51,10 +51,10 @@ negate_iife_3_off: {
conditionals: true, conditionals: true,
}; };
input: { input: {
(function(){ return true })() ? console.log(true) : console.log(false); (function(){ return t })() ? console.log(true) : console.log(false);
} }
expect: { expect: {
!function(){ return true }() ? console.log(false) : console.log(true); !function(){ return t }() ? console.log(false) : console.log(true);
} }
} }
@@ -65,13 +65,13 @@ negate_iife_4: {
sequences: true sequences: true
}; };
input: { input: {
(function(){ return true })() ? console.log(true) : console.log(false); (function(){ return t })() ? console.log(true) : console.log(false);
(function(){ (function(){
console.log("something"); console.log("something");
})(); })();
} }
expect: { expect: {
!function(){ return true }() ? console.log(false) : console.log(true), function(){ !function(){ return t }() ? console.log(false) : console.log(true), function(){
console.log("something"); console.log("something");
}(); }();
} }
@@ -86,7 +86,7 @@ sequence_off: {
}; };
input: { input: {
function f() { function f() {
(function(){ return true })() ? console.log(true) : console.log(false); (function(){ return t })() ? console.log(true) : console.log(false);
(function(){ (function(){
console.log("something"); console.log("something");
})(); })();
@@ -95,19 +95,19 @@ sequence_off: {
(function(){ (function(){
console.log("something"); console.log("something");
})(); })();
(function(){ return true })() ? console.log(true) : console.log(false); (function(){ return t })() ? console.log(true) : console.log(false);
} }
} }
expect: { expect: {
function f() { function f() {
!function(){ return true }() ? console.log(false) : console.log(true), function(){ !function(){ return t }() ? console.log(false) : console.log(true), function(){
console.log("something"); console.log("something");
}(); }();
} }
function g() { function g() {
(function(){ (function(){
console.log("something"); console.log("something");
})(), function(){ return true }() ? console.log(true) : console.log(false); })(), function(){ return t }() ? console.log(true) : console.log(false);
} }
} }
} }
@@ -119,7 +119,7 @@ negate_iife_5: {
conditionals: true, conditionals: true,
}; };
input: { input: {
if ((function(){ return true })()) { if ((function(){ return t })()) {
foo(true); foo(true);
} else { } else {
bar(false); bar(false);
@@ -129,7 +129,7 @@ negate_iife_5: {
})(); })();
} }
expect: { expect: {
!function(){ return true }() ? bar(false) : foo(true), function(){ !function(){ return t }() ? bar(false) : foo(true), function(){
console.log("something"); console.log("something");
}(); }();
} }
@@ -142,7 +142,7 @@ negate_iife_5_off: {
conditionals: true, conditionals: true,
}; };
input: { input: {
if ((function(){ return true })()) { if ((function(){ return t })()) {
foo(true); foo(true);
} else { } else {
bar(false); bar(false);
@@ -152,7 +152,7 @@ negate_iife_5_off: {
})(); })();
} }
expect: { expect: {
!function(){ return true }() ? bar(false) : foo(true), function(){ !function(){ return t }() ? bar(false) : foo(true), function(){
console.log("something"); console.log("something");
}(); }();
} }

View File

@@ -155,7 +155,7 @@ describe("minify", function() {
assert.strictEqual(code, "// comment1 comment2\nbar();"); assert.strictEqual(code, "// comment1 comment2\nbar();");
}); });
it("should not drop #__PURE__ hint if function is retained", function() { it("should not drop #__PURE__ hint if function is retained", function() {
var result = Uglify.minify("var a = /*#__PURE__*/(function(){return 1})();", { var result = Uglify.minify("var a = /*#__PURE__*/(function(){ foo(); })();", {
fromString: true, fromString: true,
output: { output: {
comments: "all", comments: "all",
@@ -163,7 +163,7 @@ describe("minify", function() {
} }
}); });
var code = result.code; var code = result.code;
assert.strictEqual(code, "var a=/*#__PURE__*/function(){return 1}();"); assert.strictEqual(code, "var a=/*#__PURE__*/function(){foo()}();");
}) })
}); });