add aux object field to proc object

This commit is contained in:
Yuichi Nishiwaki 2013-10-21 17:35:14 +09:00
parent 72a6e90d83
commit f5154625ba
5 changed files with 37 additions and 10 deletions

View File

@ -10,13 +10,17 @@ struct pic_proc {
PIC_OBJECT_HEADER PIC_OBJECT_HEADER
bool cfunc_p; bool cfunc_p;
union { union {
pic_value (*cfunc)(pic_state *); pic_func_t cfunc;
struct pic_irep *irep; struct pic_irep *irep;
} u; } u;
pic_value aux;
}; };
#define pic_proc_ptr(o) ((struct pic_proc *)o.u.data) #define pic_proc_ptr(o) ((struct pic_proc *)o.u.data)
#define pic_proc_cfunc_p(o) (pic_proc_ptr(o)->cfunc_p) #define pic_proc_cfunc_p(o) (pic_proc_ptr(o)->cfunc_p)
struct pic_proc *pic_proc_new(pic_state *, struct pic_irep *irep);
struct pic_proc *pic_proc_new_cfunc(pic_state *, pic_func_t cfunc, pic_value aux);
#endif #endif

View File

@ -77,9 +77,7 @@ pic_defun(pic_state *pic, const char *name, pic_func_t cfunc)
struct pic_proc *proc; struct pic_proc *proc;
int idx; int idx;
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); proc = pic_proc_new_cfunc(pic, cfunc, pic_undef_value());
proc->cfunc_p = true;
proc->u.cfunc = cfunc;
idx = env_global_define(pic, pic_intern_cstr(pic, name)); idx = env_global_define(pic, pic_intern_cstr(pic, name));
pic->globals[idx] = pic_obj_value(proc); pic->globals[idx] = pic_obj_value(proc);
} }
@ -458,9 +456,8 @@ pic_codegen(pic_state *pic, pic_value obj, struct pic_env *env)
struct pic_proc *proc; struct pic_proc *proc;
struct pic_irep *irep; struct pic_irep *irep;
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); irep = new_irep(pic);
proc->cfunc_p = false; proc = pic_proc_new(pic, irep);
proc->u.irep = irep = new_irep(pic);
if (! pic->jmp) { if (! pic->jmp) {
jmp_buf jmp; jmp_buf jmp;

View File

@ -148,6 +148,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
break; break;
} }
case PIC_TT_PROC: { case PIC_TT_PROC: {
gc_mark(pic, ((struct pic_proc *)obj)->aux);
break; break;
} }
case PIC_TT_PORT: { case PIC_TT_PORT: {

27
src/proc.c Normal file
View File

@ -0,0 +1,27 @@
#include "picrin.h"
#include "picrin/proc.h"
#include "picrin/irep.h"
struct pic_proc *
pic_proc_new(pic_state *pic, struct pic_irep *irep)
{
struct pic_proc *proc;
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
proc->cfunc_p = false;
proc->u.irep = irep;
proc->aux = pic_undef_value();
return proc;
}
struct pic_proc *
pic_proc_new_cfunc(pic_state *pic, pic_func_t cfunc, pic_value aux)
{
struct pic_proc *proc;
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
proc->cfunc_p = true;
proc->u.cfunc = cfunc;
proc->aux = aux;
return proc;
}

View File

@ -222,9 +222,7 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
CASE(OP_LAMBDA) { CASE(OP_LAMBDA) {
struct pic_proc *proc; struct pic_proc *proc;
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC); proc = pic_proc_new(pic, pic->irep[pc->u.i]);
proc->cfunc_p = false;
proc->u.irep = pic->irep[pc->u.i];
PUSH(pic_obj_value(proc)); PUSH(pic_obj_value(proc));
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);
NEXT; NEXT;