minor
authorMihai Bazon <mihai@bazon.net>
Fri, 14 Sep 2012 16:04:18 +0000 (19:04 +0300)
committerMihai Bazon <mihai@bazon.net>
Fri, 14 Sep 2012 16:04:18 +0000 (19:04 +0300)
when unsafe, compress undefined as [][0]

lib/compress.js

index 3fd6940..b37dcfe 100644 (file)
@@ -224,8 +224,8 @@ function Compressor(options, false_by_default) {
                                && !statements[last - 1].alternative) {
                         CHANGED = true;
                         return MAP.splice([ stat, make_node(AST_Return, stat, {
-                            value: make_node(AST_Undefined, stat)
-                        })]);
+                            value: make_node(AST_Undefined, stat).optimize(compressor)
+                        }).optimize(compressor)]);
                     }
                 }
                 if (stat instanceof AST_If
@@ -439,7 +439,7 @@ function Compressor(options, false_by_default) {
                     ast = make_node(val ? AST_True : AST_False, this);
                     break;
                   case "undefined":
-                    ast = make_node(AST_Undefined, this);
+                    ast = make_node(AST_Undefined, this).optimize(compressor);
                     break;
                   default:
                     if (val === null) {
@@ -1353,7 +1353,25 @@ function Compressor(options, false_by_default) {
 
     AST_SymbolRef.DEFMETHOD("optimize", function(compressor){
         if (this.name == "undefined" && this.undeclared()) {
-            return make_node(AST_Undefined, this);
+            return make_node(AST_Undefined, this).optimize(compressor);
+        }
+        return this;
+    });
+
+    SQUEEZE(AST_Undefined, function(self, compressor){
+        return self.optimize(compressor);
+    });
+
+    AST_Undefined.DEFMETHOD("optimize", function(compressor){
+        if (compressor.option("unsafe") && !(compressor.parent() instanceof AST_Array)) {
+            return make_node(AST_Sub, this, {
+                expression: make_node(AST_Array, this, {
+                    elements: []
+                }),
+                property: make_node(AST_Number, this, {
+                    value: 0
+                })
+            });
         }
         return this;
     });