add pic_func struct to hold native function name
This commit is contained in:
parent
bb93a8be14
commit
06a7b0f5f6
|
@ -9,6 +9,12 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* native C function */
|
||||
struct pic_func {
|
||||
pic_func_t f;
|
||||
pic_sym name;
|
||||
};
|
||||
|
||||
struct pic_env {
|
||||
PIC_OBJECT_HEADER
|
||||
pic_value *values;
|
||||
|
@ -18,22 +24,26 @@ struct pic_env {
|
|||
|
||||
struct pic_proc {
|
||||
PIC_OBJECT_HEADER
|
||||
bool cfunc_p;
|
||||
char kind;
|
||||
union {
|
||||
pic_func_t cfunc;
|
||||
struct pic_func func;
|
||||
struct pic_irep *irep;
|
||||
} u;
|
||||
struct pic_env *env;
|
||||
};
|
||||
|
||||
#define PIC_PROC_KIND_FUNC 1
|
||||
#define PIC_PROC_KIND_IREP 2
|
||||
|
||||
#define pic_proc_func_p(proc) ((proc)->kind == PIC_PROC_KIND_FUNC)
|
||||
#define pic_proc_irep_p(proc) ((proc)->kind == PIC_PROC_KIND_IREP)
|
||||
|
||||
#define pic_proc_p(o) (pic_type(o) == PIC_TT_PROC)
|
||||
#define pic_env_p(o) (pic_type(o) == PIC_TT_ENV)
|
||||
|
||||
#define pic_proc_ptr(o) ((struct pic_proc *)pic_ptr(o))
|
||||
#define pic_env_ptr(o) ((struct pic_env *)pic_ptr(o))
|
||||
|
||||
#define pic_proc_cfunc_p(o) (pic_proc_ptr(o)->cfunc_p)
|
||||
|
||||
struct pic_proc *pic_proc_new(pic_state *, pic_func_t);
|
||||
struct pic_proc *pic_proc_new_irep(pic_state *, struct pic_irep *, struct pic_env *);
|
||||
|
||||
|
|
2
src/gc.c
2
src/gc.c
|
@ -356,7 +356,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
|||
if (proc->env) {
|
||||
gc_mark_object(pic, (struct pic_object *)proc->env);
|
||||
}
|
||||
if (! proc->cfunc_p) {
|
||||
if (pic_proc_irep_p(proc)) {
|
||||
gc_mark_object(pic, (struct pic_object *)proc->u.irep);
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -8,13 +8,14 @@
|
|||
#include "picrin/irep.h"
|
||||
|
||||
struct pic_proc *
|
||||
pic_proc_new(pic_state *pic, pic_func_t cfunc)
|
||||
pic_proc_new(pic_state *pic, pic_func_t func)
|
||||
{
|
||||
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->kind = PIC_PROC_KIND_FUNC;
|
||||
proc->u.func.f = func;
|
||||
proc->u.func.name = pic_intern_cstr(pic, "(no name)");
|
||||
proc->env = NULL;
|
||||
return proc;
|
||||
}
|
||||
|
@ -25,7 +26,7 @@ pic_proc_new_irep(pic_state *pic, struct pic_irep *irep, struct pic_env *env)
|
|||
struct pic_proc *proc;
|
||||
|
||||
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC);
|
||||
proc->cfunc_p = false;
|
||||
proc->kind = PIC_PROC_KIND_IREP;
|
||||
proc->u.irep = irep;
|
||||
proc->env = env;
|
||||
return proc;
|
||||
|
|
|
@ -50,7 +50,10 @@ get_var_from_proc(pic_state *pic, struct pic_proc *proc)
|
|||
{
|
||||
pic_value v;
|
||||
|
||||
if (! proc->cfunc_p) {
|
||||
if (! pic_proc_p(v)) {
|
||||
goto typeerror;
|
||||
}
|
||||
if (! pic_proc_func_p(pic_proc_ptr(v))) {
|
||||
goto typeerror;
|
||||
}
|
||||
if (pic_proc_cv_size(pic, proc) != 1) {
|
||||
|
|
8
src/vm.c
8
src/vm.c
|
@ -480,7 +480,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv)
|
|||
pic_error(pic, "logic flaw");
|
||||
}
|
||||
irep = pic_proc_ptr(self)->u.irep;
|
||||
if (pic_proc_cfunc_p(self)) {
|
||||
if (! pic_proc_irep_p(pic_proc_ptr(self))) {
|
||||
pic_error(pic, "logic flaw");
|
||||
}
|
||||
PUSH(irep->pool[c.u.i]);
|
||||
|
@ -590,10 +590,10 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv)
|
|||
ci->ip = pic->ip;
|
||||
ci->fp = pic->sp - c.u.i;
|
||||
ci->env = NULL;
|
||||
if (pic_proc_cfunc_p(x)) {
|
||||
if (pic_proc_func_p(pic_proc_ptr(x))) {
|
||||
|
||||
/* invoke! */
|
||||
pic->sp[0] = proc->u.cfunc(pic);
|
||||
pic->sp[0] = proc->u.func.f(pic);
|
||||
pic->sp += ci->retc;
|
||||
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
|
@ -702,7 +702,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv)
|
|||
pic_error(pic, "logic flaw");
|
||||
}
|
||||
irep = pic_proc_ptr(self)->u.irep;
|
||||
if (pic_proc_cfunc_p(self)) {
|
||||
if (! pic_proc_irep_p(pic_proc_ptr(self))) {
|
||||
pic_error(pic, "logic flaw");
|
||||
}
|
||||
proc = pic_proc_new_irep(pic, irep->irep[c.u.i], pic->ci->env);
|
||||
|
|
Loading…
Reference in New Issue