From 10dd9d4eaf3d28479744676e344f0df6b6bd8029 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 24 Apr 2021 05:45:18 +0100 Subject: [PATCH] enhance `collapse_vars` (#4864) --- lib/compress.js | 15 +++++++-- test/compress/collapse_vars.js | 61 ++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index f0e7ab80b4..6f102e7fae 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1856,6 +1856,7 @@ merge(Compressor.prototype, { case 0: hit = true; if (assign_used) return node; + if (node !== candidate) return node; if (node instanceof AST_VarDef) return node; def.replaced++; var parent = multi_replacer.parent(); @@ -1957,7 +1958,9 @@ merge(Compressor.prototype, { for (var i = stat_index; !abort && i < statements.length; i++) { if (!statements[i].transform(multi_replacer)) statements.splice(i--, 1); } - if (candidate instanceof AST_VarDef) { + if (candidate !== hit_stack[hit_stack.length - 1]) { + replaced = false; + } else if (candidate instanceof AST_VarDef) { replaced = !compressor.exposed(def) && def.references.length == def.replaced; } value_def.single_use = false; @@ -2546,15 +2549,23 @@ merge(Compressor.prototype, { } } - function mangleable_var(value) { + function mangleable_var(rhs) { if (force_single) { force_single = false; return; } + var value = rhs instanceof AST_Assign && rhs.operator == "=" ? rhs.left : rhs; if (!(value instanceof AST_SymbolRef)) return; var def = value.definition(); if (def.undeclared) return; if (is_arguments(def)) return; + if (value !== rhs) { + if (value.is_immutable()) return; + var referenced = def.references.length - def.replaced; + if (referenced < 2) return; + candidate = candidate.clone(); + candidate[candidate instanceof AST_Assign ? "right" : "value"] = value; + } return value_def = def; } diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index fcc47391b2..451681b67d 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -8064,6 +8064,67 @@ mangleable_var: { expect_stdout: "PASS" } +mangleable_assignment_1: { + options = { + collapse_vars: true, + unused: true, + } + input: { + var o = { + p: function() { + return 6; + }, + }; + (function() { + var a, b = a = o.p(); + console.log(a * (b / a + b)); + })(); + } + expect: { + var o = { + p: function() { + return 6; + }, + }; + (function() { + var a; + a = o.p(); + console.log(a * (a / a + a)); + })(); + } + expect_stdout: "42" +} + +mangleable_assignment_2: { + options = { + collapse_vars: true, + unused: true, + } + input: { + var o = { + p: function() { + return 6; + }, + }; + (function(a, b) { + b = a = o.p(); + console.log(a * (b / a + b)); + })(); + } + expect: { + var o = { + p: function() { + return 6; + }, + }; + (function(a, b) { + a = o.p(); + console.log(a * (a / a + a)); + })(); + } + expect_stdout: "42" +} + issue_3884_1: { options = { collapse_vars: true,