fix corner case with `collapse_vars` & `ie8` (#3469)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 14 Oct 2019 05:34:35 +0000 (13:34 +0800)
committerGitHub <noreply@github.com>
Mon, 14 Oct 2019 05:34:35 +0000 (13:34 +0800)
fixes #3468

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

index 29ef07c..06ba43c 100644 (file)
@@ -896,8 +896,7 @@ merge(Compressor.prototype, {
         if (lhs instanceof AST_This) return true;
         if (lhs instanceof AST_SymbolRef) {
             var def = lhs.definition();
-            return def.orig[0] instanceof AST_SymbolLambda
-                || compressor.exposed(def) && identifier_atom[def.name];
+            return def.lambda || compressor.exposed(def) && identifier_atom[def.name];
         }
         if (lhs instanceof AST_PropAccess) {
             lhs = lhs.expression;
index 08c9efd..83df3fd 100644 (file)
@@ -55,6 +55,7 @@ function SymbolDef(scope, orig, init) {
     this.mangled_name = null;
     this.undeclared = false;
     this.id = SymbolDef.next_id++;
+    this.lambda = orig instanceof AST_SymbolLambda;
 }
 
 SymbolDef.next_id = 1;
@@ -210,6 +211,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
             node.thedef = new_def;
             node.reference(options);
         });
+        if (old_def.lambda) new_def.lambda = true;
     }
 });
 
index e81e1a0..f0298de 100644 (file)
@@ -969,3 +969,47 @@ issue_3355_4: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3468: {
+    options = {
+        collapse_vars: true,
+        ie8: false,
+    }
+    input: {
+        var a = 42;
+        console.log(function a() {
+            a++;
+            return typeof a;
+        }());
+    }
+    expect: {
+        var a = 42;
+        console.log(function a() {
+            a++;
+            return typeof a;
+        }());
+    }
+    expect_stdout: "function"
+}
+
+issue_3468_ie8: {
+    options = {
+        collapse_vars: true,
+        ie8: true,
+    }
+    input: {
+        var a = 42;
+        console.log(function a() {
+            a++;
+            return typeof a;
+        }());
+    }
+    expect: {
+        var a = 42;
+        console.log(function a() {
+            a++;
+            return typeof a;
+        }());
+    }
+    expect_stdout: "function"
+}