fix `delete` related issues in `collapse_vars` and `reduce_vars` (#1689)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 26 Mar 2017 11:14:30 +0000 (19:14 +0800)
committerGitHub <noreply@github.com>
Sun, 26 Mar 2017 11:14:30 +0000 (19:14 +0800)
lib/compress.js
test/compress/collapse_vars.js
test/compress/reduce_vars.js

index a617adb..83486b6 100644 (file)
@@ -1207,8 +1207,10 @@ merge(Compressor.prototype, {
         node.DEFMETHOD("is_string", func);
     });
 
+    var unary_side_effects = makePredicate("delete ++ --");
+
     function isLHS(node, parent) {
-        return parent instanceof AST_Unary && (parent.operator == "++" || parent.operator == "--")
+        return parent instanceof AST_Unary && unary_side_effects(parent.operator)
             || parent instanceof AST_Assign && parent.left === node;
     }
 
@@ -1643,9 +1645,7 @@ merge(Compressor.prototype, {
                 || this.alternative.has_side_effects(compressor);
         });
         def(AST_Unary, function(compressor){
-            return this.operator == "delete"
-                || this.operator == "++"
-                || this.operator == "--"
+            return unary_side_effects(this.operator)
                 || this.expression.has_side_effects(compressor);
         });
         def(AST_SymbolRef, function(compressor){
@@ -2196,26 +2196,19 @@ merge(Compressor.prototype, {
             return node;
         });
         def(AST_Unary, function(compressor, first_in_statement){
-            switch (this.operator) {
-              case "delete":
-              case "++":
-              case "--":
-                return this;
-              case "typeof":
-                if (this.expression instanceof AST_SymbolRef) return null;
-              default:
-                var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
-                if (first_in_statement
-                    && this instanceof AST_UnaryPrefix
-                    && is_iife_call(expression)) {
-                    if (expression === this.expression && this.operator.length === 1) return this;
-                    return make_node(AST_UnaryPrefix, this, {
-                        operator: this.operator.length === 1 ? this.operator : "!",
-                        expression: expression
-                    });
-                }
-                return expression;
+            if (unary_side_effects(this.operator)) return this;
+            if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null;
+            var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
+            if (first_in_statement
+                && this instanceof AST_UnaryPrefix
+                && is_iife_call(expression)) {
+                if (expression === this.expression && this.operator.length === 1) return this;
+                return make_node(AST_UnaryPrefix, this, {
+                    operator: this.operator.length === 1 ? this.operator : "!",
+                    expression: expression
+                });
             }
+            return expression;
         });
         def(AST_SymbolRef, function() {
             return this.undeclared() ? this : null;
@@ -2945,10 +2938,7 @@ merge(Compressor.prototype, {
                             field = "left";
                         }
                     } else if (cdr instanceof AST_Call
-                        || cdr instanceof AST_Unary
-                            && cdr.operator != "delete"
-                            && cdr.operator != "++"
-                            && cdr.operator != "--") {
+                        || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) {
                         field = "expression";
                     } else break;
                     parent = cdr;
index 2437ca5..4107707 100644 (file)
@@ -894,7 +894,8 @@ collapse_vars_unary: {
     }
     expect: {
         function f0(o, p) {
-            delete o[p];
+            var x = o[p];
+            delete x;
         }
         function f1(n) {
             return n > +!!n
index 943dd29..f4dd68d 100644 (file)
@@ -1544,3 +1544,30 @@ issue_1670_6: {
     }
     expect_stdout: "1"
 }
+
+unary_delete: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        var b = 10;
+        function f() {
+            var a;
+            if (delete a) b--;
+        }
+        f();
+        console.log(b);
+    }
+    expect: {
+        var b = 10;
+        function f() {
+            var a;
+            if (delete a) b--;
+        }
+        f();
+        console.log(b);
+    }
+    expect_stdout: true
+}