diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/js-optimizer.js | 34 | ||||
-rw-r--r-- | tools/test-js-optimizer-output.js | 10 | ||||
-rw-r--r-- | tools/test-js-optimizer.js | 10 |
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"] |