From dfd6418878495eb6ff22a83a9765478bdf0e1e17 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 14 Jan 2022 20:18:35 +0000 Subject: [PATCH] fix corner case in `inline` (#5297) fixes #5296 --- lib/compress.js | 12 ++++++---- test/compress/drop-unused.js | 15 ++++++++----- test/compress/functions.js | 43 ++++++++++++++++++++++++++++++++---- test/compress/if_return.js | 6 ++--- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 473fd38c..f754c43f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3540,8 +3540,9 @@ Compressor.prototype.compress = function(node) { changed = true; } } + var loop = in_loop && in_try && in_try.bfinally ? "try" : in_loop; for (; index >= 0; index--) { - var inlined = statements[index].try_inline(compressor, block_scope, true, in_loop); + var inlined = statements[index].try_inline(compressor, block_scope, true, loop); if (!inlined) continue; statements[index] = inlined; changed = true; @@ -13263,6 +13264,11 @@ Compressor.prototype.compress = function(node) { return this; }); def(AST_New, noop); + def(AST_Return, function(compressor, scope, no_return, in_loop) { + var value = this.value; + if (value) value = value.try_inline(compressor, scope, undefined, in_loop === "try"); + return value || this; + }); function inline_sequence(compressor, scope, no_return, in_loop, node, skip) { var body = [], exprs = node.expressions, no_ret = no_return; for (var i = exprs.length - (skip || 0), j = i; --i >= 0; no_ret = true) { @@ -13363,10 +13369,8 @@ Compressor.prototype.compress = function(node) { OPT(AST_Return, function(self, compressor) { var value = self.value; - if (!value) return self; - var inlined = value.try_inline(compressor); - if (inlined) return inlined; if (compressor.option("side_effects") + && value && is_undefined(value, compressor) && !in_async_generator(compressor.find_parent(AST_Scope))) { self.value = null; diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 36aa2a9e..27d0fe3f 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -1233,8 +1233,11 @@ issue_2105_2: { issue_2105_3: { options = { inline: true, - passes: 2, + join_vars: true, + passes: 3, reduce_vars: true, + side_effects: true, + sequences: true, unused: true, } input: { @@ -1258,12 +1261,12 @@ issue_2105_3: { }); } expect: { - !void void { + ({ prop: function() { - console.log; - void console.log("PASS"); - } - }.prop(); + console.log, + console.log("PASS"); + }, + }).prop(); } expect_stdout: "PASS" } diff --git a/test/compress/functions.js b/test/compress/functions.js index 19374b01..434c7589 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -6152,10 +6152,8 @@ issue_4265: { } expect: { function f() { - return console, function() { - console.log(a); - var a; - }(), 0; + var a; + return console, console.log(a), 0; } f(); } @@ -8046,3 +8044,40 @@ issue_5290: { } expect_stdout: "PASS" } + +issue_5296: { + options = { + inline: true, + } + input: { + var a = "PASS"; + (function() { + for (var i = 0; i < 2; i++) + try { + return function() { + while (!console); + var b = b && (a = b) || "FAIL"; + }(); + } finally { + continue; + } + })(); + console.log(a); + } + expect: { + var a = "PASS"; + (function() { + for (var i = 0; i < 2; i++) + try { + b = void 0; + while (!console); + var b = b && (a = b) || "FAIL"; + return; + } finally { + continue; + } + })(); + console.log(a); + } + expect_stdout: "PASS" +} diff --git a/test/compress/if_return.js b/test/compress/if_return.js index e19ca6fa..2d139698 100644 --- a/test/compress/if_return.js +++ b/test/compress/if_return.js @@ -595,10 +595,10 @@ issue_3600_2: { expect: { var c = 0; (function() { - if ([][c++]) { - var b = --b; + if ([][c++]) + b = --b, c = 42; - } + var b; })(); console.log(c); }