aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-27 17:44:52 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-27 17:44:52 -0700
commit9d245102247d798ffef7e003ae4c76c62a875902 (patch)
tree93198b3b50fdf6c2078a3eca172f03b0721f5c8a /tools/js-optimizer.js
parentbdeaabb263dee309d5b64f4765183f056a064d19 (diff)
flip associative binaries when safe to do so for elimination purposes
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js15
1 files changed, 15 insertions, 0 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 855cf6a5..222bd0f4 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -132,6 +132,8 @@ var LOOP = set('do', 'while', 'for');
var LOOP_FLOW = set('break', 'continue');
var ASSIGN_OR_ALTER = set('assign', 'unary-postfix', 'unary-prefix');
var CONTROL_FLOW = set('do', 'while', 'for', 'if', 'switch');
+var NAME_OR_NUM = set('name', 'num');
+var ASSOCIATIVE_BINARIES = set('+', '*', '|', '&', '^');
var NULL_NODE = ['name', 'null'];
var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]];
@@ -1635,8 +1637,21 @@ function eliminate(ast) {
}
}
} else if (type == 'binary') {
+ var flipped = false;
+ if (node[1] in ASSOCIATIVE_BINARIES && !(node[2][0] in NAME_OR_NUM) && node[3][0] in NAME_OR_NUM) { // TODO recurse here?
+ // associatives like + and * can be reordered in the simple case of one of the sides being a name, since we assume they are all just numbers
+ var temp = node[2];
+ node[2] = node[3];
+ node[3] = temp;
+ flipped = true;
+ }
traverseInOrder(node[2]);
traverseInOrder(node[3]);
+ if (flipped && node[2][0] in NAME_OR_NUM) { // dunno if we optimized, but safe to flip back - and keeps the code closer to the original and more readable
+ var temp = node[2];
+ node[2] = node[3];
+ node[3] = temp;
+ }
} else if (type == 'name') {
if (!ignoreName) { // ignoreName means we are the name of something like a call or a sub - irrelevant for us
var name = node[1];