possible optimization for AST_Undefined
authorMihai Bazon <mihai@bazon.net>
Mon, 17 Sep 2012 09:24:21 +0000 (12:24 +0300)
committerMihai Bazon <mihai@bazon.net>
Mon, 17 Sep 2012 09:27:32 +0000 (12:27 +0300)
if undefined is defined, ;-), we replace AST_Undefined nodes to a reference
to the "undefined" variable; in turn the mangler will compress it to a
single letter; this helps at least on jQuery.

lib/compress.js

index 7b865fd..ddbf41f 100644 (file)
@@ -91,6 +91,12 @@ function Compressor(options, false_by_default) {
             self = p;
         }
     };
+    function find_parent(type) {
+        for (var i = stack.length; --i >= 0;) {
+            var x = stack[i];
+            if (x instanceof type) return x;
+        }
+    };
     return {
         option    : function(key) { return options[key] },
         push_node : function(node) { stack.push(node) },
@@ -104,7 +110,8 @@ function Compressor(options, false_by_default) {
             if (options.warnings)
                 AST_Node.warn.apply(AST_Node, arguments);
         },
-        in_boolean_context: in_boolean_context
+        in_boolean_context: in_boolean_context,
+        find_parent: find_parent,
     };
 };
 
@@ -1499,16 +1506,19 @@ function Compressor(options, false_by_default) {
     });
 
     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
-        //         })
-        //     });
-        // }
+        if (compressor.option("unsafe")) {
+            var scope = compressor.find_parent(AST_Scope);
+            var undef = scope.find_variable("undefined");
+            if (undef) {
+                var ref = make_node(AST_SymbolRef, this, {
+                    name   : "undefined",
+                    scope  : scope,
+                    thedef : undef
+                });
+                ref.reference();
+                return ref;
+            }
+        }
         return this;
     });