aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/js-optimizer.js34
-rw-r--r--tools/test-js-optimizer-output.js10
-rw-r--r--tools/test-js-optimizer.js10
3 files changed, 44 insertions, 10 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 85ad87e6..686d428e 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -359,6 +359,12 @@ function simplifyExpressionsPost(ast) {
// Clear out empty ifs and blocks, and redundant blocks/stats and so forth
function vacuum(ast) {
+ function isEmpty(node) {
+ if (!node) return true;
+ if (jsonCompare(node, emptyNode())) return true;
+ 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) {
@@ -367,7 +373,14 @@ function vacuum(ast) {
function simplifyList(node, i) {
var changed = false;
var pre = node[i].length;
- node[i] = node[i].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
+ node[i] = node[i].filter(function(node) {
+ var type = node[0];
+ if (isEmpty(node)) {
+ return false;
+ }
+ if (jsonCompare(node, emptyNode())) return false;
+ return true;
+ });
if (node[i].length < pre) changed = true;
// Also, seek blocks with single items we can simplify
node[i] = node[i].map(function(subNode) {
@@ -384,20 +397,19 @@ 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)) ||
- jsonCompare(node[2], emptyNode()))) {
- more = true;
- if (node[3]) { // if there is an else, return that
- return node[3];
- } else {
+ if (type == 'if') {
+ if (((node[2][0] == 'block' && (!node[2][1] || node[2][1].length == 0)) ||
+ jsonCompare(node[2], emptyNode())) && !node[3]) {
+ more = true;
return emptyNode();
+ } else if (node[3] && isEmpty(node[3])) {
+ more = true;
+ node[3] = null;
+ return node;
}
} 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;
- return emptyNode();
} else if (type == 'block' && node[1].length == 1 && node[1][0][0] == 'block') {
more = true;
return node[1][0];
@@ -618,6 +630,8 @@ if (metadata) setGeneratedFunctions(metadata);
arguments.forEach(function(arg) {
passes[arg](ast);
});
+//printErr('output: ' + dump(ast));
+//printErr('output: ' + astToSrc(ast));
ast = srcToAst(astToSrc(ast)); // re-parse, to simplify a little
print(astToSrc(ast));
if (metadata) print(metadata + '\n');
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index 295144f2..49ea879d 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -204,5 +204,15 @@ function lua() {
}
} while (0);
}
+ pause();
+ if ($1435 == 0) {
+ __label__ = 176;
+ } else if ($1435 == 1) {} else {
+ __label__ = 180;
+ }
+ pause();
+ if ($1435 == 0) {
+ __label__ = 176;
+ }
}
// 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 185d8f49..31f314e3 100644
--- a/tools/test-js-optimizer.js
+++ b/tools/test-js-optimizer.js
@@ -229,5 +229,15 @@ function lua() {
}
} while(0);
}
+ pause();
+ if ($1435 == 0) {
+ __label__ = 176;
+ } else if ($1435 == 1) {} else {
+ __label__ = 180;
+ }
+ pause();
+ if ($1435 == 0) {
+ __label__ = 176;
+ } else if ($1435 == 1) {}
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting", "demangle", "lua"]