fix corner case in `evaluate` (#4272)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 10 Nov 2020 16:06:13 +0000 (16:06 +0000)
committerGitHub <noreply@github.com>
Tue, 10 Nov 2020 16:06:13 +0000 (00:06 +0800)
fixes #4271

lib/compress.js
test/compress/evaluate.js

index ef775b9..f44552a 100644 (file)
@@ -3592,10 +3592,7 @@ merge(Compressor.prototype, {
                         key = key._eval(compressor, ignore_side_effects, cached, depth);
                         if (key === prop.key) return this;
                     }
-                    if (prop.value instanceof AST_Function) {
-                        if (typeof Object.prototype[key] == "function") return this;
-                        continue;
-                    }
+                    if (prop.value instanceof AST_Function && typeof Object.prototype[key] == "function") return this;
                     val[key] = prop.value._eval(compressor, ignore_side_effects, cached, depth);
                     if (val[key] === prop.value) return this;
                 }
index 9fa6520..46a92ee 100644 (file)
@@ -3047,3 +3047,30 @@ issue_4214: {
     }
     expect_stdout: "NaN"
 }
+
+issue_4271: {
+    options = {
+        evaluate: true,
+        unsafe: true,
+    }
+    input: {
+        ({
+            p: null,
+            q: (console.log("foo"), 42),
+            p: function() {}
+        })[console.log("bar"), "p"] && console.log("PASS");
+    }
+    expect: {
+        ({
+            p: null,
+            q: (console.log("foo"), 42),
+            p: function() {}
+        })[console.log("bar"), "p"],
+        console.log("PASS");
+    }
+    expect_stdout: [
+        "foo",
+        "bar",
+        "PASS",
+    ]
+}