it's not safe to assume that property access is side-effect-free
authorMihai Bazon <mihai@bazon.net>
Tue, 25 Sep 2012 07:32:14 +0000 (10:32 +0300)
committerMihai Bazon <mihai@bazon.net>
Tue, 25 Sep 2012 07:32:14 +0000 (10:32 +0300)
(getters/setters + various browser bugs will trigger side effects; also, an
exception is thrown when the expression is undefined)

lib/compress.js

index c6524e0..e7c01ac 100644 (file)
@@ -732,12 +732,15 @@ function Compressor(options, false_by_default) {
                     return true;
             return false;
         });
-        def(AST_Dot, function(){
-            return this.expression.has_side_effects();
-        });
-        def(AST_Sub, function(){
-            return this.expression.has_side_effects()
-                || this.property.has_side_effects();
+        // def(AST_Dot, function(){
+        //     return this.expression.has_side_effects();
+        // });
+        // def(AST_Sub, function(){
+        //     return this.expression.has_side_effects()
+        //         || this.property.has_side_effects();
+        // });
+        def(AST_PropAccess, function(){
+            return true;
         });
         def(AST_Seq, function(){
             return this.car.has_side_effects()
@@ -1405,9 +1408,9 @@ function Compressor(options, false_by_default) {
 
     AST_Seq.DEFMETHOD("optimize", function(compressor){
         var self = this;
-        if (self.cdr instanceof AST_Seq)
-            self.cdr = self.cdr.optimize(compressor);
         if (compressor.option("cascade")) {
+            if (self.cdr instanceof AST_Seq)
+                self.cdr = self.cdr.optimize(compressor);
             if (self.car instanceof AST_Assign
                 && !self.car.left.has_side_effects()
                 && self.car.left.equivalent_to(self.cdr)) {