improve fix for #4119 (#4121)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 17 Sep 2020 15:08:36 +0000 (16:08 +0100)
committerGitHub <noreply@github.com>
Thu, 17 Sep 2020 15:08:36 +0000 (23:08 +0800)
lib/compress.js
test/compress/evaluate.js

index f59cc4d..4c070f9 100644 (file)
@@ -3362,7 +3362,6 @@ merge(Compressor.prototype, {
             cached.forEach(function(node) {
                 delete node._eval;
             });
-            if (cached.unsafe) return this;
             if (ignore_side_effects) return val;
             if (!val || val instanceof RegExp) return val;
             if (typeof val == "function" || typeof val == "object") return this;
@@ -3429,12 +3428,8 @@ merge(Compressor.prototype, {
                 });
             }
             var value = node._eval(compressor, ignore_side_effects, cached, depth);
-            if (value === node) return this;
+            if (typeof value == "object") return this;
             modified(lhs);
-            if (Array.isArray(value)) value.toString = function() {
-                cached.unsafe = true;
-                return "[]";
-            };
             return value;
         });
         def(AST_Sequence, function(compressor, ignore_side_effects, cached, depth) {
index 5cf3fb1..9504afb 100644 (file)
@@ -2960,3 +2960,57 @@ issue_4119_2: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4119_3: {
+    options = {
+        conditionals: true,
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+        unsafe: true,
+    }
+    input: {
+        var a, b;
+        b = a = {
+            p: 42,
+        };
+        delete a.p;
+        console.log(b.p ? "FAIL" : "PASS");
+    }
+    expect: {
+        var a, b;
+        b = a = {
+            p: 42,
+        };
+        delete a.p;
+        console.log(b.p ? "FAIL" : "PASS");
+    }
+    expect_stdout: "PASS"
+}
+
+issue_4119_4: {
+    options = {
+        booleans: true,
+        conditionals: true,
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+    }
+    input: {
+        var a, b;
+        b = a = {
+            p: 42,
+        };
+        delete a.p;
+        console.log(!b ? "FAIL" : "PASS");
+    }
+    expect: {
+        var a, b;
+        b = a = {
+            p: 42,
+        };
+        delete a.p;
+        console.log((b, 0, "PASS"));
+    }
+    expect_stdout: "PASS"
+}