fix tree traversal on `AST_Do` (#3047)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 2 Apr 2018 14:31:23 +0000 (22:31 +0800)
committerGitHub <noreply@github.com>
Mon, 2 Apr 2018 14:31:23 +0000 (22:31 +0800)
fixes #3046

lib/compress.js
lib/transform.js
test/compress/hoist_props.js

index 477fa30..444b1d0 100644 (file)
@@ -530,12 +530,11 @@ merge(Compressor.prototype, {
             tw.safe_ids = save_ids;
             return true;
         });
-        def(AST_Do, function(tw) {
+        def(AST_DWLoop, function(tw, descend) {
             var saved_loop = tw.in_loop;
             tw.in_loop = this;
             push(tw);
-            this.body.walk(tw);
-            this.condition.walk(tw);
+            descend();
             pop(tw);
             tw.in_loop = saved_loop;
             return true;
@@ -714,16 +713,6 @@ merge(Compressor.prototype, {
                 }
             }
         });
-        def(AST_While, function(tw) {
-            var saved_loop = tw.in_loop;
-            tw.in_loop = this;
-            push(tw);
-            this.condition.walk(tw);
-            this.body.walk(tw);
-            pop(tw);
-            tw.in_loop = saved_loop;
-            return true;
-        });
     })(function(node, func){
         node.DEFMETHOD("reduce_vars", func);
     });
index dcde62c..41b24c5 100644 (file)
@@ -93,7 +93,12 @@ TreeTransformer.prototype = new TreeWalker;
         self.body = do_list(self.body, tw);
     });
 
-    _(AST_DWLoop, function(self, tw){
+    _(AST_Do, function(self, tw){
+        self.body = self.body.transform(tw);
+        self.condition = self.condition.transform(tw);
+    });
+
+    _(AST_While, function(self, tw){
         self.condition = self.condition.transform(tw);
         self.body = self.body.transform(tw);
     });
index 90a7f1d..b16f742 100644 (file)
@@ -716,3 +716,29 @@ issue_3021: {
     }
     expect_stdout: "2 2"
 }
+
+issue_3046: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+    }
+    input: {
+        console.log(function(a) {
+            do {
+                var b = {
+                    c: a++
+                };
+            } while (b.c && a);
+            return a;
+        }(0));
+    }
+    expect: {
+        console.log(function(a) {
+            do {
+                var b_c = a++;
+            } while (b_c && a);
+            return a;
+        }(0));
+    }
+    expect_stdout: "1"
+}