fix corner cases in `dead_code` & `reduce_vars` (#4213)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 13 Oct 2020 16:09:17 +0000 (17:09 +0100)
committerGitHub <noreply@github.com>
Tue, 13 Oct 2020 16:09:17 +0000 (00:09 +0800)
fixes #4212

lib/compress.js
test/compress/const.js
test/ufuzz/index.js

index e36fcaa..5dd10c6 100644 (file)
@@ -485,9 +485,10 @@ merge(Compressor.prototype, {
         }
 
         function safe_to_assign(tw, def, declare) {
-            if (def.fixed === undefined) return declare || all(def.orig, function(sym) {
+            if (!(declare || all(def.orig, function(sym) {
                 return !(sym instanceof AST_SymbolConst);
-            });
+            }))) return false;
+            if (def.fixed === undefined) return true;
             if (def.fixed === null && def.safe_ids) {
                 def.safe_ids[def.id] = false;
                 delete def.safe_ids;
@@ -8557,7 +8558,9 @@ merge(Compressor.prototype, {
                         ]).optimize(compressor);
                     }
                 }
-            } else if (self.left instanceof AST_SymbolRef) {
+            } else if (self.left instanceof AST_SymbolRef && all(self.left.definition().orig, function(sym) {
+                return !(sym instanceof AST_SymbolConst);
+            })) {
                 var parent;
                 if (self.operator == "=" && self.left.equivalent_to(self.right)
                     && !((parent = compressor.parent()) instanceof AST_UnaryPrefix && parent.operator == "delete")) {
index b161e87..4411cbf 100644 (file)
@@ -963,3 +963,49 @@ issue_4210: {
     }
     expect_stdout: true
 }
+
+issue_4212_1: {
+    options = {
+        dead_code: true,
+    }
+    input: {
+        console.log({
+            get b() {
+                const a = 0;
+                return a /= 0;
+            }
+        }.b);
+    }
+    expect: {
+        console.log({
+            get b() {
+                const a = 0;
+                return a /= 0;
+            }
+        }.b);
+    }
+    expect_stdout: true
+}
+
+issue_4212_2: {
+    options = {
+        reduce_vars: true,
+    }
+    input: {
+        console.log({
+            get b() {
+                const a = 0;
+                return a /= 0;
+            }
+        }.b);
+    }
+    expect: {
+        console.log({
+            get b() {
+                const a = 0;
+                return a /= 0;
+            }
+        }.b);
+    }
+    expect_stdout: true
+}
index 3e2d865..e650a46 100644 (file)
@@ -899,21 +899,22 @@ function getDotKey(assign) {
 function createAccessor(recurmax, stmtDepth, canThrow) {
     var namesLenBefore = VAR_NAMES.length;
     var s;
-    var prop1 = getDotKey();
-    if (rng(2) == 0) {
-        s = [
-            "get " + prop1 + "(){",
-            strictMode(),
-            createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
-            createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC),
-            "},"
-        ];
-    } else {
-        var prop2;
-        do {
-            prop2 = getDotKey();
-        } while (prop1 == prop2);
-        createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
+    createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
+        var prop1 = getDotKey();
+        if (rng(2) == 0) {
+            s = [
+                "get " + prop1 + "(){",
+                strictMode(),
+                defns(),
+                _createStatements(2, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
+                createStatement(recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth, STMT_RETURN_ETC),
+                "},"
+            ];
+        } else {
+            var prop2;
+            do {
+                prop2 = getDotKey();
+            } while (prop1 == prop2);
             s = [
                 "set " + prop1 + "(" + createVarName(MANDATORY) + "){",
                 strictMode(),
@@ -922,8 +923,8 @@ function createAccessor(recurmax, stmtDepth, canThrow) {
                 "this." + prop2 + createAssignment() + _createBinaryExpr(recurmax, COMMA_OK, stmtDepth, canThrow) + ";",
                 "},"
             ];
-        });
-    }
+        }
+    });
     VAR_NAMES.length = namesLenBefore;
     return filterDirective(s).join("\n");
 }