From: Alex Lam S.L Date: Thu, 14 Mar 2019 17:15:50 +0000 (+0800) Subject: fix corner case with `nameCache` (#3338) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=627f5fb41eac761fec7481b7429f5edb878f9c04;p=UglifyJS.git fix corner case with `nameCache` (#3338) fixes #3301 --- diff --git a/lib/scope.js b/lib/scope.js index c88ce8fc..5e114417 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -309,8 +309,12 @@ function names_in_use(scope, options) { if (!names) { scope.names_in_use = names = Object.create(scope.mangled_names || null); scope.cname_holes = []; + var cache = options.cache && options.cache.props; scope.enclosed.forEach(function(def) { if (def.unmangleable(options)) names[def.name] = true; + if (def.global && cache && cache.has(def.name)) { + names[cache.get(def.name)] = true; + } }); } return names; diff --git a/test/mocha/minify.js b/test/mocha/minify.js index 6e6c7a78..d11f40ff 100644 --- a/test/mocha/minify.js +++ b/test/mocha/minify.js @@ -87,7 +87,7 @@ describe("minify", function() { assert.strictEqual(run_code(compressed), run_code(original)); }); - it("Should avoid mangled names in cache", function() { + it("Should avoid cached names when mangling top-level variables", function() { var cache = {}; var original = ""; var compressed = ""; @@ -116,6 +116,30 @@ describe("minify", function() { assert.strictEqual(run_code(compressed), run_code(original)); }); + it("Should avoid cached names when mangling inner-scoped variables", function() { + var cache = {}; + var original = ""; + var compressed = ""; + [ + 'var extend = function(a, b) { console.log("extend"); a(); b(); }; function A() { console.log("A"); };', + 'var B = function(A) { function B() { console.log("B") }; extend(B, A); return B; }(A);', + ].forEach(function(code) { + var result = UglifyJS.minify(code, { + compress: false, + nameCache: cache, + toplevel: true, + }); + if (result.error) throw result.error; + original += code; + compressed += result.code; + }); + assert.strictEqual(compressed, [ + 'var o=function(o,n){console.log("extend");o();n()};function n(){console.log("A")}', + 'var e=function(n){function e(){console.log("B")}o(e,n);return e}(n);', + ].join("")); + assert.strictEqual(run_code(compressed), run_code(original)); + }); + it("Should not parse invalid use of reserved words", function() { assert.strictEqual(UglifyJS.minify("function enum(){}").error, undefined); assert.strictEqual(UglifyJS.minify("function static(){}").error, undefined);