diff options
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index bc13354b..22769bb4 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3020,11 +3020,13 @@ function outline(ast) { for (var v in varInfo.reads) { if (v != 'sp') { reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); + code.unshift(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]); } } reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]); for (var v in varInfo.writes) { reps.push(['stat', ['assign', true, ['name', v], ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]]]]); + code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(asmData, v) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]); } stats.splice.apply(stats, [start, end-start+1].concat(reps)); // Generate new function @@ -3103,7 +3105,8 @@ function outline(ast) { denormalizeAsm(func, asmData); }); - // TODO: control flow: route returns and breaks + // TODO: control flow: route returns and breaks. outlined code should have all breaks/continues/returns break into the outermost scope, + // after setting a state variable, etc. // TODO: recurse into new functions, must be careful though so as to not quickly re-outline and leave an intermediary skeletal function if (newFuncs.length > 0) { |