diff --git a/lib/compress.js b/lib/compress.js index 95dce446a2..4daf605738 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3637,9 +3637,7 @@ Compressor.prototype.compress = function(node) { var stat = statements[i]; if (stat instanceof AST_SimpleStatement) { if (seq.length >= compressor.sequences_limit) push_seq(); - var body = stat.body; - if (seq.length > 0) body = body.drop_side_effect_free(compressor); - if (body) merge_sequence(seq, body); + merge_sequence(seq, stat.body); } else if (is_declaration(stat)) { statements[n++] = stat; } else { diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 48bfc04088..b3e7bb2f89 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -3358,6 +3358,7 @@ issue_4806_1: { issue_4806_2: { options = { sequences: true, + side_effects: true, toplevel: true, unused: true, } diff --git a/test/compress/functions.js b/test/compress/functions.js index 9a23985b42..20be426df0 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -6135,6 +6135,7 @@ issue_4265: { dead_code: true, inline: true, sequences: true, + side_effects: true, } input: { function f() { diff --git a/test/compress/ie.js b/test/compress/ie.js index e346a08696..4d85fec0b8 100644 --- a/test/compress/ie.js +++ b/test/compress/ie.js @@ -2631,13 +2631,14 @@ issue_3999: { ] } -issue_4001: { +issue_4001_1: { options = { collapse_vars: true, ie: true, inline: true, reduce_vars: true, sequences: true, + side_effects: false, toplevel: true, unused: true, } @@ -2660,7 +2661,42 @@ issue_4001: { return a; } var a; - console.log((a = 42, void f()[42], void function a() {})); + console.log((a = 42, f()[42], void f, void function a() {})); + } + expect_stdout: "undefined" +} + +issue_4001_2: { + options = { + collapse_vars: true, + ie: true, + inline: true, + reduce_vars: true, + sequences: true, + side_effects: true, + toplevel: true, + unused: true, + } + input: { + console.log(function(a) { + function f() { + return a; + var b; + } + var c = f(); + (function g() { + c[42]; + f; + })(); + (function a() {}); + }(42)); + } + expect: { + function f() { + return a; + } + var a; + console.log((a = 42, void f()[42])); } expect_stdout: "undefined" } diff --git a/test/compress/issue-640.js b/test/compress/issue-640.js index b0a165f5f6..6f4438417a 100644 --- a/test/compress/issue-640.js +++ b/test/compress/issue-640.js @@ -317,7 +317,35 @@ iife: { typeof function g() {}(); } expect: { - x = 42, function a() {}(), function b() {}(), function c() {}(), - function d() {}(), function e() {}(), function f() {}(), typeof function g() {}(); + x = 42, + function a() {}(), + !function b() {}(), + ~function c() {}(), + +function d() {}(), + -function e() {}(), + void function f() {}(), + typeof function g() {}(); + } +} + +iife_drop_side_effect_free: { + options = { + expression: true, + sequences: true, + side_effects: true, + } + input: { + x = 42; + (function a() {})(); + !function b() {}(); + ~function c() {}(); + +function d() {}(); + -function e() {}(); + void function f() {}(); + typeof function g() {}(); + } + expect: { + x = 42, + typeof void 0; } } diff --git a/test/compress/merge_vars.js b/test/compress/merge_vars.js index d5a636c9e1..3d46b1f06c 100644 --- a/test/compress/merge_vars.js +++ b/test/compress/merge_vars.js @@ -253,6 +253,7 @@ read_before_assign_1: { inline: true, merge_vars: true, sequences: true, + side_effects: true, toplevel: true, } input: { diff --git a/test/compress/negate-iife.js b/test/compress/negate-iife.js index 813b9069c6..b555b053a6 100644 --- a/test/compress/negate-iife.js +++ b/test/compress/negate-iife.js @@ -122,13 +122,41 @@ negate_iife_4: { sequences: true, } input: { - (function(){ return t })() ? console.log(true) : console.log(false); - (function(){ + (function() { + return t; + })() ? console.log(true) : console.log(false); + (function() { + console.log("something"); + })(); + } + expect: { + !function() { + return t; + }() ? console.log(false) : console.log(true), !function() { + console.log("something"); + }(); + } +} + +negate_iife_4_drop_side_effect_free: { + options = { + conditionals: true, + negate_iife: true, + sequences: true, + side_effects: true, + } + input: { + (function() { + return t; + })() ? console.log(true) : console.log(false); + (function() { console.log("something"); })(); } expect: { - !function(){ return t }() ? console.log(false) : console.log(true), function(){ + !function() { + return t; + }() ? console.log(false) : console.log(true), function() { console.log("something"); }(); } @@ -176,17 +204,49 @@ negate_iife_5: { sequences: true, } input: { - if ((function(){ return t })()) { + if (function() { + return t; + }()) { foo(true); } else { bar(false); } - (function(){ + (function() { console.log("something"); })(); } expect: { - !function(){ return t }() ? bar(false) : foo(true), function(){ + !function() { + return t; + }() ? bar(false) : foo(true), !function() { + console.log("something"); + }(); + } +} + +negate_iife_5_drop_side_effect_free: { + options = { + conditionals: true, + negate_iife: true, + sequences: true, + side_effects: true, + } + input: { + if (function() { + return t; + }()) { + foo(true); + } else { + bar(false); + } + (function() { + console.log("something"); + })(); + } + expect: { + !function() { + return t; + }() ? bar(false) : foo(true), function() { console.log("something"); }(); } diff --git a/test/compress/pure_getters.js b/test/compress/pure_getters.js index e38d5f244f..d64de174b6 100644 --- a/test/compress/pure_getters.js +++ b/test/compress/pure_getters.js @@ -1289,6 +1289,7 @@ issue_2878: { collapse_vars: true, pure_getters: true, sequences: true, + side_effects: true, } input: { var c = 0; diff --git a/test/compress/sequences.js b/test/compress/sequences.js index 59e0d56375..75cfe52e96 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -289,8 +289,34 @@ iife: { typeof function g() {}(); } expect: { - x = 42, function a() {}(), function b() {}(), function c() {}(), - function d() {}(), function e() {}(), function f() {}(), function g() {}(); + x = 42, + function a() {}(), + !function b() {}(), + ~function c() {}(), + +function d() {}(), + -function e() {}(), + void function f() {}(), + typeof function g() {}(); + } +} + +iife_drop_side_effect_free: { + options = { + sequences: true, + side_effects: true, + } + input: { + x = 42; + (function a() {})(); + !function b() {}(); + ~function c() {}(); + +function d() {}(); + -function e() {}(); + void function f() {}(); + typeof function g() {}(); + } + expect: { + x = 42; } } @@ -1045,19 +1071,29 @@ call: { b.c = function() { console.log(this === b ? "bar" : "baz"); }, + a, b(), + a, b.c(), (a, b.c)(), + a, b["c"](), (a, b["c"])(), + a, function() { console.log(this === a); }(), + a, new b(), + a, new b.c(), + a, new b.c(), + a, new b["c"](), + a, new b["c"](), + a, new function() { console.log(this === a); }(), @@ -1082,6 +1118,87 @@ call: { ] } +call_drop_side_effect_free: { + options = { + sequences: true, + side_effects: true, + } + input: { + var a = function() { + return this; + }(); + function b() { + console.log("foo"); + } + b.c = function() { + console.log(this === b ? "bar" : "baz"); + }; + (a, b)(); + (a, b).c(); + (a, b.c)(); + (a, b)["c"](); + (a, b["c"])(); + (a, function() { + console.log(this === a); + })(); + new (a, b)(); + new (a, b).c(); + new (a, b.c)(); + new (a, b)["c"](); + new (a, b["c"])(); + new (a, function() { + console.log(this === a); + })(); + console.log(typeof (a, b).c); + console.log(typeof (a, b)["c"]); + } + expect: { + var a = function() { + return this; + }(); + function b() { + console.log("foo"); + } + b.c = function() { + console.log(this === b ? "bar" : "baz"); + }, + b(), + b.c(), + (0, b.c)(), + b["c"](), + (0, b["c"])(), + function() { + console.log(this === a); + }(), + new b(), + new b.c(), + new b.c(), + new b["c"](), + new b["c"](), + new function() { + console.log(this === a); + }(), + console.log(typeof b.c), + console.log(typeof b["c"]); + } + expect_stdout: [ + "foo", + "bar", + "baz", + "bar", + "baz", + "true", + "foo", + "baz", + "baz", + "baz", + "baz", + "false", + "function", + "function", + ] +} + missing_link: { options = { conditionals: true, @@ -1097,6 +1214,26 @@ missing_link: { expect: { var a = 100; a, + a++ + (0, 1), + console.log(a); + } +} + +missing_link_drop_side_effect_free: { + options = { + conditionals: true, + evaluate: true, + sequences: true, + side_effects: true, + } + input: { + var a = 100; + a; + a++ + (0 ? 2 : 1); + console.log(a); + } + expect: { + var a = 100; a++, console.log(a); }