diff options
-rw-r--r-- | lib/compress.js | 2 | ||||
-rw-r--r-- | test/compress/functions.js | 150 |
2 files changed, 120 insertions, 32 deletions
diff --git a/lib/compress.js b/lib/compress.js index 801cbaea..45db019b 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5369,6 +5369,7 @@ merge(Compressor.prototype, { && !fn.contains_this() && can_inject_symbols()) { fn._squeezed = true; + if (exp !== fn) fn.parent_scope = exp.scope; return make_sequence(self, flatten_fn()).optimize(compressor); } if (compressor.option("side_effects") @@ -6382,6 +6383,7 @@ merge(Compressor.prototype, { } while (scope = scope.parent_scope); } } + if (single_use) fixed.parent_scope = self.scope; } if (single_use && fixed) { def.single_use = false; diff --git a/test/compress/functions.js b/test/compress/functions.js index 6c86c1c5..297dac78 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -2416,7 +2416,7 @@ issue_3297_2: { doProcessOne({ param1: param1, param2: param2, - }, function () { + }, function() { processBulk(bulk); }); }; @@ -2497,7 +2497,7 @@ issue_3297_3: { doProcessOne({ param1: param1, param2: param2, - }, function () { + }, function() { processBulk(bulk); }); }; @@ -2514,18 +2514,21 @@ issue_3297_3: { }).processBulk([1, 2, 3]); } expect: { - function function1(u) { + function function1(c) { return { - processBulk: function n(r) { - var o, t = u(); - r && 0 < r.length && (o = { - param1: r.shift(), + processBulk: function n(o) { + var r, t, u = c(); + o && 0 < o.length && (r = { + param1: o.shift(), param2: { - subparam1: t + subparam1: u } }, - console.log(JSON.stringify(o)), - n(r)); + t = function() { + n(o); + }, + console.log(JSON.stringify(r)), + t()); } }; } @@ -3097,23 +3100,20 @@ issue_3400_1: { }); } expect: { - void console.log(function() { - function g() { - function h(u) { - var o = { - p: u - }; - return console.log(o[g]), o; - } - function e() { - return [ 42 ].map(function(v) { - return h(v); - }); - } - return e(); + void console.log(function g() { + function h(u) { + var o = { + p: u + }; + return console.log(o[g]), o; } - return g; - }()()[0].p); + function e() { + return [ 42 ].map(function(v) { + return h(v); + }); + } + return e(); + }()[0].p); } expect_stdout: [ "undefined", @@ -3154,12 +3154,10 @@ issue_3400_2: { expect: { void console.log(function g() { return [ 42 ].map(function(v) { - return function(u) { - var o = { - p: u - }; - return console.log(o[g]), o; - }(v); + return o = { + p: v + }, console.log(o[g]), o; + var o; }); }()[0].p); } @@ -3401,3 +3399,91 @@ issue_3562: { } expect_stdout: "PASS" } + +hoisted_inline: { + options = { + inline: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f() { + console.log("PASS"); + } + function g() { + for (var console in [ 0 ]) + h(); + } + function h() { + f(); + } + g(); + } + expect: { + function f() { + console.log("PASS"); + } + (function() { + for (var console in [ 0 ]) + void f(); + })(); + } + expect_stdout: "PASS" +} + +hoisted_single_use: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f(a) { + for (var r in a) g(r); + } + function g(a) { + console.log(a); + } + function h(a) { + var g = a.bar; + g(); + g(); + i(a); + } + function i(b) { + f(b); + } + h({ + bar: function() { + console.log("foo"); + } + }); + } + expect: { + function f(a) { + for (var r in a) g(r); + } + function g(a) { + console.log(a); + } + (function(a) { + var g = a.bar; + g(); + g(); + (function(b) { + f(b); + })(a); + })({ + bar: function() { + console.log("foo"); + } + }); + } + expect_stdout: [ + "foo", + "foo", + "bar", + ] +} |