aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-12-22 15:28:17 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-12-22 15:28:17 -0800
commit8f69b282df06f5c8800226c98776ea27fa1c7f00 (patch)
tree2dc03b0af4bef3f343d65fa4851fc0fbd9b44f7c /tools
parent9c4dcaa0c4648148b8bb96c91108c7e51b9573fa (diff)
improve hoister cleanup a little
Diffstat (limited to 'tools')
-rw-r--r--tools/js-optimizer.js34
-rw-r--r--tools/test-js-optimizer-output.js20
-rw-r--r--tools/test-js-optimizer.js24
3 files changed, 64 insertions, 14 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 0660b20f..126637ec 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -430,10 +430,28 @@ function hoistMultiples(ast) {
});
// Clear out empty ifs and blocks, and redundant blocks/stats
+ var ret;
var more = true;
while (more) {
more = false;
ast[1].forEach(function(node, i) {
+ function simplifyList(node, i) {
+ var changed = false;
+ var pre = node[i].length;
+ node[i] = node[i].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
+ if (node[i].length < pre) changed = true;
+ // Also, seek blocks with single items we can simplify
+ node[i] = node[i].map(function(subNode) {
+ if (subNode[0] == 'block' && typeof subNode[1] == 'object' && subNode[1].length == 1 && subNode[1][0][0] == 'if') {
+ return subNode[1][0];
+ }
+ return subNode;
+ });
+ if (changed) {
+ more = true;
+ return node;
+ }
+ }
var type = node[0];
if (type == 'defun' && isGenerated(node[1])) {
traverse(node, function(node, type) {
@@ -456,23 +474,15 @@ function hoistMultiples(ast) {
more = true;
return node[1];
} else if (type == 'block' && typeof node[1] == 'object') {
- var pre = node[1].length;
- node[1] = node[1].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
- if (node[1].length < pre) {
- more = true;
- return node;
- }
+ 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') {
- var pre = node[3].length;
- node[3] = node[3].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
- if (node[3].length < pre) {
- more = true;
- return node;
- }
+ ret = simplifyList(node, 3);
+ if (ret) return ret;
} else if (type == 'do' && node[1][0] == 'num' && jsonCompare(node[2], emptyNode())) {
more = true;
return emptyNode();
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index 39b91039..7b5cbae8 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -168,4 +168,22 @@ function sleep() {
while (Date.now() - start < msec) {}
return 0;
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting"]
+function demangle($cmp) {
+ do {
+ if ($cmp) {
+ __label__ = 3;
+ } else {
+ __label__ = 1;
+ if (something()) {
+ __label__ = 3;
+ break;
+ }
+ more();
+ break;
+ }
+ } while (0);
+ if (__label__ == 3) {
+ final();
+ }
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle"]
diff --git a/tools/test-js-optimizer.js b/tools/test-js-optimizer.js
index 09cc5472..30e8234f 100644
--- a/tools/test-js-optimizer.js
+++ b/tools/test-js-optimizer.js
@@ -187,4 +187,26 @@ function sleep() {
}
return 0;
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting"]
+function demangle($cmp) {
+ if ($cmp) {
+ __label__ = 3;
+ } else {
+ __label__ = 1;
+ }
+ $if_then$$lor_lhs_false$2 : do {
+ if (__label__ == 1) {
+ if (something()) {
+ __label__ = 3;
+ break $if_then$$lor_lhs_false$2;
+ }
+ more();
+ break $if_then$$lor_lhs_false$2;
+ }
+ } while (0);
+ $if_then$$return$6 : do {
+ if (__label__ == 3) {
+ final();
+ }
+ } while (0);
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle"]