fix corner case in `ie8` (#3487)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 16 Oct 2019 04:18:27 +0000 (12:18 +0800)
committerGitHub <noreply@github.com>
Wed, 16 Oct 2019 04:18:27 +0000 (12:18 +0800)
fixes #3486

lib/scope.js
test/compress/ie8.js

index b40807f..131235f 100644 (file)
@@ -194,7 +194,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
         if (node instanceof AST_SymbolCatch) {
             var scope = node.thedef.defun;
             if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
-                scope = scope.parent_scope;
+                scope = scope.parent_scope.resolve();
             }
             redefine(node, scope);
             return true;
@@ -202,7 +202,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
         if (node instanceof AST_SymbolLambda) {
             var def = node.thedef;
             redefine(node, node.scope.parent_scope.resolve());
-            if (def.init) node.thedef.init = def.init;
+            if (typeof node.thedef.init !== "undefined") {
+                node.thedef.init = false;
+            } else if (def.init) {
+                node.thedef.init = def.init;
+            }
             return true;
         }
     }));
index c6b51d6..223da32 100644 (file)
@@ -1841,3 +1841,49 @@ issue_3484_2_ie8_toplevel: {
     }
     expect_stdout: "number number"
 }
+
+issue_3486: {
+    options = {
+        conditionals: true,
+        ie8: false,
+        reduce_vars: true,
+    }
+    input: {
+        (function a() {
+            (function a(a) {
+                console.log(a ? "FAIL" : "PASS");
+            })();
+        })();
+    }
+    expect: {
+        (function a() {
+            (function a(a) {
+                console.log(a ? "FAIL" : "PASS");
+            })();
+        })();
+    }
+    expect_stdout: "PASS"
+}
+
+issue_3486_ie8: {
+    options = {
+        conditionals: true,
+        ie8: true,
+        reduce_vars: true,
+    }
+    input: {
+        (function a() {
+            (function a(a) {
+                console.log(a ? "FAIL" : "PASS");
+            })();
+        })();
+    }
+    expect: {
+        (function a() {
+            (function a(a) {
+                console.log(a ? "FAIL" : "PASS");
+            })();
+        })();
+    }
+    expect_stdout: "PASS"
+}