aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2018-01-05 05:08:09 +0800
committerGitHub <noreply@github.com>2018-01-05 05:08:09 +0800
commitafbcebddf63c7ffa5b0df9b3712ee3b560918f1e (patch)
tree8348f45f70f00abdb764c328899cd849ee870d23 /lib
parent484e484571448595389e4c6fd9559e47c5591f7a (diff)
downloadtracifyjs-afbcebddf63c7ffa5b0df9b3712ee3b560918f1e.tar.gz
tracifyjs-afbcebddf63c7ffa5b0df9b3712ee3b560918f1e.zip
fix `mangle` name collision across files (#2722)
Diffstat (limited to 'lib')
-rw-r--r--lib/minify.js2
-rw-r--r--lib/propmangle.js25
-rw-r--r--lib/scope.js34
3 files changed, 36 insertions, 25 deletions
diff --git a/lib/minify.js b/lib/minify.js
index 806c3aeb..a68cbf3a 100644
--- a/lib/minify.js
+++ b/lib/minify.js
@@ -29,7 +29,6 @@ function set_shorthand(name, options, keys) {
function init_cache(cache) {
if (!cache) return;
- if (!("cname" in cache)) cache.cname = -1;
if (!("props" in cache)) {
cache.props = new Dictionary();
} else if (!(cache.props instanceof Dictionary)) {
@@ -39,7 +38,6 @@ function init_cache(cache) {
function to_json(cache) {
return {
- cname: cache.cname,
props: cache.props.toObject()
};
}
diff --git a/lib/propmangle.js b/lib/propmangle.js
index c2f27c42..ffc8faf8 100644
--- a/lib/propmangle.js
+++ b/lib/propmangle.js
@@ -110,12 +110,15 @@ function mangle_properties(ast, options) {
if (!Array.isArray(reserved)) reserved = [];
if (!options.builtins) find_builtins(reserved);
- var cache = options.cache;
- if (cache == null) {
- cache = {
- cname: -1,
- props: new Dictionary()
- };
+ var cname = -1;
+ var cache;
+ if (options.cache) {
+ cache = options.cache.props;
+ cache.each(function(mangled_name) {
+ push_uniq(reserved, mangled_name);
+ });
+ } else {
+ cache = new Dictionary();
}
var regex = options.regex;
@@ -172,7 +175,7 @@ function mangle_properties(ast, options) {
if (unmangleable.indexOf(name) >= 0) return false;
if (reserved.indexOf(name) >= 0) return false;
if (options.only_cache) {
- return cache.props.has(name);
+ return cache.has(name);
}
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
return true;
@@ -181,7 +184,7 @@ function mangle_properties(ast, options) {
function should_mangle(name) {
if (regex && !regex.test(name)) return false;
if (reserved.indexOf(name) >= 0) return false;
- return cache.props.has(name)
+ return cache.has(name)
|| names_to_mangle.indexOf(name) >= 0;
}
@@ -199,7 +202,7 @@ function mangle_properties(ast, options) {
return name;
}
- var mangled = cache.props.get(name);
+ var mangled = cache.get(name);
if (!mangled) {
if (debug) {
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
@@ -213,11 +216,11 @@ function mangle_properties(ast, options) {
// either debug mode is off, or it is on and we could not use the mangled name
if (!mangled) {
do {
- mangled = base54(++cache.cname);
+ mangled = base54(++cname);
} while (!can_mangle(mangled));
}
- cache.props.set(name, mangled);
+ cache.set(name, mangled);
}
return mangled;
}
diff --git a/lib/scope.js b/lib/scope.js
index de92fc94..801c888c 100644
--- a/lib/scope.js
+++ b/lib/scope.js
@@ -242,10 +242,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
}
}));
}
-
- if (options.cache) {
- this.cname = options.cache.cname;
- }
});
AST_Toplevel.DEFMETHOD("def_global", function(node){
@@ -329,10 +325,10 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
return symbol.thedef = def;
});
-AST_Scope.DEFMETHOD("next_mangled", function(options){
- var ext = this.enclosed;
+function next_mangled(scope, options) {
+ var ext = scope.enclosed;
out: while (true) {
- var m = base54(++this.cname);
+ var m = base54(++scope.cname);
if (!is_identifier(m)) continue; // skip over "do"
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
@@ -349,6 +345,18 @@ AST_Scope.DEFMETHOD("next_mangled", function(options){
}
return m;
}
+}
+
+AST_Scope.DEFMETHOD("next_mangled", function(options){
+ return next_mangled(this, options);
+});
+
+AST_Toplevel.DEFMETHOD("next_mangled", function(options){
+ var name;
+ do {
+ name = next_mangled(this, options);
+ } while (member(name, this.mangled_names));
+ return name;
});
AST_Function.DEFMETHOD("next_mangled", function(options, def){
@@ -362,7 +370,7 @@ AST_Function.DEFMETHOD("next_mangled", function(options, def){
var tricky_name = tricky_def ? tricky_def.mangled_name || tricky_def.name : null;
while (true) {
- var name = AST_Lambda.prototype.next_mangled.call(this, options, def);
+ var name = next_mangled(this, options);
if (!tricky_name || tricky_name != name)
return name;
}
@@ -413,8 +421,14 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
var lname = -1;
var to_mangle = [];
+ var mangled_names = this.mangled_names = [];
if (options.cache) {
this.globals.each(collect);
+ if (options.cache.props) {
+ options.cache.props.each(function(mangled_name) {
+ push_uniq(mangled_names, mangled_name);
+ });
+ }
}
var tw = new TreeWalker(function(node, descend){
@@ -443,10 +457,6 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
this.walk(tw);
to_mangle.forEach(function(def){ def.mangle(options) });
- if (options.cache) {
- options.cache.cname = this.cname;
- }
-
function collect(symbol) {
if (!member(symbol.name, options.reserved)) {
to_mangle.push(symbol);