From 9efa02afb6de5f55d98b6f0d1369788012a29c34 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 21 Sep 2022 00:56:16 +0100 Subject: [PATCH] fix corner case in `assignments` (#5671) fixes #5670 --- lib/compress.js | 23 +++++++++++++++-------- test/compress/assignments.js | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 9efab32a..7935aab6 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -11590,22 +11590,29 @@ Compressor.prototype.compress = function(node) { if (seq !== self) return seq.optimize(compressor); } if (compressor.option("assignments") && lazy_op[self.operator]) { - var assign = self.right; + var right = self.right; // a || (a = x) ---> a = a || x // a && (a = x) ---> a = a && x if (self.left instanceof AST_SymbolRef - && assign instanceof AST_Assign - && assign.operator == "=" - && self.left.equals(assign.left)) { - return make_node(AST_Assign, self, { + && right instanceof AST_Assign + && right.operator == "=" + && self.left.equals(right.left)) { + var left = right.left.clone(); + var assign = make_node(AST_Assign, self, { operator: "=", - left: assign.left, + left: left, right: make_node(AST_Binary, self, { operator: self.operator, left: self.left, - right: assign.right, + right: right.right, }), - }).optimize(compressor); + }); + left.fixed = function() { + return assign.right; + }; + left.fixed.assigns = [ assign ]; + left.definition().references.push(left); + return assign.optimize(compressor); } } if (compressor.option("comparisons")) switch (self.operator) { diff --git a/test/compress/assignments.js b/test/compress/assignments.js index 7db38674..9bd102e1 100644 --- a/test/compress/assignments.js +++ b/test/compress/assignments.js @@ -803,3 +803,23 @@ issue_4924_2: { expect_stdout: "PASS" node_version: ">=15" } + +issue_5670: { + options = { + assignments: true, + evaluate: true, + reduce_vars: true, + } + input: { + (function(a, b) { + a && a && (a = b += "") || console.log("PASS"); + })(); + } + expect: { + (function(a, b) { + a = a, + console.log("PASS"); + })(); + } + expect_stdout: "PASS" +}