diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2020-01-30 00:08:53 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-30 00:08:53 +0800 |
commit | a3754068dde7a51ab41b59a6d8a17a3a8c022564 (patch) | |
tree | bbf713958d95e4e5d558f7173959f0dfce7fb48f | |
parent | 2ba5f391e008b5d842571094d1140f9ae888ea4d (diff) | |
download | tracifyjs-a3754068dde7a51ab41b59a6d8a17a3a8c022564.tar.gz tracifyjs-a3754068dde7a51ab41b59a6d8a17a3a8c022564.zip |
fix corner case in `collapse_vars` (#3699)
fixes #3698
-rw-r--r-- | lib/compress.js | 14 | ||||
-rw-r--r-- | test/compress/collapse_vars.js | 76 |
2 files changed, 83 insertions, 7 deletions
diff --git a/lib/compress.js b/lib/compress.js index 85ad449e..e6a064dd 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1094,6 +1094,7 @@ merge(Compressor.prototype, { collapse(statements, compressor); } } while (CHANGED && max_iter-- > 0); + return statements; function find_loop_scope_try() { var node = compressor.self(), level = 0; @@ -1150,11 +1151,10 @@ merge(Compressor.prototype, { if (node.single_use && parent instanceof AST_VarDef && parent.value === node) return node; // Replace variable with assignment when found var hit_rhs; - if (can_replace - && !(node instanceof AST_SymbolDeclaration) + if (!(node instanceof AST_SymbolDeclaration) && (scan_lhs && lhs.equivalent_to(node) || scan_rhs && (hit_rhs = scan_rhs(node, this)))) { - if (stop_if_hit && (hit_rhs || !lhs_local || !replace_all)) { + if (!can_replace || stop_if_hit && (hit_rhs || !lhs_local || !replace_all)) { if (!hit_rhs || !value_def) abort = true; return node; } @@ -3854,12 +3854,12 @@ merge(Compressor.prototype, { }); OPT(AST_Block, function(self, compressor) { - tighten_body(self.body, compressor); + self.body = tighten_body(self.body, compressor); return self; }); OPT(AST_BlockStatement, function(self, compressor) { - tighten_body(self.body, compressor); + self.body = tighten_body(self.body, compressor); switch (self.body.length) { case 1: return self.body[0]; case 0: return make_node(AST_EmptyStatement, self); @@ -3868,7 +3868,7 @@ merge(Compressor.prototype, { }); OPT(AST_Lambda, function(self, compressor) { - tighten_body(self.body, compressor); + self.body = tighten_body(self.body, compressor); if (compressor.option("side_effects") && self.body.length == 1 && self.body[0] === compressor.has_directive("use strict")) { @@ -5372,7 +5372,7 @@ merge(Compressor.prototype, { }); OPT(AST_Try, function(self, compressor) { - tighten_body(self.body, compressor); + self.body = tighten_body(self.body, compressor); if (self.bcatch && self.bfinally && all(self.bfinally.body, is_empty)) self.bfinally = null; if (compressor.option("dead_code") && all(self.body, is_empty)) { var body = []; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 4cd59a4c..f109e93e 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -7658,3 +7658,79 @@ call_3_symbol: { } expect_stdout: "function" } + +issue_3698_1: { + options = { + collapse_vars: true, + } + input: { + var log = console.log; + var a, b = 0, c = 0; + (function() { + a = b; + })(b++, (b++, c++)); + log(a, b, c); + } + expect: { + var log = console.log; + var a, b = 0, c = 0; + (function() { + a = b; + })(b++, (b++, c++)); + log(a, b, c); + } + expect_stdout: "2 2 1" +} + +issue_3698_2: { + options = { + collapse_vars: true, + reduce_vars: true, + } + input: { + var log = console.log; + var a, b = 0, c = 0, d = 1; + (function f() { + a = b; + d-- && f(); + })(b++, (b++, c++)); + log(a, b, c, d); + } + expect: { + var log = console.log; + var a, b = 0, c = 0, d = 1; + (function f() { + a = b; + d-- && f(); + })(b++, (b++, c++)); + log(a, b, c, d); + } + expect_stdout: "2 2 1 -1" +} + +issue_3698_3: { + options = { + collapse_vars: true, + reduce_vars: true, + } + input: { + var a = 0, b = 0; + (function f(c) { + { + b++; + var bar_1 = (b = 1 + b, c = 0); + a-- && f(); + } + })(); + console.log(b); + } + expect: { + var a = 0, b = 0; + (function f(c) { + var bar_1 = (b = 1 + ++b, c = 0); + a-- && f(); + })(); + console.log(b); + } + expect_stdout: "2" +} |