fix corner case with nameCache (#3338)

fixes #3301
This commit is contained in:
Alex Lam S.L
2019-03-15 01:15:50 +08:00
committed by GitHub
parent d90777b724
commit 627f5fb41e
2 changed files with 29 additions and 1 deletions

View File

@@ -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;

View File

@@ -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);