Created
April 16, 2009 16:13
-
-
Save macournoyer/96496 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/vm/string.c b/vm/string.c | |
index 64fa97e..9e8dd3e 100644 | |
--- a/vm/string.c | |
+++ b/vm/string.c | |
@@ -1,3 +1,4 @@ | |
+#include <alloca.h> | |
#include <stdarg.h> | |
#include <stdio.h> | |
#include "tr.h" | |
@@ -124,14 +125,11 @@ OBJ tr_sprintf(VM, const char *fmt, ...) { | |
va_list arg; | |
va_start(arg, fmt); | |
int len = vsnprintf(NULL, 0, fmt, arg); | |
- /* HACK causes Bus error in Bohem GC */ | |
- /* char *ptr = TR_ALLOC_N(char, len); */ | |
- char ptr[4096]; assert(len < 4096); | |
+ char *ptr = alloca(sizeof(char) * len); | |
va_end(arg); | |
va_start(arg, fmt); | |
vsprintf(ptr, fmt, arg); | |
va_end(arg); | |
- /* TODO do not allocate twice */ | |
OBJ str = TrString_new(vm, ptr, len); | |
TR_FREE(ptr); | |
return str; | |
diff --git a/vm/vm.c b/vm/vm.c | |
index 79cfcc0..1c76488 100644 | |
--- a/vm/vm.c | |
+++ b/vm/vm.c | |
@@ -129,15 +129,16 @@ static inline OBJ TrVM_yield(VM, TrFrame *f, int argc, OBJ argv[]) { | |
#define SITE (b->sites.a) | |
static OBJ TrVM_interpret(VM, register TrFrame *f, TrBlock *b, int start, int argc, OBJ argv[], TrClosure *closure) { | |
+ OBJ *stacka = alloca(sizeof(OBJ) * b->regc); | |
#if TR_USE_MACHINE_REGS && __i386__ | |
register TrInst *ip __asm__ ("esi") = b->code.a + start; | |
- register OBJ *stack __asm__ ("edi") = f->stack; | |
+ register OBJ *stack __asm__ ("edi") = stacka; | |
#elif TR_USE_MACHINE_REGS && __x86_64__ | |
register TrInst *ip __asm__ ("r15") = b->code.a + start; | |
- register OBJ *stack __asm__ ("r14") = f->stack; | |
+ register OBJ *stack __asm__ ("r14") = stacka; | |
#else | |
register TrInst *ip = b->code.a + start; | |
- register OBJ *stack = f->stack; | |
+ register OBJ *stack = stacka; | |
#endif | |
TrInst i = *ip; | |
OBJ *k = b->k.a; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment