aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-05-15 18:09:12 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-05-15 18:09:12 -0700
commit96cd0ae3983eadd478eeebfb4f8037bcd1261c50 (patch)
treea8113d2ac7e2dd28b93d82a8c8f9478c3a46a084
parent1169a930d7b7ea6db76aa046eb6a3751cb568659 (diff)
track number of assigns/modifications in registerize
-rw-r--r--tools/js-optimizer.js18
1 files changed, 14 insertions, 4 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index d438094b..11130a9f 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -119,6 +119,7 @@ load('utility.js');
var FUNCTION = set('defun', 'function');
var LOOP = set('do', 'while', 'for');
var LOOP_FLOW = set('break', 'continue');
+var ASSIGN_OR_ALTER = set('assign', 'unary-postfix', 'unary-prefix');
var NULL_NODE = ['name', 'null'];
var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]];
@@ -1141,20 +1142,29 @@ function loopOptimizer(ast) {
}
// Very simple 'registerization', coalescing of variables into a smaller number.
-function registerize(ast, conservative) {
+function registerize(ast) {
traverseGeneratedFunctions(ast, function(fun) {
// Find the # of uses of each variable. The definition is considered a 'use'
// First, find all the var definitions
var varUses = {};
+ var varAssigns = {};
traverse(fun, function(node, type) {
if (type == 'var') {
node[1].forEach(function(arg) {
var name = arg[0];
- if (!varUses[name]) { // may have multiple var definitions
- varUses[name] = 0;
- }
+ if (!varUses[name]) varUses[name] = 0; // may have multiple var definitions
varUses[name]++;
+ if (arg[1]) {
+ if (!varAssigns[name]) varAssigns[name] = 0;
+ varAssigns[name]++;
+ }
});
+ } else if (type in ASSIGN_OR_ALTER) {
+ if (node[2] && node[2][0] == 'name') {
+ var name = node[2][1];
+ if (!varAssigns[name]) varAssigns[name] = 0;
+ varAssigns[name]++;
+ }
}
});
// Find uses of those variables