fix compressing `a,b; return c;` into `return a,b,c;`
authorMihai Bazon <mihai@bazon.net>
Mon, 27 Aug 2012 08:00:22 +0000 (11:00 +0300)
committerMihai Bazon <mihai@bazon.net>
Mon, 27 Aug 2012 08:00:22 +0000 (11:00 +0300)
lib/compress.js

index f23d4cd..857d1bb 100644 (file)
@@ -158,8 +158,7 @@ function Compressor(options, false_by_default) {
                 }
                 else if (compressor.option("warnings")) {
                     stat.walk(new TreeWalker(function(node){
-                        if (node instanceof AST_Definitions
-                            || node instanceof AST_Defun) {
+                        if (node instanceof AST_Definitions || node instanceof AST_Defun) {
                             compressor.warn("Declarations in unreachable code! [{line},{col}]", node.start);
                             if (node instanceof AST_Definitions) {
                                 node = node.clone();
@@ -169,11 +168,13 @@ function Compressor(options, false_by_default) {
                             else if (node instanceof AST_Defun) {
                                 a.push(node);
                             }
-                            return true;
+                            return true; // no point to descend
                         }
-                        if (node instanceof AST_Scope)
+                        if (node instanceof AST_Scope) {
+                            // also don't descend any other nested scopes
                             return true;
-                    }))
+                        }
+                    }));
                 };
             } else {
                 a.push(stat);
@@ -185,6 +186,7 @@ function Compressor(options, false_by_default) {
         }, []);
     }
 
+    // XXX: this is destructive -- it modifies tree nodes.
     function sequencesize(statements) {
         var prev = null, last = statements.length - 1;
         if (last) statements = statements.reduce(function(a, cur, i){
@@ -196,8 +198,9 @@ function Compressor(options, false_by_default) {
                 });
                 prev.body = seq;
             }
-            else if (i == last && cur instanceof AST_Exit
-                     && cur.value && a.length == 1) {
+            else if (i == last
+                     && cur instanceof AST_Exit && cur.value
+                     && a.length == 1 && prev instanceof AST_SimpleStatement) {
                 // it only makes sense to do this transformation
                 // if the AST gets to a single statement.
                 var seq = make_node(AST_Seq, prev, {