aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-09-17 23:49:08 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-09-17 23:49:08 -0700
commit6654bb5bb6cbd78fff9802922dd2a5001ee006aa (patch)
tree9ba623f61154da53ec47a793aa9be3b418f651b7
parent38d3c35a77d1bb43990726241a7fa02d0f6caaf3 (diff)
restore stack in fprintf to prevent memory issues with lots of printing inside a function
-rw-r--r--src/library.js9
-rw-r--r--src/runtime.js7
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)) {