aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-04-24 05:45:18 +0100
committerGitHub <noreply@github.com>2021-04-24 12:45:18 +0800
commit10dd9d4eaf3d28479744676e344f0df6b6bd8029 (patch)
tree990175949b8411e2d55fba8b17f0bed1126b6a29
parent9b8deff64d957b2804082572340cdd8175eff731 (diff)
downloadtracifyjs-10dd9d4eaf3d28479744676e344f0df6b6bd8029.tar.gz
tracifyjs-10dd9d4eaf3d28479744676e344f0df6b6bd8029.zip
enhance `collapse_vars` (#4864)
-rw-r--r--lib/compress.js15
-rw-r--r--test/compress/collapse_vars.js61
2 files changed, 74 insertions, 2 deletions
diff --git a/lib/compress.js b/lib/compress.js
index f0e7ab80..6f102e7f 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 fcc47391..451681b6 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,