diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-12-27 07:40:34 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-27 07:40:34 +0800 |
commit | f30790b11bb9e162a19d7769ab54d8bb3f61cc27 (patch) | |
tree | 8d247107c9e87383d189aececce75b980c9e7fc4 | |
parent | 5205dbcbf4f522f8b4dc9f9f9727b621982c9f28 (diff) | |
download | tracifyjs-f30790b11bb9e162a19d7769ab54d8bb3f61cc27.tar.gz tracifyjs-f30790b11bb9e162a19d7769ab54d8bb3f61cc27.zip |
fix `dead_code` on `return` assignments (#2668)
fixes #2666
-rw-r--r-- | lib/compress.js | 22 | ||||
-rw-r--r-- | test/compress/dead-code.js | 27 |
2 files changed, 48 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js index c8cddc37..bd61b87f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4841,15 +4841,17 @@ merge(Compressor.prototype, { var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ]; OPT(AST_Assign, function(self, compressor){ + var def; if (compressor.option("dead_code") && self.left instanceof AST_SymbolRef - && self.left.definition().scope === compressor.find_parent(AST_Lambda)) { + && (def = self.left.definition()).scope === compressor.find_parent(AST_Lambda)) { var level = 0, node, parent = self; do { node = parent; parent = compressor.parent(level++); if (parent instanceof AST_Exit) { if (in_try(level, parent instanceof AST_Throw)) break; + if (is_reachable(def)) break; if (self.operator == "=") return self.right; return make_node(AST_Binary, self, { operator: self.operator.slice(0, -1), @@ -4891,6 +4893,24 @@ merge(Compressor.prototype, { } } } + + function is_reachable(def) { + var reachable = false; + var find_ref = new TreeWalker(function(node) { + if (reachable) return true; + if (node instanceof AST_SymbolRef && node.definition() === def) { + return reachable = true; + } + }); + self.right.walk(new TreeWalker(function(node) { + if (reachable) return true; + if (node instanceof AST_Scope) { + node.walk(find_ref); + return true; + } + })); + return reachable; + } }); OPT(AST_Conditional, function(self, compressor){ diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index 591dd3a9..7ea380d2 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -828,3 +828,30 @@ issue_2597: { } expect_stdout: "PASS" } + +issue_2666: { + options = { + dead_code: true, + } + input: { + function f(a) { + return a = { + p: function() { + return a; + } + }; + } + console.log(typeof f().p()); + } + expect: { + function f(a) { + return a = { + p: function() { + return a; + } + }; + } + console.log(typeof f().p()); + } + expect_stdout: "object" +} |