From: Alex Lam S.L Date: Sun, 7 Mar 2021 02:33:51 +0000 (+0000) Subject: fix corner case in `collapse_vars` & `reduce_vars` (#4748) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=397e48b97e18cf947c9c9eec0f66589cb92689a3;p=UglifyJS.git fix corner case in `collapse_vars` & `reduce_vars` (#4748) fixes #4747 --- diff --git a/lib/compress.js b/lib/compress.js index be586a88..0069570c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5188,6 +5188,12 @@ merge(Compressor.prototype, { fn.rest = null; } + OPT(AST_Lambda, function(self, compressor) { + drop_rest_farg(self, compressor); + self.body = tighten_body(self.body, compressor); + return self; + }); + function opt_arrow(self, compressor) { if (!compressor.option("arrows")) return self; drop_rest_farg(self, compressor); @@ -5210,12 +5216,6 @@ merge(Compressor.prototype, { OPT(AST_Arrow, opt_arrow); OPT(AST_AsyncArrow, opt_arrow); - OPT(AST_Defun, function(self, compressor) { - drop_rest_farg(self, compressor); - self.body = tighten_body(self.body, compressor); - return self; - }); - OPT(AST_Function, function(self, compressor) { drop_rest_farg(self, compressor); self.body = tighten_body(self.body, compressor); @@ -10389,7 +10389,13 @@ merge(Compressor.prototype, { } })); } else { - value = fixed.optimize(compressor); + if (fixed instanceof AST_Scope) { + compressor.push(fixed); + value = fixed.optimize(compressor); + compressor.pop(); + } else { + value = fixed.optimize(compressor); + } if (value === fixed) value = value.transform(new TreeTransformer(function(node, descend) { if (node instanceof AST_Scope) return node; node = node.clone(); diff --git a/test/compress/awaits.js b/test/compress/awaits.js index 0534d186..937fcb5a 100644 --- a/test/compress/awaits.js +++ b/test/compress/awaits.js @@ -1379,3 +1379,32 @@ issue_4738_3: { expect_stdout: "PASS" node_version: ">=8" } + +issue_4747: { + options = { + collapse_vars: true, + reduce_vars: true, + unused: true, + } + input: { + console.log(function(a) { + async function f() { + a = "PASS"; + null.p += "PASS"; + } + f(); + return a; + }("FAIL")); + } + expect: { + console.log(function(a) { + (async function() { + a = "PASS"; + null.p += "PASS"; + })(); + return a; + }("FAIL")); + } + expect_stdout: "PASS" + node_version: ">=8" +}