From 23f0dca992d89f5955aa1676ca2569e77315906e Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sun, 16 Aug 2020 22:54:27 +0100 Subject: [PATCH] fix corner cases in `collapse_vars` & `dead_code` (#4052) fixes #4051 --- lib/compress.js | 13 ++++++++++--- test/compress/collapse_vars.js | 19 +++++++++++++++++++ test/compress/dead-code.js | 21 +++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 6f739368..c9892ce2 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1834,7 +1834,9 @@ merge(Compressor.prototype, { if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1); if (parent instanceof AST_Switch) return find_stop_unused(parent, level + 1); if (parent instanceof AST_Unary) return find_stop_unused(parent, level + 1); - if (parent instanceof AST_VarDef) return find_stop_unused(parent, level + 1); + if (parent instanceof AST_VarDef) { + return may_throw(parent) ? node : find_stop_unused(parent, level + 1); + } return null; } @@ -7920,12 +7922,17 @@ merge(Compressor.prototype, { } } } else if (self.left instanceof AST_SymbolRef) { - if (self.operator == "=" && self.left.equivalent_to(self.right)) return self.right; + var parent; + if (self.operator == "=" && self.left.equivalent_to(self.right) + && !((parent = compressor.parent()) instanceof AST_UnaryPrefix && parent.operator == "delete")) { + return self.right; + } if (self.left.is_immutable()) return strip_assignment(); var def = self.left.definition(); var scope = def.scope.resolve(); var local = scope === compressor.find_parent(AST_Lambda); - var level = 0, node, parent = self; + var level = 0, node; + parent = self; do { node = parent; parent = compressor.parent(level++); diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 7fc4b768..aa8b89c9 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -8447,3 +8447,22 @@ issue_4047_2: { "NaN", ] } + +issue_4051: { + options = { + collapse_vars: true, + } + input: { + try { + var a = (b = b.p, "FAIL"), b = b; + } catch (e) {} + console.log(a); + } + expect: { + try { + var a = (b = b.p, "FAIL"), b = b; + } catch (e) {} + console.log(a); + } + expect_stdout: "undefined" +} diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index 4f731875..89829b65 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -1341,3 +1341,24 @@ issue_3967: { } expect_stdout: "PASS" } + +issue_4051: { + options = { + dead_code: true, + } + input: { + try { + delete (A = A); + } catch (e) { + console.log("PASS"); + } + } + expect: { + try { + delete (A = A); + } catch (e) { + console.log("PASS"); + } + } + expect_stdout: "PASS" +} -- 2.34.1