From 36b455d9c22265d943d0fdb135be09efc7c7cc6c Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 16 Oct 2013 09:19:43 +0900 Subject: [PATCH] do not pop sp in pic_get_args; OP_CALL takes care of stack unwinding --- src/vm.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vm.c b/src/vm.c index 664cfe1a..36221164 100644 --- a/src/vm.c +++ b/src/vm.c @@ -71,7 +71,7 @@ void pic_get_args(pic_state *pic, const char *format, ...) { char c; - int i = 0; + int i = -1; va_list ap; va_start(ap, format); @@ -82,8 +82,8 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value *p; p = va_arg(ap, pic_value*); - *p = *--pic->sp; - i++; + *p = pic->sp[i]; + i--; } break; case 'f': @@ -91,8 +91,8 @@ pic_get_args(pic_state *pic, const char *format, ...) double *f; f = va_arg(ap, double *); - *f = pic_float(*--pic->sp); - i++; + *f = pic_float(pic->sp[i]); + i--; } break; } @@ -355,7 +355,6 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args) pic_value c; struct pic_proc *proc; pic_callinfo *ci; - int ai = pic_gc_arena_preserve(pic); pic_gc_protect(pic, c = POP()); proc = pic_proc_ptr(c); @@ -363,8 +362,9 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args) ci->proc = proc; ci->argc = pc->u.i; PUSH(proc->u.cfunc(pic)); - pic_gc_arena_restore(pic, ai); + pic->sp -= ci->argc; POPCI(); + pic_gc_arena_restore(pic, ai); NEXT; } CASE(OP_CONS) {