drop more unused names
authorMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 09:02:33 +0000 (12:02 +0300)
committerMihai Bazon <mihai@bazon.net>
Tue, 2 Oct 2012 09:02:33 +0000 (12:02 +0300)
lib/compress.js

index 14e722d..86d1ce7 100644 (file)
@@ -863,20 +863,35 @@ merge(Compressor.prototype, {
                             compressor.warn("Dropping unused variable {name} [{file}:{line},{col}]", w);
                             return false;
                         });
-                        var side_effects = [];
+                        // place uninitialized names at the start
                         def = mergeSort(def, function(a, b){
                             if (!a.value && b.value) return -1;
                             if (!b.value && a.value) return 1;
                             return 0;
                         });
-                        while (def.length > 0 && def[def.length - 1]._unused_side_effects) {
-                            side_effects.unshift(def.pop().value);
+                        // for unused names whose initialization has
+                        // side effects, we can cascade the init. code
+                        // into the next one, or next statement.
+                        var side_effects = [];
+                        for (var i = 0; i < def.length;) {
+                            var x = def[i];
+                            if (x._unused_side_effects) {
+                                side_effects.push(x.value);
+                                def.splice(i, 1);
+                            } else {
+                                if (side_effects.length > 0) {
+                                    side_effects.push(x.value);
+                                    x.value = AST_Seq.from_array(side_effects);
+                                    side_effects = [];
+                                }
+                                ++i;
+                            }
                         }
                         if (side_effects.length > 0) {
                             side_effects = make_node(AST_BlockStatement, node, {
-                                body: side_effects.map(function(ss){
-                                    return make_node(AST_SimpleStatement, ss, { body: ss });
-                                })
+                                body: [ make_node(AST_SimpleStatement, node, {
+                                    body: AST_Seq.from_array(side_effects)
+                                }) ]
                             });
                         } else {
                             side_effects = null;