diff options
author | Ryan Kelly <ryan@rfk.id.au> | 2014-01-28 18:57:41 +1100 |
---|---|---|
committer | Ryan Kelly <ryan@rfk.id.au> | 2014-01-31 19:12:10 +1100 |
commit | 2ca9e8491f856262c87c708ca43599e4677cf0cf (patch) | |
tree | a0501f7564068aaa4239882650c6bf5743b97b49 /tools/js-optimizer.js | |
parent | 08077d5b5f32366e378e45417c1b5f320a5b37e2 (diff) |
Add return-type tracking to normalizeAsm/denormlizeAsm
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index a67af7d0..4ad2b524 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1593,6 +1593,7 @@ function normalizeAsm(func) { params: {}, // ident => ASM_* type vars: {}, // ident => ASM_* type inlines: [], // list of inline assembly copies + ret: undefined, }; // process initial params var stats = func[3]; @@ -1629,7 +1630,7 @@ function normalizeAsm(func) { } i++; } - // finally, look for other var definitions and collect them + // look for other var definitions and collect them while (i < stats.length) { traverse(stats[i], function(node, type) { if (type === 'var') { @@ -1658,6 +1659,11 @@ function normalizeAsm(func) { }); i++; } + // look for final 'return' statement to get return type. + var retStmt = stats[stats.length - 1]; + if (retStmt && retStmt[0] === 'return' && retStmt[1]) { + data.ret = detectAsmCoercion(retStmt[1]); + } //printErr('normalized \n\n' + astToSrc(func) + '\n\nwith: ' + JSON.stringify(data)); return data; } @@ -1710,6 +1716,17 @@ function denormalizeAsm(func, data) { } }); } + // ensure that there's a final 'return' statement if needed. + if (data.ret !== undefined) { + var retStmt = stats[stats.length - 1]; + if (!retStmt || retStmt[0] !== 'return') { + var retVal = ['num', 0]; + if (data.ret !== ASM_INT) { + retVal = makeAsmCoercion(retVal, data.ret); + } + stats.push(['return', retVal]); + } + } //printErr('denormalized \n\n' + astToSrc(func) + '\n\n'); } @@ -2050,6 +2067,7 @@ function registerize(ast) { params: {}, vars: {}, inlines: asmData.inlines, + ret: asmData.ret, }; for (var i = 1; i < nextReg; i++) { var reg = fullNames[i]; @@ -3096,6 +3114,7 @@ function registerizeHarder(ast) { params: {}, vars: {}, inlines: asmData.inlines, + ret: asmData.ret, }; for (var i = 1; i < nextReg; i++) { var reg; |