fix corner case in `ie8` (#3198)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 22 Jun 2018 11:41:55 +0000 (19:41 +0800)
committeralexlamsl <alexlamsl@gmail.com>
Sat, 23 Jun 2018 20:00:36 +0000 (04:00 +0800)
fixes #3197

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

index d4b13d1..8ce3e4d 100644 (file)
@@ -132,10 +132,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
             node.thedef = node;
             node.references = [];
         }
-        if (node instanceof AST_SymbolLambda) {
-            defun.def_function(node, node.name == "arguments" ? undefined : defun);
-        }
-        else if (node instanceof AST_SymbolDefun) {
+        if (node instanceof AST_SymbolDefun || options.ie8 && node instanceof AST_SymbolLambda) {
             // Careful here, the scope where this should be defined is
             // the parent scope.  The reason is that we enter a new
             // scope when we encounter the AST_Defun node (which is
@@ -143,6 +140,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
             // later.
             (node.scope = defun.parent_scope).def_function(node, defun);
         }
+        else if (node instanceof AST_SymbolLambda) {
+            defun.def_function(node, node.name == "arguments" ? undefined : defun);
+        }
         else if (node instanceof AST_SymbolVar) {
             defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
             if (defun !== scope) {
@@ -349,9 +349,6 @@ function next_mangled_name(scope, options, def) {
         holes.push(scope.cname);
     }
     scope.names_in_use[name] = true;
-    if (options.ie8 && def.orig[0] instanceof AST_SymbolLambda) {
-        names_in_use(scope.parent_scope, options)[name] = true;
-    }
     return name;
 }
 
index b21b841..c3012bf 100644 (file)
@@ -420,8 +420,8 @@ issue_24_2: {
         })();
     }
     expect: {
-        (function(n) {
-            console.log(typeof function o(){} === typeof n ? "FAIL" : "PASS");
+        (function(o) {
+            console.log(typeof function n(){} === typeof o ? "FAIL" : "PASS");
         })();
     }
     expect_stdout: "PASS"
@@ -457,9 +457,29 @@ issue_2976_2: {
         }());
     }
     expect: {
-        console.log(function n() {
-            var o;
-            return o === n ? "FAIL" : "PASS";
+        console.log(function f() {
+            var n;
+            return n === f ? "FAIL" : "PASS";
+        }());
+    }
+    expect_stdout: "PASS"
+}
+
+issue_2976_3: {
+    mangle = {
+        ie8: true,
+        toplevel: true,
+    }
+    input: {
+        console.log(function f() {
+            var a;
+            return a === f ? "FAIL" : "PASS";
+        }());
+    }
+    expect: {
+        console.log(function o() {
+            var n;
+            return n === o ? "FAIL" : "PASS";
         }());
     }
     expect_stdout: "PASS"
@@ -538,3 +558,111 @@ issue_3035_ie8: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3197_1: {
+    options = {
+        ie8: false,
+        inline: true,
+        reduce_vars: true,
+        side_effects: true,
+        unused: true,
+    }
+    mangle = {
+        ie8: false,
+    }
+    input: {
+        var window = {};
+        !function() {
+            function Foo() {
+                console.log(this instanceof Foo);
+            }
+            window.Foo = Foo;
+        }();
+        new window.Foo();
+    }
+    expect: {
+        var window = {};
+        window.Foo = function o() {
+            console.log(this instanceof o);
+        };
+        new window.Foo();
+    }
+    expect_stdout: "true"
+}
+
+issue_3197_1_ie8: {
+    options = {
+        ie8: true,
+        inline: true,
+        reduce_vars: true,
+        side_effects: true,
+        unused: true,
+    }
+    mangle = {
+        ie8: true,
+    }
+    input: {
+        var window = {};
+        !function() {
+            function Foo() {
+                console.log(this instanceof Foo);
+            }
+            window.Foo = Foo;
+        }();
+        new window.Foo();
+    }
+    expect: {
+        var window = {};
+        window.Foo = function Foo() {
+            console.log(this instanceof Foo);
+        };
+        new window.Foo();
+    }
+    expect_stdout: "true"
+}
+
+issue_3197_2: {
+    mangle = {
+        ie8: false,
+    }
+    input: {
+        (function(a) {
+            var f = function f() {
+                console.log(this instanceof f);
+            };
+            new f(a);
+        })();
+    }
+    expect: {
+        (function(n) {
+            var o = function n() {
+                console.log(this instanceof n);
+            };
+            new o(n);
+        })();
+    }
+    expect_stdout: "true"
+}
+
+issue_3197_2_ie8: {
+    mangle = {
+        ie8: true,
+    }
+    input: {
+        (function(a) {
+            var f = function f() {
+                console.log(this instanceof f);
+            };
+            new f(a);
+        })();
+    }
+    expect: {
+        (function(n) {
+            var o = function o() {
+                console.log(this instanceof o);
+            };
+            new o(n);
+        })();
+    }
+    expect_stdout: "true"
+}