add callinfo
This commit is contained in:
parent
ea6230e90c
commit
22abdae12a
|
@ -7,11 +7,19 @@
|
|||
#include "picconf.h"
|
||||
#include "picrin/value.h"
|
||||
|
||||
typedef struct pic_callinfo {
|
||||
struct pic_proc *proc;
|
||||
int argc;
|
||||
} pic_callinfo;
|
||||
|
||||
typedef struct {
|
||||
pic_value *sp;
|
||||
pic_value *stbase, *stend;
|
||||
|
||||
pic_value sDEFINE, sCONS;
|
||||
pic_callinfo *ci;
|
||||
pic_callinfo *cibase, *ciend;
|
||||
|
||||
pic_value sADD, sSUB, sMUL, sDIV;
|
||||
struct pic_env *global_env;
|
||||
|
||||
|
|
|
@ -29,6 +29,10 @@ pic_open()
|
|||
pic->stbase = pic->sp = (pic_value *)malloc(sizeof(pic_value) * PIC_STACK_SIZE);
|
||||
pic->stend = pic->stbase + PIC_STACK_SIZE;
|
||||
|
||||
/* callinfo */
|
||||
pic->cibase = pic->ci = (pic_callinfo *)malloc(sizeof(pic_callinfo) * PIC_STACK_SIZE);
|
||||
pic->ciend = pic->ciend + PIC_STACK_SIZE;
|
||||
|
||||
/* memory heap */
|
||||
pic->heap = (struct heap_page *)malloc(sizeof(struct heap_page));
|
||||
init_heap_page(pic->heap);
|
||||
|
|
10
src/vm.c
10
src/vm.c
|
@ -317,6 +317,9 @@ pic_codegen(pic_state *pic, pic_value obj, struct pic_env *env)
|
|||
#define PUSH(v) (*pic->sp++ = (v))
|
||||
#define POP() (*--pic->sp)
|
||||
|
||||
#define PUSHCI() (++pic->ci)
|
||||
#define POPCI() (pic->ci--)
|
||||
|
||||
pic_value
|
||||
pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
{
|
||||
|
@ -324,6 +327,8 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
|||
int ai = pic_gc_arena_preserve(pic);
|
||||
|
||||
pc = proc->u.irep->code;
|
||||
pic->ci->proc = proc;
|
||||
pic->ci->argc = 0;
|
||||
|
||||
VM_LOOP {
|
||||
CASE(OP_PUSHNIL) {
|
||||
|
@ -349,12 +354,17 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
|||
CASE(OP_CALL) {
|
||||
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);
|
||||
ci = PUSHCI();
|
||||
ci->proc = proc;
|
||||
ci->argc = pc->u.i;
|
||||
PUSH(proc->u.cfunc(pic));
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
POPCI();
|
||||
NEXT;
|
||||
}
|
||||
CASE(OP_CONS) {
|
||||
|
|
Loading…
Reference in New Issue