diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-23 19:46:40 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-23 19:46:40 -0700 |
commit | e7e425b05f8399157887b9fd0f04a1067ea37e8b (patch) | |
tree | 17df8ae28949f458d66b6305c27f1233e5e1d567 /tools/js-optimizer.js | |
parent | a79d6118ba9af2cdcdc17a43ae2d03327c9e87e3 (diff) |
fix eliminator bug where X[y] would take X into account for variable effects, preventing optimization
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index bf7e00b7..c63f46d5 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1393,6 +1393,7 @@ function eliminate(ast) { // Node types which can be evaluated without side effects. var NODES_WITHOUT_SIDE_EFFECTS = { name: true, + sname: true, num: true, string: true, binary: true, @@ -1611,7 +1612,7 @@ function eliminate(ast) { if (type == 'assign' || type == 'unary-prefix' || type == 'unary-postfix') { if (type === 'assign' || node[1] == '--' || node[1] == '++') { var reference = node[2]; - while (reference[0] != 'name') { + while (reference[0] != 'name' && reference[0] != 'sname') { reference = reference[1]; } reference = reference[1]; @@ -1819,9 +1820,20 @@ function eliminate(ast) { // Run on all functions. traverse(ast, function(node, type) { if ((type == 'defun' || type == 'function') && isGenerated(node[1])) { + // 'hide' X in X[10] so we don't get confused by it - these do not matter to variable effects + traverse(node, function(node, type) { + if (type === 'sub' && node[1][0] == 'name') { + node[1][0] = 'sname'; + } + }); // Run the eliminator - //process.stderr.write (node[1] || '(anonymous)') + '\n' var eliminated = new Eliminator(node).run(); + // Undo X[10] hiding + traverse(node, function(node, type) { + if (type === 'sname') { + node[0] = 'name'; + } + }); // Run the expression optimizer new ExpressionOptimizer(node[3]).run(); } |