From 8d0422b6f33d05bdc634c75eabd8f5eaba81d148 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 31 Dec 2021 23:53:47 +0000 Subject: [PATCH] enhance `reduce_vars` (#5248) --- lib/compress.js | 19 ++++++++++--------- test/compress/evaluate.js | 3 +-- test/compress/merge_vars.js | 4 ++-- test/compress/reduce_vars.js | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index c54a8f3a..ab930ffa 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -492,7 +492,6 @@ Compressor.prototype.compress = function(node) { def.reassigned = 0; def.recursive_refs = 0; def.references = []; - def.should_replace = undefined; def.single_use = undefined; } @@ -11599,8 +11598,8 @@ Compressor.prototype.compress = function(node) { def.replaced++; return value; } - var local = self.fixed !== def.fixed; - if (fixed && (local || def.should_replace !== false)) { + var state; + if (fixed && (state = self.fixed || def.fixed).should_replace !== false) { var ev, init; if (fixed instanceof AST_This) { if (!is_funarg(def) && same_scope(def)) init = fixed; @@ -11613,20 +11612,22 @@ Compressor.prototype.compress = function(node) { init = make_node_from_constant(ev, fixed); } if (init) { - if (!local && def.should_replace === undefined) { + if (state.should_replace === undefined) { var value_length = init.optimize(compressor).print_to_string().length; if (!has_symbol_ref(fixed)) { value_length = Math.min(value_length, fixed.print_to_string().length); } var name_length = def.name.length; if (compressor.option("unused") && !compressor.exposed(def)) { - var referenced = def.references.length - def.replaced; - name_length += (name_length + 2 + value_length) / (referenced - def.assignments); + var refs = def.references.length - def.replaced - def.assignments; + refs = Math.min(refs, def.references.filter(function(ref) { + return ref.fixed === state; + }).length); + name_length += (name_length + 2 + value_length) / Math.max(1, refs); } - var delta = value_length - Math.floor(name_length); - def.should_replace = delta < compressor.eval_threshold; + state.should_replace = value_length - Math.floor(name_length) < compressor.eval_threshold; } - if (local || def.should_replace) { + if (state.should_replace) { var value; if (has_symbol_ref(fixed)) { value = init.optimize(compressor); diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index c479a534..acd218ed 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -2752,8 +2752,7 @@ issue_3944: { } expect: { void function f() { - while (a = 0 == (a = void 0), console.log(a), void 0); - var a; + while (0 == void 0, console.log(false), void 0); f; }(); } diff --git a/test/compress/merge_vars.js b/test/compress/merge_vars.js index 9f89efe5..a0ece252 100644 --- a/test/compress/merge_vars.js +++ b/test/compress/merge_vars.js @@ -3228,10 +3228,10 @@ issue_4653: { f(a++ + (b = b), b |= console.log(a)); } expect: { - var b = 1; + var b, a = 1; (function(c, d) { c || console.log(d); - })(+b + (b = void 0), b |= console.log(2)); + })(+a + (b = b), b |= console.log(2)); } expect_stdout: [ "2", diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 7a150afa..0e232eee 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -905,7 +905,7 @@ use_before_var: { } expect: { function f(){ - console.log(void 0); + console.log(t); var t = 1; } } @@ -981,7 +981,7 @@ inner_var_for_1: { expect: { function f() { var a = 1; - x(1, void 0, d); + x(1, b, d); for (var b = 2, c = 3; x(1, 2, 3, d); x(1, 2, 3, d)) { var d = 4, e = 5; x(1, 2, 3, d, e);