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