committed by
alexlamsl
parent
7f8d72d9d3
commit
dd31d12a91
@@ -546,7 +546,7 @@ merge(Compressor.prototype, {
|
|||||||
var self = compressor.self();
|
var self = compressor.self();
|
||||||
var multiple_if_returns = has_multiple_if_returns(statements);
|
var multiple_if_returns = has_multiple_if_returns(statements);
|
||||||
var in_lambda = self instanceof AST_Lambda;
|
var in_lambda = self instanceof AST_Lambda;
|
||||||
var ret = [];
|
var ret = []; // Optimized statements, build from tail to front
|
||||||
loop: for (var i = statements.length; --i >= 0;) {
|
loop: for (var i = statements.length; --i >= 0;) {
|
||||||
var stat = statements[i];
|
var stat = statements[i];
|
||||||
switch (true) {
|
switch (true) {
|
||||||
@@ -607,19 +607,21 @@ merge(Compressor.prototype, {
|
|||||||
ret = funs.concat([ stat.transform(compressor) ]);
|
ret = funs.concat([ stat.transform(compressor) ]);
|
||||||
continue loop;
|
continue loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---
|
//---
|
||||||
// XXX: what was the intention of this case?
|
// if (a) return b; if (c) return d; e; ==> return a ? b : c ? d : void e;
|
||||||
|
//
|
||||||
// if sequences is not enabled, this can lead to an endless loop (issue #866).
|
// if sequences is not enabled, this can lead to an endless loop (issue #866).
|
||||||
// however, with sequences on this helps producing slightly better output for
|
// however, with sequences on this helps producing slightly better output for
|
||||||
// the example code.
|
// the example code.
|
||||||
if (compressor.option("sequences")
|
if (compressor.option("sequences")
|
||||||
|
&& i > 0 && statements[i - 1] instanceof AST_If && statements[i - 1].body instanceof AST_Return
|
||||||
&& ret.length == 1 && in_lambda && ret[0] instanceof AST_SimpleStatement
|
&& ret.length == 1 && in_lambda && ret[0] instanceof AST_SimpleStatement
|
||||||
&& (!stat.alternative || stat.alternative instanceof AST_SimpleStatement)) {
|
&& !stat.alternative) {
|
||||||
CHANGED = true;
|
CHANGED = true;
|
||||||
ret.push(make_node(AST_Return, ret[0], {
|
ret.push(make_node(AST_Return, ret[0], {
|
||||||
value: make_node(AST_Undefined, ret[0])
|
value: make_node(AST_Undefined, ret[0])
|
||||||
}).transform(compressor));
|
}).transform(compressor));
|
||||||
ret = as_statement_array(stat.alternative).concat(ret);
|
|
||||||
ret.unshift(stat);
|
ret.unshift(stat);
|
||||||
continue loop;
|
continue loop;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,8 +170,51 @@ if_return_7: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
// suboptimal
|
function f(x){if(x)return!0;foo(),bar()}
|
||||||
function f(x){return!!x||(foo(),void bar())}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_8: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(e) {
|
||||||
|
if (2 == e) return foo();
|
||||||
|
if (3 == e) return bar();
|
||||||
|
if (4 == e) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function g(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
if (b(e)) return bar();
|
||||||
|
if (c(e)) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function h(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
else if (b(e)) return bar();
|
||||||
|
else if (c(e)) return baz();
|
||||||
|
else fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function i(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
else if (b(e)) return bar();
|
||||||
|
else if (c(e)) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(e){return 2==e?foo():3==e?bar():4==e?baz():void fail(e)}
|
||||||
|
function g(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
|
function h(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
|
function i(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,3 +248,57 @@ issue_1089: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1437: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e()
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1437_conditionals: {
|
||||||
|
options = {
|
||||||
|
conditionals : true,
|
||||||
|
if_return : true,
|
||||||
|
sequences : true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
return a() ? b() : c() ? d() : (e(), f(), void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ issue979_test_negated_is_best: {
|
|||||||
1!=a||2!=b||foo();
|
1!=a||2!=b||foo();
|
||||||
}
|
}
|
||||||
function f7() {
|
function f7() {
|
||||||
return 1!=a&&2!=b?bar():void foo();
|
if(1!=a&&2!=b)return bar();foo()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ var exec = require("child_process").exec;
|
|||||||
describe("bin/uglifyjs", function () {
|
describe("bin/uglifyjs", function () {
|
||||||
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
||||||
it("should produce a functional build when using --self", function (done) {
|
it("should produce a functional build when using --self", function (done) {
|
||||||
this.timeout(5000);
|
this.timeout(15000);
|
||||||
|
|
||||||
var command = uglifyjscmd + ' --self -cm --wrap WrappedUglifyJS';
|
var command = uglifyjscmd + ' --self -cm --wrap WrappedUglifyJS';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user