account for side-effects in `comparisons` of `null` & `undefined` (#2863)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 1 Feb 2018 11:15:17 +0000 (19:15 +0800)
committerGitHub <noreply@github.com>
Thu, 1 Feb 2018 11:15:17 +0000 (19:15 +0800)
lib/compress.js
test/compress/comparing.js

index a88ea2c..1b0aa15 100644 (file)
@@ -4800,6 +4800,7 @@ merge(Compressor.prototype, {
                 && lhs.operator == self.right.operator
                 && (is_undefined(lhs.left, compressor) && self.right.left instanceof AST_Null
                     || lhs.left instanceof AST_Null && is_undefined(self.right.left, compressor))
+                && !lhs.right.has_side_effects(compressor)
                 && lhs.right.equivalent_to(self.right.right)) {
                 var combined = make_node(AST_Binary, self, {
                     operator: lhs.operator.slice(0, -1),
index d581d08..d56445e 100644 (file)
@@ -118,24 +118,48 @@ issue_2857_1: {
         comparisons: true,
     }
     input: {
-        a === undefined || a === null;
-        a === undefined || a !== null;
-        a !== undefined || a === null;
-        a !== undefined || a !== null;
-        a === undefined && a === null;
-        a === undefined && a !== null;
-        a !== undefined && a === null;
-        a !== undefined && a !== null;
+        function f1(a) {
+            a === undefined || a === null;
+            a === undefined || a !== null;
+            a !== undefined || a === null;
+            a !== undefined || a !== null;
+            a === undefined && a === null;
+            a === undefined && a !== null;
+            a !== undefined && a === null;
+            a !== undefined && a !== null;
+        }
+        function f2(a) {
+            a === null || a === undefined;
+            a === null || a !== undefined;
+            a !== null || a === undefined;
+            a !== null || a !== undefined;
+            a === null && a === undefined;
+            a === null && a !== undefined;
+            a !== null && a === undefined;
+            a !== null && a !== undefined;
+        }
     }
     expect: {
-        null == a;
-        void 0 === a || null !== a;
-        void 0 !== a || null === a;
-        void 0 !== a || null !== a;
-        void 0 === a && null === a;
-        void 0 === a && null !== a;
-        void 0 !== a && null === a;
-        null != a;
+        function f1(a) {
+            null == a;
+            void 0 === a || null !== a;
+            void 0 !== a || null === a;
+            void 0 !== a || null !== a;
+            void 0 === a && null === a;
+            void 0 === a && null !== a;
+            void 0 !== a && null === a;
+            null != a;
+        }
+        function f2(a) {
+            null == a;
+            null === a || void 0 !== a;
+            null !== a || void 0 === a;
+            null !== a || void 0 !== a;
+            null === a && void 0 === a;
+            null === a && void 0 !== a;
+            null !== a && void 0 === a;
+            null != a;
+        }
     }
 }
 
@@ -144,24 +168,28 @@ issue_2857_2: {
         comparisons: true,
     }
     input: {
-        a === undefined || a === null || p;
-        a === undefined || a !== null || p;
-        a !== undefined || a === null || p;
-        a !== undefined || a !== null || p;
-        a === undefined && a === null || p;
-        a === undefined && a !== null || p;
-        a !== undefined && a === null || p;
-        a !== undefined && a !== null || p;
+        function f(a, p) {
+            a === undefined || a === null || p;
+            a === undefined || a !== null || p;
+            a !== undefined || a === null || p;
+            a !== undefined || a !== null || p;
+            a === undefined && a === null || p;
+            a === undefined && a !== null || p;
+            a !== undefined && a === null || p;
+            a !== undefined && a !== null || p;
+        }
     }
     expect: {
-        null == a || p;
-        void 0 === a || null !== a || p;
-        void 0 !== a || null === a || p;
-        void 0 !== a || null !== a || p;
-        void 0 === a && null === a || p;
-        void 0 === a && null !== a || p;
-        void 0 !== a && null === a || p;
-        null != a || p;
+        function f(a, p) {
+            null == a || p;
+            void 0 === a || null !== a || p;
+            void 0 !== a || null === a || p;
+            void 0 !== a || null !== a || p;
+            void 0 === a && null === a || p;
+            void 0 === a && null !== a || p;
+            void 0 !== a && null === a || p;
+            null != a || p;
+        }
     }
 }
 
@@ -170,24 +198,28 @@ issue_2857_3: {
         comparisons: true,
     }
     input: {
-        a === undefined || a === null && p;
-        a === undefined || a !== null && p;
-        a !== undefined || a === null && p;
-        a !== undefined || a !== null && p;
-        a === undefined && a === null && p;
-        a === undefined && a !== null && p;
-        a !== undefined && a === null && p;
-        a !== undefined && a !== null && p;
+        function f(a, p) {
+            a === undefined || a === null && p;
+            a === undefined || a !== null && p;
+            a !== undefined || a === null && p;
+            a !== undefined || a !== null && p;
+            a === undefined && a === null && p;
+            a === undefined && a !== null && p;
+            a !== undefined && a === null && p;
+            a !== undefined && a !== null && p;
+        }
     }
     expect: {
-        void 0 === a || null === a && p;
-        void 0 === a || null !== a && p;
-        void 0 !== a || null === a && p;
-        void 0 !== a || null !== a && p;
-        void 0 === a && null === a && p;
-        void 0 === a && null !== a && p;
-        void 0 !== a && null === a && p;
-        null != a && p;
+        function f(a, p) {
+            void 0 === a || null === a && p;
+            void 0 === a || null !== a && p;
+            void 0 !== a || null === a && p;
+            void 0 !== a || null !== a && p;
+            void 0 === a && null === a && p;
+            void 0 === a && null !== a && p;
+            void 0 !== a && null === a && p;
+            null != a && p;
+        }
     }
 }
 
@@ -196,24 +228,28 @@ issue_2857_4: {
         comparisons: true,
     }
     input: {
-        p || a === undefined || a === null;
-        p || a === undefined || a !== null;
-        p || a !== undefined || a === null;
-        p || a !== undefined || a !== null;
-        p || a === undefined && a === null;
-        p || a === undefined && a !== null;
-        p || a !== undefined && a === null;
-        p || a !== undefined && a !== null;
+        function f(a, p) {
+            p || a === undefined || a === null;
+            p || a === undefined || a !== null;
+            p || a !== undefined || a === null;
+            p || a !== undefined || a !== null;
+            p || a === undefined && a === null;
+            p || a === undefined && a !== null;
+            p || a !== undefined && a === null;
+            p || a !== undefined && a !== null;
+        }
     }
     expect: {
-        p || null == a;
-        p || void 0 === a || null !== a;
-        p || void 0 !== a || null === a;
-        p || void 0 !== a || null !== a;
-        p || void 0 === a && null === a;
-        p || void 0 === a && null !== a;
-        p || void 0 !== a && null === a;
-        p || null != a;
+        function f(a, p) {
+            p || null == a;
+            p || void 0 === a || null !== a;
+            p || void 0 !== a || null === a;
+            p || void 0 !== a || null !== a;
+            p || void 0 === a && null === a;
+            p || void 0 === a && null !== a;
+            p || void 0 !== a && null === a;
+            p || null != a;
+        }
     }
 }
 
@@ -222,23 +258,60 @@ issue_2857_5: {
         comparisons: true,
     }
     input: {
-        p && a === undefined || a === null;
-        p && a === undefined || a !== null;
-        p && a !== undefined || a === null;
-        p && a !== undefined || a !== null;
-        p && a === undefined && a === null;
-        p && a === undefined && a !== null;
-        p && a !== undefined && a === null;
-        p && a !== undefined && a !== null;
+        function f(a, p) {
+            p && a === undefined || a === null;
+            p && a === undefined || a !== null;
+            p && a !== undefined || a === null;
+            p && a !== undefined || a !== null;
+            p && a === undefined && a === null;
+            p && a === undefined && a !== null;
+            p && a !== undefined && a === null;
+            p && a !== undefined && a !== null;
+        }
+    }
+    expect: {
+        function f(a, p) {
+            p && void 0 === a || null === a;
+            p && void 0 === a || null !== a;
+            p && void 0 !== a || null === a;
+            p && void 0 !== a || null !== a;
+            p && void 0 === a && null === a;
+            p && void 0 === a && null !== a;
+            p && void 0 !== a && null === a;
+            p && null != a;
+        }
+    }
+}
+
+issue_2857_6: {
+    options = {
+        comparisons: true,
+        pure_getters: "strict",
+        reduce_vars: true,
+    }
+    input: {
+        function f(a) {
+            if (({}).b === undefined || {}.b === null)
+                return a.b !== undefined && a.b !== null;
+        }
+        console.log(f({
+            a: [ null ],
+            get b() {
+                return this.a.shift();
+            }
+        }));
     }
     expect: {
-        p && void 0 === a || null === a;
-        p && void 0 === a || null !== a;
-        p && void 0 !== a || null === a;
-        p && void 0 !== a || null !== a;
-        p && void 0 === a && null === a;
-        p && void 0 === a && null !== a;
-        p && void 0 !== a && null === a;
-        p && null != a;
+        function f(a) {
+            if (null == {}.b)
+                return void 0 !== a.b && null !== a.b;
+        }
+        console.log(f({
+            a: [ null ],
+            get b() {
+                return this.a.shift();
+            }
+        }));
     }
+    expect_stdout: "true"
 }