Skip to content

Commit

Permalink
fix corner case with nameCache (#3338)
Browse files Browse the repository at this point in the history
fixes #3301
  • Loading branch information
alexlamsl authored Mar 14, 2019
1 parent d90777b commit 627f5fb
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
4 changes: 4 additions & 0 deletions lib/scope.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
26 changes: 25 additions & 1 deletion test/mocha/minify.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "";
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 627f5fb

Please sign in to comment.