add pic_env struct
This commit is contained in:
parent
f854e225c8
commit
bd851318d1
|
@ -1,6 +1,13 @@
|
||||||
#ifndef PROC_H__
|
#ifndef PROC_H__
|
||||||
#define PROC_H__
|
#define PROC_H__
|
||||||
|
|
||||||
|
struct pic_env {
|
||||||
|
PIC_OBJECT_HEADER
|
||||||
|
pic_value *values;
|
||||||
|
int numcv;
|
||||||
|
struct pic_env *up;
|
||||||
|
};
|
||||||
|
|
||||||
struct pic_proc {
|
struct pic_proc {
|
||||||
PIC_OBJECT_HEADER
|
PIC_OBJECT_HEADER
|
||||||
bool cfunc_p;
|
bool cfunc_p;
|
||||||
|
@ -8,14 +15,15 @@ struct pic_proc {
|
||||||
pic_func_t cfunc;
|
pic_func_t cfunc;
|
||||||
struct pic_irep *irep;
|
struct pic_irep *irep;
|
||||||
} u;
|
} u;
|
||||||
|
struct pic_env *env;
|
||||||
pic_value aux;
|
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(pic_state *, struct pic_irep *, struct pic_env *);
|
||||||
struct pic_proc *pic_proc_new_cfunc(pic_state *, pic_func_t cfunc, pic_value aux);
|
struct pic_proc *pic_proc_new_cfunc(pic_state *, pic_func_t, pic_value);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,7 +31,8 @@ enum pic_tt {
|
||||||
PIC_TT_SYMBOL,
|
PIC_TT_SYMBOL,
|
||||||
PIC_TT_PROC,
|
PIC_TT_PROC,
|
||||||
PIC_TT_PORT,
|
PIC_TT_PORT,
|
||||||
PIC_TT_STRING
|
PIC_TT_STRING,
|
||||||
|
PIC_TT_ENV
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PIC_OBJECT_HEADER \
|
#define PIC_OBJECT_HEADER \
|
||||||
|
|
|
@ -343,6 +343,7 @@ codegen(codegen_state *state, pic_value obj)
|
||||||
irep->clen++;
|
irep->clen++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PIC_TT_ENV:
|
||||||
case PIC_TT_PROC:
|
case PIC_TT_PROC:
|
||||||
case PIC_TT_UNDEF:
|
case PIC_TT_UNDEF:
|
||||||
case PIC_TT_EOF:
|
case PIC_TT_EOF:
|
||||||
|
@ -445,7 +446,7 @@ pic_codegen(pic_state *pic, pic_value obj)
|
||||||
codegen(state, obj);
|
codegen(state, obj);
|
||||||
state->irep->code[state->irep->clen].insn = OP_STOP;
|
state->irep->code[state->irep->clen].insn = OP_STOP;
|
||||||
state->irep->clen++;
|
state->irep->clen++;
|
||||||
proc = pic_proc_new(pic, state->irep);
|
proc = pic_proc_new(pic, state->irep, NULL);
|
||||||
|
|
||||||
destroy_codegen_state(pic, state);
|
destroy_codegen_state(pic, state);
|
||||||
|
|
||||||
|
|
20
src/gc.c
20
src/gc.c
|
@ -159,8 +159,22 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
||||||
case PIC_TT_SYMBOL: {
|
case PIC_TT_SYMBOL: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PIC_TT_ENV: {
|
||||||
|
struct pic_env *env = (struct pic_env *)obj;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < env->numcv; ++i) {
|
||||||
|
gc_mark(pic, env->values[i]);
|
||||||
|
}
|
||||||
|
gc_mark_object(pic, (struct pic_object *)env->up);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PIC_TT_PROC: {
|
case PIC_TT_PROC: {
|
||||||
gc_mark(pic, ((struct pic_proc *)obj)->aux);
|
struct pic_proc *proc = (struct pic_proc *)obj;
|
||||||
|
if (proc->env) {
|
||||||
|
gc_mark_object(pic, (struct pic_object *)proc->env);
|
||||||
|
}
|
||||||
|
gc_mark(pic, proc->aux);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PIC_TT_PORT: {
|
case PIC_TT_PORT: {
|
||||||
|
@ -268,6 +282,10 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
|
||||||
case PIC_TT_PAIR: {
|
case PIC_TT_PAIR: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PIC_TT_ENV: {
|
||||||
|
pic_free(pic, ((struct pic_env *)obj)->values);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PIC_TT_PROC: {
|
case PIC_TT_PROC: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,8 @@ write(pic_state *pic, pic_value obj)
|
||||||
write_str(pic, pic_str_ptr(obj));
|
write_str(pic, pic_str_ptr(obj));
|
||||||
printf("\"");
|
printf("\"");
|
||||||
break;
|
break;
|
||||||
|
case PIC_TT_ENV:
|
||||||
|
pic_abort(pic, "logic flaw");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,14 @@
|
||||||
#include "picrin/irep.h"
|
#include "picrin/irep.h"
|
||||||
|
|
||||||
struct pic_proc *
|
struct pic_proc *
|
||||||
pic_proc_new(pic_state *pic, struct pic_irep *irep)
|
pic_proc_new(pic_state *pic, struct pic_irep *irep, struct pic_env *env)
|
||||||
{
|
{
|
||||||
struct pic_proc *proc;
|
struct pic_proc *proc;
|
||||||
|
|
||||||
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
|
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
|
||||||
proc->cfunc_p = false;
|
proc->cfunc_p = false;
|
||||||
proc->u.irep = irep;
|
proc->u.irep = irep;
|
||||||
|
proc->env = env;
|
||||||
proc->aux = pic_undef_value();
|
proc->aux = pic_undef_value();
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
@ -22,6 +23,7 @@ pic_proc_new_cfunc(pic_state *pic, pic_func_t cfunc, pic_value aux)
|
||||||
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
|
proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc *), PIC_TT_PROC);
|
||||||
proc->cfunc_p = true;
|
proc->cfunc_p = true;
|
||||||
proc->u.cfunc = cfunc;
|
proc->u.cfunc = cfunc;
|
||||||
|
proc->env = NULL;
|
||||||
proc->aux = aux;
|
proc->aux = aux;
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
6
src/vm.c
6
src/vm.c
|
@ -241,8 +241,12 @@ 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;
|
||||||
|
struct pic_env *env;
|
||||||
|
|
||||||
proc = pic_proc_new(pic, pic->irep[pc->u.i]);
|
env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env), PIC_TT_ENV);
|
||||||
|
env->up = pic_proc_ptr(*pic->ci->fp)->env;
|
||||||
|
|
||||||
|
proc = pic_proc_new(pic, pic->irep[pc->u.i], env);
|
||||||
PUSH(pic_obj_value(proc));
|
PUSH(pic_obj_value(proc));
|
||||||
pic_gc_arena_restore(pic, ai);
|
pic_gc_arena_restore(pic, ai);
|
||||||
NEXT;
|
NEXT;
|
||||||
|
|
Loading…
Reference in New Issue