fix corner case in `reduce_vars` (#3845)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 3 May 2020 19:30:10 +0000 (20:30 +0100)
committerGitHub <noreply@github.com>
Sun, 3 May 2020 19:30:10 +0000 (03:30 +0800)
fixes #3844

lib/compress.js
test/compress/reduce_vars.js

index 8b6c38d..59e4d86 100644 (file)
@@ -716,6 +716,14 @@ merge(Compressor.prototype, {
             fn.inlined = false;
             var iife;
             if (!fn.name && (iife = tw.parent()) instanceof AST_Call && iife.expression === fn) {
+                var hit = false;
+                var aborts = false;
+                fn.walk(new TreeWalker(function(node) {
+                    if (hit) return aborts = true;
+                    if (node instanceof AST_Return) return hit = true;
+                    if (node instanceof AST_Scope && node !== fn) return true;
+                }));
+                if (aborts) push(tw);
                 reset_variables(tw, compressor, fn);
                 // Virtually turn IIFE parameters into variable definitions:
                 //   (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})()
@@ -735,22 +743,11 @@ merge(Compressor.prototype, {
                         d.fixed = false;
                     }
                 });
-                var has_return = false;
-                var visit = tw.visit;
-                tw.visit = function(node, descend) {
-                    var ret = visit.call(tw, node, descend);
-                    if (!has_return && node instanceof AST_Return && tw.find_parent(AST_Scope) === fn) {
-                        has_return = true;
-                        push(tw);
-                    }
-                    return ret;
-                };
                 descend();
-                tw.visit = visit;
                 var safe_ids = tw.safe_ids;
                 pop(tw);
                 walk_defuns(tw, fn);
-                if (!has_return) tw.safe_ids = safe_ids;
+                if (!aborts) tw.safe_ids = safe_ids;
             } else {
                 push(tw);
                 reset_variables(tw, compressor, fn);
index 6cc575f..67d473d 100644 (file)
@@ -7006,3 +7006,30 @@ flatten_iife: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3844: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+    }
+    input: {
+        console.log(function() {
+            if (!console) switch (A = 0) {
+              case console.log("FAIL"):
+                return;
+            }
+            return typeof A;
+        }());
+    }
+    expect: {
+        console.log(function() {
+            if (!console) switch (A = 0) {
+              case console.log("FAIL"):
+                return;
+            }
+            return typeof A;
+        }());
+    }
+    expect_stdout: "undefined"
+}