diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-08-09 14:27:10 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-08-09 14:54:31 -0700 |
commit | 11dcd5afe75a5079c01c1c3e1126d6da433a2967 (patch) | |
tree | 9733ed3c12e7233500f6e0dd8257d1b4ce926936 /src/jsifier.js | |
parent | 4ae35bd2e1fe6e4fedffe90019f1ef6b06fa15c7 (diff) |
clean up stack space allocated by a varargs function call immediately after it; fixes #1492
Diffstat (limited to 'src/jsifier.js')
-rw-r--r-- | src/jsifier.js | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 1d70fd6f..c92526d2 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1238,6 +1238,7 @@ function JSify(data, functionsOnly, givenFunctions) { + (EXCEPTION_DEBUG ? 'Module.print("Exception: " + e + ", currently at: " + (new Error().stack)); ' : '') + 'return null } })();'; } + ret = makeVarArgsCleanup(ret); if (item.assignTo) { ret = 'var ' + item.assignTo + ' = ' + ret; @@ -1562,10 +1563,24 @@ function JSify(data, functionsOnly, givenFunctions) { return ret; } + + function makeVarArgsCleanup(js) { + if (js.indexOf('(tempVarArgs=') >= 0) { + if (js[js.length-1] == ';') { + return js + ' STACKTOP=tempVarArgs;'; + } else { + assert(js.indexOf(';') < 0); + return '((' + js + '), STACKTOP=tempVarArgs)'; + } + } + return js; + } + makeFuncLineActor('getelementptr', function(item) { return finalizeLLVMFunctionCall(item) }); makeFuncLineActor('call', function(item) { if (item.standalone && LibraryManager.isStubFunction(item.ident)) return ';'; - return makeFunctionCall(item.ident, item.params, item.funcData, item.type, false, !!item.assignTo || !item.standalone) + (item.standalone ? ';' : ''); + var ret = makeFunctionCall(item.ident, item.params, item.funcData, item.type, false, !!item.assignTo || !item.standalone) + (item.standalone ? ';' : ''); + return makeVarArgsCleanup(ret); }); makeFuncLineActor('unreachable', function(item) { |