fix corner case in `evaluate` (#4036)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 4 Aug 2020 12:05:10 +0000 (20:05 +0800)
committerGitHub <noreply@github.com>
Tue, 4 Aug 2020 12:05:10 +0000 (20:05 +0800)
fixes #4035

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

index fbc2bf7..650a763 100644 (file)
@@ -7436,56 +7436,58 @@ merge(Compressor.prototype, {
                 }
                 break;
             }
-            if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
-              // 0 + n => n
-              case "+":
-                if (self.left.value == 0) {
-                    if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
-                        operator: "+",
-                        expression: self.right
-                    }).optimize(compressor);
-                    if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
-                }
-                break;
-              // 1 * n => n
-              case "*":
-                if (self.left.value == 1) {
-                    return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, {
-                        operator: "+",
-                        expression: self.right
-                    }).optimize(compressor);
-                }
-                break;
-            }
-            if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
-              // n + 0 => n
-              case "+":
-                if (self.right.value == 0) {
-                    if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
-                        operator: "+",
-                        expression: self.left
-                    }).optimize(compressor);
-                    if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
-                }
-                break;
-              // n - 0 => n
-              case "-":
-                if (self.right.value == 0) {
-                    return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
-                        operator: "+",
-                        expression: self.left
-                    }).optimize(compressor);
+            if (!(parent instanceof AST_UnaryPrefix && parent.operator == "delete")) {
+                if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
+                  // 0 + n => n
+                  case "+":
+                    if (self.left.value == 0) {
+                        if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
+                            operator: "+",
+                            expression: self.right
+                        }).optimize(compressor);
+                        if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
+                    }
+                    break;
+                  // 1 * n => n
+                  case "*":
+                    if (self.left.value == 1) {
+                        return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, {
+                            operator: "+",
+                            expression: self.right
+                        }).optimize(compressor);
+                    }
+                    break;
                 }
-                break;
-              // n / 1 => n
-              case "/":
-                if (self.right.value == 1) {
-                    return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
-                        operator: "+",
-                        expression: self.left
-                    }).optimize(compressor);
+                if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
+                  // n + 0 => n
+                  case "+":
+                    if (self.right.value == 0) {
+                        if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
+                            operator: "+",
+                            expression: self.left
+                        }).optimize(compressor);
+                        if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
+                    }
+                    break;
+                  // n - 0 => n
+                  case "-":
+                    if (self.right.value == 0) {
+                        return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
+                            operator: "+",
+                            expression: self.left
+                        }).optimize(compressor);
+                    }
+                    break;
+                  // n / 1 => n
+                  case "/":
+                    if (self.right.value == 1) {
+                        return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
+                            operator: "+",
+                            expression: self.left
+                        }).optimize(compressor);
+                    }
+                    break;
                 }
-                break;
             }
         }
         if (compressor.option("typeofs")) switch (self.operator) {
index dd94f61..b5b74ac 100644 (file)
@@ -2833,3 +2833,39 @@ issue_3997: {
     }
     expect_stdout: "string"
 }
+
+issue_4035: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+    }
+    input: {
+        var a = 0;
+        (function() {
+            var b = --a;
+            console.log(delete (0 + b));
+            console.log(delete (1 * b));
+            console.log(delete (b + 0));
+            console.log(delete (b - 0));
+            console.log(delete (b / 1));
+        })();
+    }
+    expect: {
+        var a = 0;
+        (function() {
+            var b = --a;
+            console.log((0 + b, true));
+            console.log((1 * b, true));
+            console.log((0 + b, true));
+            console.log((b - 0, true));
+            console.log((b / 1, true));
+        })();
+    }
+    expect_stdout: [
+        "true",
+        "true",
+        "true",
+        "true",
+        "true",
+    ]
+}