aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/js-optimizer.js30
-rw-r--r--tools/test-js-optimizer-output.js21
-rw-r--r--tools/test-js-optimizer.js23
3 files changed, 62 insertions, 12 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 44f560d5..85ad87e6 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -384,14 +384,16 @@ function vacuum(ast) {
var type = node[0];
if (type == 'defun' && isGenerated(node[1])) {
traverse(node, function(node, type) {
- if (type == 'if' && node[2][0] == 'block' && (!node[2][1] || node[2][1].length == 0)) {
+ if (type == 'if' && ((node[2][0] == 'block' && (!node[2][1] || node[2][1].length == 0)) ||
+ jsonCompare(node[2], emptyNode()))) {
more = true;
- if (node[2][2]) { // if there is an else, return that
- return node[2][2];
+ if (node[3]) { // if there is an else, return that
+ return node[3];
} else {
return emptyNode();
}
} else if (type == 'block' && !node[1]) {
+ more = true;
return emptyNode();
} else if (type == 'block' && (node[1].length == 0 || (node[1].length == 1 && jsonCompare(node[1][0], emptyNode())))) {
more = true;
@@ -435,11 +437,18 @@ function vacuum(ast) {
// We can hoist the multiple block into the condition, thus removing code and one 'if' check
function hoistMultiples(ast) {
ast[1].forEach(function(node, i) {
- var type = node[0];
- if (type == 'defun' && isGenerated(node[1])) {
- var statements = node[3];
+ if (!(node[0] == 'defun' && isGenerated(node[1]))) return;
+ traverse(node, function(node, type) {
+ var statements = null;
+ if (type == 'defun') {
+ statements = node[3];
+ } else if (type == 'block') {
+ statements = node[1];
+ }
+ if (!statements) return;
+ var modified = false;
for (var i = 0; i < statements.length-1; i++) {
- var modified = false;
+ var modifiedI = false;
var pre = statements[i];
if (pre[0] != 'if') continue;
var post = statements[i+1];
@@ -484,7 +493,7 @@ function hoistMultiples(ast) {
if (preNode[3][1] == labelNum) {
// That's it! Hoist away
found = true;
- modified = true;
+ modifiedI = true;
postInner[2] = ['block', []];
return ['block', [preNode].concat(labelBlock[1])];
}
@@ -493,11 +502,12 @@ function hoistMultiples(ast) {
}
postInner = postInner[3]; // Proceed to look in the else clause
}
- if (modified) {
+ if (modifiedI) {
statements[i] = shell(pre);
}
}
- }
+ if (modified) return node;
+ });
});
vacuum(ast);
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index 7b5cbae8..295144f2 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -186,4 +186,23 @@ function demangle($cmp) {
final();
}
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle"]
+function lua() {
+ while (1) {
+ do {
+ if ($14) {
+ __label__ = 3;
+ } else {
+ __label__ = 4;
+ var $17 = $i;
+ var $18 = $3;
+ var $19 = $18 + ($17 << 2) | 0;
+ var $20 = HEAP32[$19 >> 2];
+ var $21 = $20 + 1 | 0;
+ var $22 = HEAP8[$21];
+ var $23 = $22 << 24 >> 24;
+ break;
+ }
+ } while (0);
+ }
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle", "lua"]
diff --git a/tools/test-js-optimizer.js b/tools/test-js-optimizer.js
index 30e8234f..185d8f49 100644
--- a/tools/test-js-optimizer.js
+++ b/tools/test-js-optimizer.js
@@ -209,4 +209,25 @@ function demangle($cmp) {
}
} while (0);
}
-// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle"]
+function lua() {
+ $5$98 : while (1) {
+ if ($14) {
+ __label__ = 3;
+ } else {
+ __label__ = 4;
+ }
+ $15$$16$101 : do {
+ if (__label__ == 3) {} else if (__label__ == 4) {
+ var $17 = $i;
+ var $18 = $3;
+ var $19 = $18 + ($17 << 2) | 0;
+ var $20 = HEAP32[$19 >> 2];
+ var $21 = $20 + 1 | 0;
+ var $22 = HEAP8[$21];
+ var $23 = $22 << 24 >> 24;
+ break $15$$16$101;
+ }
+ } while(0);
+ }
+}
+// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle", "lua"]