aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-23 19:46:40 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-23 19:46:40 -0700
commite7e425b05f8399157887b9fd0f04a1067ea37e8b (patch)
tree17df8ae28949f458d66b6305c27f1233e5e1d567 /tools/js-optimizer.js
parenta79d6118ba9af2cdcdc17a43ae2d03327c9e87e3 (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.js16
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();
}