diff options
author | kzc <zaxxon2011@gmail.com> | 2016-03-28 17:58:50 -0400 |
---|---|---|
committer | kzc <zaxxon2011@gmail.com> | 2016-03-28 17:58:50 -0400 |
commit | 45ddb9caeb200615b9f0ced0ed83fa95f0c51b23 (patch) | |
tree | 4c5f34a07dcbcd33038efdea4d2d2d971f1267f0 | |
parent | 9bcf702a6e12ab35fda9ca35042ae3dc7c449891 (diff) | |
download | tracifyjs-45ddb9caeb200615b9f0ced0ed83fa95f0c51b23.tar.gz tracifyjs-45ddb9caeb200615b9f0ced0ed83fa95f0c51b23.zip |
Speedup `unused` compress option for already minified code
Fixes: #321 #917 #1022
-rw-r--r-- | lib/compress.js | 17 | ||||
-rw-r--r-- | lib/scope.js | 3 |
2 files changed, 16 insertions, 4 deletions
diff --git a/lib/compress.js b/lib/compress.js index f49486a0..4f37e834 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1242,6 +1242,7 @@ merge(Compressor.prototype, { && !self.uses_eval ) { var in_use = []; + var in_use_ids = {}; // avoid expensive linear scans of in_use var initializations = new Dictionary(); // pass 1: find out which symbols are directly used in // this scope (not in nested scopes). @@ -1264,7 +1265,11 @@ merge(Compressor.prototype, { return true; } if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); + var node_def = node.definition(); + if (!(node_def.id in in_use_ids)) { + in_use_ids[node_def.id] = true; + in_use.push(node_def); + } return true; } if (node instanceof AST_Scope) { @@ -1287,7 +1292,11 @@ merge(Compressor.prototype, { if (init) init.forEach(function(init){ var tw = new TreeWalker(function(node){ if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); + var node_def = node.definition(); + if (!(node_def.id in in_use_ids)) { + in_use_ids[node_def.id] = true; + in_use.push(node_def); + } } }); init.walk(tw); @@ -1315,7 +1324,7 @@ merge(Compressor.prototype, { } } if (node instanceof AST_Defun && node !== self) { - if (!member(node.name.definition(), in_use)) { + if (!(node.name.definition().id in in_use_ids)) { compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", { name : node.name.name, file : node.name.start.file, @@ -1328,7 +1337,7 @@ merge(Compressor.prototype, { } if (node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) { var def = node.definitions.filter(function(def){ - if (member(def.name.definition(), in_use)) return true; + if (def.name.definition().id in in_use_ids) return true; var w = { name : def.name.name, file : def.name.start.file, diff --git a/lib/scope.js b/lib/scope.js index 5ab775a3..d07eca12 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -53,8 +53,11 @@ function SymbolDef(scope, index, orig) { this.undeclared = false; this.constant = false; this.index = index; + this.id = SymbolDef.next_id++; }; +SymbolDef.next_id = 1; + SymbolDef.prototype = { unmangleable: function(options) { if (!options) options = {}; |