diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-09-17 23:49:08 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-09-17 23:49:08 -0700 |
commit | 6654bb5bb6cbd78fff9802922dd2a5001ee006aa (patch) | |
tree | 9ba623f61154da53ec47a793aa9be3b418f651b7 | |
parent | 38d3c35a77d1bb43990726241a7fa02d0f6caaf3 (diff) |
restore stack in fprintf to prevent memory issues with lots of printing inside a function
-rw-r--r-- | src/library.js | 9 | ||||
-rw-r--r-- | src/runtime.js | 7 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/library.js b/src/library.js index 1f32678d..f177ce35 100644 --- a/src/library.js +++ b/src/library.js @@ -3069,7 +3069,10 @@ LibraryManager.library = { // int fprintf(FILE *restrict stream, const char *restrict format, ...); // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html var result = __formatString(format, varargs); - return _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream); + var stack = Runtime.stackSave(); + var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream); + Runtime.stackRestore(stack); + return ret; }, printf__deps: ['fprintf'], printf: function(format, varargs) { @@ -4118,14 +4121,14 @@ LibraryManager.library = { if (!self.LLVM_SAVEDSTACKS) { self.LLVM_SAVEDSTACKS = []; } - self.LLVM_SAVEDSTACKS.push(STACKTOP); + self.LLVM_SAVEDSTACKS.push(Runtime.stackSave()); return self.LLVM_SAVEDSTACKS.length-1; }, llvm_stackrestore: function(p) { var self = _llvm_stacksave; var ret = self.LLVM_SAVEDSTACKS[p]; self.LLVM_SAVEDSTACKS.splice(p, 1); - return ret; + Runtime.stackRestore(ret); }, __cxa_pure_virtual: function() { diff --git a/src/runtime.js b/src/runtime.js index 719be637..dcb10de9 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -72,6 +72,13 @@ function unInline(name_, params) { } Runtime = { + stackSave: function() { + return STACKTOP; + }, + stackRestore: function(stackTop) { + STACKTOP = stackTop; + }, + forceAlign: function(target, quantum) { quantum = quantum || QUANTUM_SIZE; if (isNumber(target) && isNumber(quantum)) { |