diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-07-29 23:02:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-29 23:02:04 +0800 |
commit | a845897758aa2cbccf71f37643d31b08cdd22a0e (patch) | |
tree | a845d73050ec30bbc089252df13a2258053c5e65 /lib/propmangle.js | |
parent | 32ea2c5530079ddbbbc50b23b2adeff44ba7b5df (diff) | |
download | tracifyjs-a845897758aa2cbccf71f37643d31b08cdd22a0e.tar.gz tracifyjs-a845897758aa2cbccf71f37643d31b08cdd22a0e.zip |
improve `mangle.properties` (#2261)
- include dead code when `keep_quoted`
- unify `keep_quoted` & `reserved`
- make `test/run-tests.js` consistent with `minify()`
fixes #2256
Diffstat (limited to 'lib/propmangle.js')
-rw-r--r-- | lib/propmangle.js | 95 |
1 files changed, 36 insertions, 59 deletions
diff --git a/lib/propmangle.js b/lib/propmangle.js index 49490755..36a67e80 100644 --- a/lib/propmangle.js +++ b/lib/propmangle.js @@ -67,6 +67,34 @@ function find_builtins(reserved) { } } +function reserve_quoted_keys(ast, reserved) { + function add(name) { + push_uniq(reserved, name); + } + + ast.walk(new TreeWalker(function(node) { + if (node instanceof AST_ObjectKeyVal && node.quote) { + add(node.key); + } else if (node instanceof AST_Sub) { + addStrings(node.property, add); + } + })); +} + +function addStrings(node, add) { + node.walk(new TreeWalker(function(node) { + if (node instanceof AST_Sequence) { + addStrings(node.expressions[node.expressions.length - 1], add); + } else if (node instanceof AST_String) { + add(node.value); + } else if (node instanceof AST_Conditional) { + addStrings(node.consequent, add); + addStrings(node.alternative, add); + } + return true; + })); +} + function mangle_properties(ast, options) { options = defaults(options, { builtins: false, @@ -91,7 +119,6 @@ function mangle_properties(ast, options) { } var regex = options.regex; - var keep_quoted = options.keep_quoted; // note debug is either false (disabled), or a string of the debug suffix to use (enabled). // note debug may be enabled as an empty string, which is falsey. Also treat passing 'true' @@ -104,12 +131,11 @@ function mangle_properties(ast, options) { var names_to_mangle = []; var unmangleable = []; - var to_keep = {}; // step 1: find candidates to mangle ast.walk(new TreeWalker(function(node){ if (node instanceof AST_ObjectKeyVal) { - add(node.key, keep_quoted && node.quote); + add(node.key); } else if (node instanceof AST_ObjectProperty) { // setter or getter, since KeyVal is handled above @@ -119,15 +145,14 @@ function mangle_properties(ast, options) { add(node.property); } else if (node instanceof AST_Sub) { - addStrings(node.property, keep_quoted); + addStrings(node.property, add); } })); // step 2: transform the tree, renaming properties return ast.transform(new TreeTransformer(function(node){ if (node instanceof AST_ObjectKeyVal) { - if (!(keep_quoted && node.quote)) - node.key = mangle(node.key); + node.key = mangle(node.key); } else if (node instanceof AST_ObjectProperty) { // setter or getter @@ -136,22 +161,9 @@ function mangle_properties(ast, options) { else if (node instanceof AST_Dot) { node.property = mangle(node.property); } - else if (node instanceof AST_Sub) { - if (!keep_quoted) - node.property = mangleStrings(node.property); + else if (!options.keep_quoted && node instanceof AST_Sub) { + node.property = mangleStrings(node.property); } - // else if (node instanceof AST_String) { - // if (should_mangle(node.value)) { - // AST_Node.warn( - // "Found \"{prop}\" property candidate for mangling in an arbitrary string [{file}:{line},{col}]", { - // file : node.start.file, - // line : node.start.line, - // col : node.start.col, - // prop : node.value - // } - // ); - // } - // } })); // only function declarations after this line @@ -167,19 +179,13 @@ function mangle_properties(ast, options) { } function should_mangle(name) { - if (keep_quoted && name in to_keep) return false; if (regex && !regex.test(name)) return false; if (reserved.indexOf(name) >= 0) return false; return cache.props.has(name) || names_to_mangle.indexOf(name) >= 0; } - function add(name, keep) { - if (keep) { - to_keep[name] = true; - return; - } - + function add(name) { if (can_mangle(name)) push_uniq(names_to_mangle, name); @@ -199,19 +205,16 @@ function mangle_properties(ast, options) { // debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_. var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_"; - if (can_mangle(debug_mangled) && !(keep_quoted && debug_mangled in to_keep)) { + if (can_mangle(debug_mangled)) { mangled = debug_mangled; } } // either debug mode is off, or it is on and we could not use the mangled name if (!mangled) { - // Note: `can_mangle()` does not check if the name collides with the `to_keep` set - // (filled with quoted properties when `keep_quoted` is set). Make sure we add this - // check so we don't collide with a quoted name. do { mangled = base54(++cache.cname); - } while (!can_mangle(mangled) || keep_quoted && mangled in to_keep); + } while (!can_mangle(mangled)); } cache.props.set(name, mangled); @@ -219,32 +222,6 @@ function mangle_properties(ast, options) { return mangled; } - function addStrings(node, keep) { - var out = {}; - try { - (function walk(node){ - node.walk(new TreeWalker(function(node){ - if (node instanceof AST_Sequence) { - walk(node.expressions[node.expressions.length - 1]); - return true; - } - if (node instanceof AST_String) { - add(node.value, keep); - return true; - } - if (node instanceof AST_Conditional) { - walk(node.consequent); - walk(node.alternative); - return true; - } - throw out; - })); - })(node); - } catch(ex) { - if (ex !== out) throw ex; - } - } - function mangleStrings(node) { return node.transform(new TreeTransformer(function(node){ if (node instanceof AST_Sequence) { |