Skip to content

Instantly share code, notes, and snippets.

@macournoyer
Created April 16, 2009 16:13
Show Gist options
  • Save macournoyer/96496 to your computer and use it in GitHub Desktop.
Save macournoyer/96496 to your computer and use it in GitHub Desktop.
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