drop property assignment to constants (#2612)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 18 Dec 2017 04:07:53 +0000 (12:07 +0800)
committerGitHub <noreply@github.com>
Mon, 18 Dec 2017 04:07:53 +0000 (12:07 +0800)
lib/compress.js
test/compress/properties.js

index 52c3096..735b4d2 100644 (file)
@@ -1708,6 +1708,11 @@ merge(Compressor.prototype, {
             return this.consequent._dot_throw(compressor)
                 || this.alternative._dot_throw(compressor);
         })
+        def(AST_Dot, function(compressor) {
+            if (!is_strict(compressor)) return false;
+            if (this.expression instanceof AST_Function && this.property == "prototype") return false;
+            return true;
+        });
         def(AST_Sequence, function(compressor) {
             return this.tail_node()._dot_throw(compressor);
         });
@@ -3184,8 +3189,14 @@ merge(Compressor.prototype, {
             }
         });
         def(AST_Assign, function(compressor){
-            this.write_only = !this.left.has_side_effects(compressor);
-            return this;
+            var left = this.left;
+            if (left.has_side_effects(compressor)) return this;
+            this.write_only = true;
+            while (left instanceof AST_PropAccess) {
+                left = left.expression;
+            }
+            if (left instanceof AST_Symbol) return this;
+            return this.right.drop_side_effect_free(compressor);
         });
         def(AST_Conditional, function(compressor){
             var consequent = this.consequent.drop_side_effect_free(compressor);
index 6d4c028..16374ef 100644 (file)
@@ -1054,3 +1054,43 @@ issue_2513: {
         "undefined undefined",
     ]
 }
+
+const_prop_assign_strict: {
+    options = {
+        pure_getters: "strict",
+        side_effects: true,
+    }
+    input: {
+        function Simulator() {
+            /abc/.index = 1;
+            this._aircraft = [];
+        }
+        (function() {}).prototype.destroy = x();
+    }
+    expect: {
+        function Simulator() {
+            this._aircraft = [];
+        }
+        x();
+    }
+}
+
+const_prop_assign_pure: {
+    options = {
+        pure_getters: true,
+        side_effects: true,
+    }
+    input: {
+        function Simulator() {
+            /abc/.index = 1;
+            this._aircraft = [];
+        }
+        (function() {}).prototype.destroy = x();
+    }
+    expect: {
+        function Simulator() {
+            this._aircraft = [];
+        }
+        x();
+    }
+}