if (options.cache && node instanceof AST_Toplevel) {
node.globals.each(mangle);
}
- node.variables.each(mangle);
+ node.variables.each(function(def) {
+ if (!defer_redef(def)) mangle(def);
+ });
return true;
}
if (node instanceof AST_Label) {
}
if (!options.ie8 && node instanceof AST_Catch) {
var def = node.argname.definition();
- var redef = def.redefined();
- if (redef) {
- redefined.push(def);
- reference(node.argname);
- def.references.forEach(reference);
- }
+ var redef = defer_redef(def, node.argname);
descend();
if (!redef) mangle(def);
return true;
}
-
- function reference(sym) {
- sym.thedef = redef;
- sym.reference(options);
- sym.thedef = def;
- }
});
this.walk(tw);
redefined.forEach(mangle);
if (options.reserved.has[def.name]) return;
def.mangle(options);
}
+
+ function defer_redef(def, node) {
+ var redef = def.redefined();
+ if (!redef) return false;
+ redefined.push(def);
+ def.references.forEach(reference);
+ if (node) reference(node);
+ return true;
+
+ function reference(sym) {
+ sym.thedef = redef;
+ sym.reference(options);
+ sym.thedef = def;
+ }
+ }
});
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
}
expect_stdout: "PASS"
}
+
+issue_3478_1: {
+ rename = true
+ mangle = {
+ ie8: false,
+ toplevel: false,
+ }
+ input: {
+ "aaaaaaaaaa";
+ (function f() {
+ (function f() {
+ var a;
+ console.log(typeof f);
+ })();
+ })();
+ }
+ expect: {
+ "aaaaaaaaaa";
+ (function a() {
+ (function a() {
+ var o;
+ console.log(typeof a);
+ })();
+ })();
+ }
+ expect_stdout: "function"
+}
+
+issue_3478_1_ie8: {
+ rename = true
+ mangle = {
+ ie8: true,
+ toplevel: false,
+ }
+ input: {
+ "aaaaaaaaaa";
+ (function f() {
+ (function f() {
+ var a;
+ console.log(typeof f);
+ })();
+ })();
+ }
+ expect: {
+ "aaaaaaaaaa";
+ (function f() {
+ (function f() {
+ var a;
+ console.log(typeof f);
+ })();
+ })();
+ }
+ expect_stdout: "function"
+}
+
+issue_3478_1_toplevel: {
+ rename = true
+ mangle = {
+ ie8: false,
+ toplevel: true,
+ }
+ input: {
+ "aaaaaaaaaa";
+ (function f() {
+ (function f() {
+ var a;
+ console.log(typeof f);
+ })();
+ })();
+ }
+ expect: {
+ "aaaaaaaaaa";
+ (function a() {
+ (function a() {
+ var o;
+ console.log(typeof a);
+ })();
+ })();
+ }
+ expect_stdout: "function"
+}
+
+issue_3478_1_ie8_toplevel: {
+ rename = true
+ mangle = {
+ ie8: true,
+ toplevel: true,
+ }
+ input: {
+ "aaaaaaaaaa";
+ (function f() {
+ (function f() {
+ var a;
+ console.log(typeof f);
+ })();
+ })();
+ }
+ expect: {
+ "aaaaaaaaaa";
+ (function o() {
+ (function o() {
+ var a;
+ console.log(typeof o);
+ })();
+ })();
+ }
+ expect_stdout: "function"
+}
+
+issue_3478_2: {
+ rename = true
+ mangle = {
+ ie8: false,
+ toplevel: false,
+ }
+ input: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function f() {
+ (function f() {
+ var b = function g() {
+ f && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function b() {
+ (function n() {
+ var b = function b() {
+ n && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect_stdout: "PASS"
+}
+
+issue_3478_2_ie8: {
+ rename = true
+ mangle = {
+ ie8: true,
+ toplevel: false,
+ }
+ input: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function f() {
+ (function f() {
+ var b = function g() {
+ f && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function f() {
+ (function f() {
+ var b = function n() {
+ f && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect_stdout: "PASS"
+}
+
+issue_3478_2_toplevel: {
+ rename = true
+ mangle = {
+ ie8: false,
+ toplevel: true,
+ }
+ input: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function f() {
+ (function f() {
+ var b = function g() {
+ f && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect: {
+ "bbbbbbb";
+ var o = "FAIL";
+ (function b() {
+ (function n() {
+ var b = function b() {
+ n && (o = "PASS");
+ }();
+ })();
+ })();
+ console.log(o);
+ }
+ expect_stdout: "PASS"
+}
+
+issue_3478_2_ie8_toplevel: {
+ rename = true
+ mangle = {
+ ie8: true,
+ toplevel: true,
+ }
+ input: {
+ "bbbbbbb";
+ var c = "FAIL";
+ (function f() {
+ (function f() {
+ var b = function g() {
+ f && (c = "PASS");
+ }();
+ })();
+ })();
+ console.log(c);
+ }
+ expect: {
+ "bbbbbbb";
+ var o = "FAIL";
+ (function c() {
+ (function c() {
+ var b = function n() {
+ c && (o = "PASS");
+ }();
+ })();
+ })();
+ console.log(o);
+ }
+ expect_stdout: "PASS"
+}