diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-09-06 15:57:04 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-09-06 15:57:04 -0700 |
commit | 5e2b4f6ae51bfb2f647495682342e74b90e24c67 (patch) | |
tree | 1a29b0efeaf53e1deb4d763e5de07b2ecb13513a /tools/js-optimizer.js | |
parent | 1f284276592de2b494dd78be09acda0868d24baf (diff) |
handle inline assembly more carefully, avoid it being seen by asm optimizations entirely, and mark it as unsupported in non-le32
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 21b19fd3..7358e1df 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1564,6 +1564,7 @@ function normalizeAsm(func) { var data = { params: {}, // ident => ASM_* type vars: {}, // ident => ASM_* type + inlines: [], // list of inline assembly copies }; // process initial params var stats = func[3]; @@ -1588,7 +1589,7 @@ function normalizeAsm(func) { var name = v[0]; var value = v[1]; if (!(name in data.vars)) { - if (!(value[0] === 'num' || (value[0] === 'unary-prefix' && value[2][0] === 'num'))) break outer; // must be valid coercion no-op + assert(value[0] === 'num' || (value[0] === 'unary-prefix' && value[2][0] === 'num')); // must be valid coercion no-op data.vars[name] = detectAsmCoercion(value); v.length = 1; // make an un-assigning var } else { @@ -1621,6 +1622,10 @@ function normalizeAsm(func) { node[0] = 'name'; node[1] = 'Math_' + node[2]; } + } else if (type === 'call' && node[1][0] === 'function') { + assert(!node[1][1]); // anonymous functions only + data.inlines.push(node[1]); + node[1] = ['name', 'inlinejs']; // empty out body, leave arguments, so they are eliminated/minified properly } }); i++; @@ -1669,6 +1674,14 @@ function denormalizeAsm(func, data) { } else { stats[next] = emptyNode(); } + if (data.inlines.length > 0) { + var i = 0; + traverse(func, function(node, type) { + if (type === 'call' && node[1][0] === 'name' && node[1][1] === 'inlinejs') { + node[1] = data.inlines[i++]; // swap back in the body + } + }); + } //printErr('denormalized \n\n' + astToSrc(func) + '\n\n'); } @@ -2019,6 +2032,7 @@ function registerize(ast) { var finalAsmData = { params: {}, vars: {}, + inlines: asmData.inlines, }; for (var i = 1; i < nextReg; i++) { var reg = fullNames[i]; |