fix `mangle` of `AST_SymbolLambda` under `ie8` (#2978)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 7 Mar 2018 09:20:38 +0000 (17:20 +0800)
committerGitHub <noreply@github.com>
Wed, 7 Mar 2018 09:20:38 +0000 (17:20 +0800)
fixes #2976

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

index 9a8e25c..baa3e8b 100644 (file)
@@ -74,17 +74,12 @@ SymbolDef.prototype = {
         var cache = options.cache && options.cache.props;
         if (this.global && cache && cache.has(this.name)) {
             this.mangled_name = cache.get(this.name);
-        }
-        else if (!this.mangled_name && !this.unmangleable(options)) {
-            var s = this.scope;
-            var sym = this.orig[0];
-            if (options.ie8 && sym instanceof AST_SymbolLambda)
-                s = s.parent_scope;
+        } else if (!this.mangled_name && !this.unmangleable(options)) {
             var def;
             if (def = this.redefined()) {
                 this.mangled_name = def.mangled_name || def.name;
             } else {
-                this.mangled_name = next_mangled_name(s, options, this);
+                this.mangled_name = next_mangled_name(this.scope, options, this);
             }
             if (this.global && cache) {
                 cache.set(this.name, this.mangled_name);
@@ -377,6 +372,9 @@ 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 b4098b8..3a95eb6 100644 (file)
@@ -392,3 +392,75 @@ issue_2254_2: {
     }
     expect_stdout: "PASS"
 }
+
+issue_24_1: {
+    mangle = {
+        ie8: false,
+    }
+    input: {
+        (function(a) {
+            console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
+        })();
+    }
+    expect: {
+        (function(o) {
+            console.log(typeof function o(){} === typeof o ? "FAIL" : "PASS");
+        })();
+    }
+    expect_stdout: "PASS"
+}
+
+issue_24_2: {
+    mangle = {
+        ie8: true,
+    }
+    input: {
+        (function(a) {
+            console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
+        })();
+    }
+    expect: {
+        (function(n) {
+            console.log(typeof function o(){} === typeof n ? "FAIL" : "PASS");
+        })();
+    }
+    expect_stdout: "PASS"
+}
+
+issue_2976_1: {
+    mangle = {
+        ie8: false,
+    }
+    input: {
+        console.log(function f() {
+            var a;
+            return a === f ? "FAIL" : "PASS";
+        }());
+    }
+    expect: {
+        console.log(function n() {
+            var o;
+            return o === n ? "FAIL" : "PASS";
+        }());
+    }
+    expect_stdout: "PASS"
+}
+
+issue_2976_2: {
+    mangle = {
+        ie8: true,
+    }
+    input: {
+        console.log(function f() {
+            var a;
+            return a === f ? "FAIL" : "PASS";
+        }());
+    }
+    expect: {
+        console.log(function n() {
+            var o;
+            return o === n ? "FAIL" : "PASS";
+        }());
+    }
+    expect_stdout: "PASS"
+}