aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-14 19:24:15 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-14 19:24:15 -0800
commitcbfc5e7fdbb463042e9ca2b2aff4f7541e511e30 (patch)
tree5fc84a206731a5545d97716edf07e8de319e78a4 /tools/js-optimizer.js
parent8fedb0f64eea5030fac2c1e7c996da07c0d99bd2 (diff)
optimize hoistMultiples with a switch
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js95
1 files changed, 56 insertions, 39 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 30355325..2b924ddf 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -790,7 +790,6 @@ function vacuum(ast) {
if (node[0] == 'block' && (!node[1] || (typeof node[1] != 'object') || node[1].length == 0 || (node[1].length == 1 && isEmpty(node[1])))) return true;
return false;
}
- var ret;
var more = true;
while (more) {
more = false;
@@ -814,47 +813,65 @@ function vacuum(ast) {
traverseGeneratedFunctions(ast, function(node) {
simplifyNotComps(node);
traverse(node, function(node, type) {
- if (type == 'block' && node[1] && node[1].length == 1 && node[1][0][0] == 'block') {
- more = true;
- return node[1][0];
- } else if (type == 'stat' && node[1][0] == 'block') {
- more = true;
- return node[1];
- } else if (type == 'block' && typeof node[1] == 'object') {
- ret = simplifyList(node, 1);
- if (ret) return ret;
- } else if (type == 'defun' && node[3].length == 1 && node[3][0][0] == 'block') {
- more = true;
- node[3] = node[3][0][1];
- return node;
- } else if (type == 'defun') {
- ret = simplifyList(node, 3);
- if (ret) return ret;
- } else if (type == 'do' && node[1][0] == 'num' && node[2][0] == 'toplevel' && (!node[2][1] || node[2][1].length == 0)) {
- more = true;
- return emptyNode();
- } else if (type == 'label' && node[2][0] == 'toplevel' && (!node[2][1] || node[2][1].length == 0)) {
- more = true;
- return emptyNode();
- } else if (type == 'if') {
- var empty2 = isEmpty(node[2]), empty3 = isEmpty(node[3]), has3 = node.length == 4;
- if (!empty2 && empty3 && has3) { // empty else clauses
- more = true;
- return node.slice(0, 3);
- } else if (empty2 && !empty3) { // empty if blocks
- more = true;
- return ['if', ['unary-prefix', '!', node[1]], node[3]];
- } else if (empty2 && empty3) {
- more = true;
- if (hasSideEffects(node[1])) {
- return ['stat', node[1]];
+ var ret;
+ switch(type) {
+ case 'block': {
+ if (node[1] && node[1].length == 1 && node[1][0][0] == 'block') {
+ more = true;
+ return node[1][0];
+ } else if (typeof node[1] == 'object') {
+ ret = simplifyList(node, 1);
+ if (ret) return ret;
+ }
+ } break;
+ case 'stat': {
+ if (node[1][0] == 'block') {
+ more = true;
+ return node[1];
+ }
+ } break;
+ case 'defun': {
+ if (node[3].length == 1 && node[3][0][0] == 'block') {
+ more = true;
+ node[3] = node[3][0][1];
+ return node;
} else {
+ ret = simplifyList(node, 3);
+ if (ret) return ret;
+ }
+ } break;
+ case 'do': {
+ if (node[1][0] == 'num' && node[2][0] == 'toplevel' && (!node[2][1] || node[2][1].length == 0)) {
+ more = true;
+ return emptyNode();
+ } else if (isEmpty(node[2]) && !hasSideEffects(node[1])) {
+ more = true;
return emptyNode();
}
- }
- } else if (type == 'do' && isEmpty(node[2]) && !hasSideEffects(node[1])) {
- more = true;
- return emptyNode();
+ } break;
+ case 'label': {
+ if (node[2][0] == 'toplevel' && (!node[2][1] || node[2][1].length == 0)) {
+ more = true;
+ return emptyNode();
+ }
+ } break;
+ case 'if': {
+ var empty2 = isEmpty(node[2]), empty3 = isEmpty(node[3]), has3 = node.length == 4;
+ if (!empty2 && empty3 && has3) { // empty else clauses
+ more = true;
+ return node.slice(0, 3);
+ } else if (empty2 && !empty3) { // empty if blocks
+ more = true;
+ return ['if', ['unary-prefix', '!', node[1]], node[3]];
+ } else if (empty2 && empty3) {
+ more = true;
+ if (hasSideEffects(node[1])) {
+ return ['stat', node[1]];
+ } else {
+ return emptyNode();
+ }
+ }
+ } break;
}
});
});