From: Alex Lam S.L Date: Tue, 15 Oct 2019 09:14:48 +0000 (+0800) Subject: fix corner case in `ie8` & `mangle` (#3479) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=86a801632337aa45179f1d4ba4e46c8ede603c46;p=UglifyJS.git fix corner case in `ie8` & `mangle` (#3479) fixes #3478 --- diff --git a/lib/scope.js b/lib/scope.js index bd6cb26a..7da982a0 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -419,7 +419,9 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) { 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) { @@ -432,22 +434,11 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) { } 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); @@ -456,6 +447,21 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options) { 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) { diff --git a/test/compress/ie8.js b/test/compress/ie8.js index 586955d9..f371bbf0 100644 --- a/test/compress/ie8.js +++ b/test/compress/ie8.js @@ -1321,3 +1321,243 @@ issue_3475_ie8_toplevel: { } 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" +}