fix corner case in `comparisons` (#3877)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 10 May 2020 22:33:52 +0000 (23:33 +0100)
committerGitHub <noreply@github.com>
Sun, 10 May 2020 22:33:52 +0000 (06:33 +0800)
lib/compress.js
test/compress/comparisons.js

index 4f94242..1b5d1a3 100644 (file)
@@ -6819,7 +6819,7 @@ merge(Compressor.prototype, {
             if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||
                 (self.left.is_number(compressor) && self.right.is_number(compressor)) ||
                 (self.left.is_boolean(compressor) && self.right.is_boolean(compressor)) ||
-                self.left.equivalent_to(self.right)) {
+                can_self_compare(self.left) && self.left.equivalent_to(self.right)) {
                 self.operator = self.operator.slice(0, 2);
             }
             // XXX: intentionally falling down to the next case
@@ -7342,6 +7342,13 @@ merge(Compressor.prototype, {
         }
         return try_evaluate(compressor, self);
 
+        function can_self_compare(node) {
+            if (node instanceof AST_Dot) return can_self_compare(node.expression);
+            if (node instanceof AST_Sub) return can_self_compare(node.expression) && can_self_compare(node.property);
+            if (node instanceof AST_Symbol) return true;
+            return !node.has_side_effects(compressor);
+        }
+
         function align(ref, op) {
             switch (ref) {
               case "-":
index a4e0acc..f93ccbe 100644 (file)
@@ -93,6 +93,36 @@ self_comparison_2: {
     expect_stdout: "false true"
 }
 
+self_comparison_3: {
+    options = {
+        comparisons: true,
+    }
+    input: {
+        var a;
+        function f() {
+            var b = a;
+            a = null;
+            return b;
+        }
+        for (var i = 0; i < 2; i++)
+            console.log(f() === f());
+    }
+    expect: {
+        var a;
+        function f() {
+            var b = a;
+            a = null;
+            return b;
+        }
+        for (var i = 0; i < 2; i++)
+            console.log(f() === f());
+    }
+    expect_stdout: [
+        "false",
+        "true",
+    ]
+}
+
 issue_2857_1: {
     options = {
         comparisons: true,