fix corner case in `pure_getters` (#4804)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 19 Mar 2021 08:16:53 +0000 (08:16 +0000)
committerGitHub <noreply@github.com>
Fri, 19 Mar 2021 08:16:53 +0000 (16:16 +0800)
fixes #4803

lib/compress.js
test/compress/pure_getters.js

index d920bc1..19806b9 100644 (file)
@@ -3601,14 +3601,7 @@ merge(Compressor.prototype, {
             return true;
         });
         def(AST_Binary, function(compressor) {
-            switch (this.operator) {
-              case "&&":
-                return this.left._dot_throw(compressor) || this.right._dot_throw(compressor);
-              case "||":
-                return this.right._dot_throw(compressor);
-              default:
-                return false;
-            }
+            return lazy_op[this.operator] && (this.left._dot_throw(compressor) || this.right._dot_throw(compressor));
         });
         def(AST_Class, return_false);
         def(AST_Conditional, function(compressor) {
index bf6f73e..d1dd07e 100644 (file)
@@ -1320,11 +1320,10 @@ issue_2878: {
 
 issue_3427: {
     options = {
-        assignments: true,
-        collapse_vars: true,
+        evaluate: true,
         inline: true,
-        passes: 2,
         pure_getters: "strict",
+        reduce_vars: true,
         sequences: true,
         side_effects: true,
         toplevel: true,
@@ -1536,3 +1535,32 @@ this_toString: {
     expect_stdout: "[object Object]"
     node_version: ">=4"
 }
+
+issue_4803: {
+    options = {
+        hoist_vars: true,
+        pure_getters: "strict",
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+    }
+    input: {
+        var o = {
+            get f() {
+                console.log("PASS");
+            },
+        } || 42;
+        for (var k in o)
+            o[k];
+    }
+    expect: {
+        var k, o = {
+            get f() {
+                console.log("PASS");
+            },
+        } || 42;
+        for (k in o)
+            o[k];
+    }
+    expect_stdout: "PASS"
+}