Merge branch 'cv-to-use-attr'

This commit is contained in:
Yuichi Nishiwaki 2014-07-17 16:32:02 +09:00
commit f23aebb29a
3 changed files with 12 additions and 79 deletions

View File

@ -51,15 +51,9 @@ struct pic_proc *pic_proc_new_irep(pic_state *, struct pic_irep *, struct pic_en
pic_sym pic_proc_name(struct pic_proc *);
struct pic_dict *pic_proc_attr(pic_state *, struct pic_proc *);
/* closed variables accessor */
void pic_proc_cv_init(pic_state *, struct pic_proc *, size_t);
int pic_proc_cv_size(pic_state *, struct pic_proc *);
pic_value pic_proc_cv_ref(pic_state *, struct pic_proc *, size_t);
void pic_proc_cv_set(pic_state *, struct pic_proc *, size_t, pic_value);
struct pic_proc *pic_papply(pic_state *, struct pic_proc *, pic_value);
struct pic_dict *pic_attr(pic_state *, struct pic_proc *);
pic_value pic_attr_ref(pic_state *, struct pic_proc *, const char *);
void pic_attr_set(pic_state *, struct pic_proc *, const char *, pic_value);
#if defined(__cplusplus)
}

View File

@ -221,7 +221,7 @@ cont_call(pic_state *pic)
proc = pic_get_proc(pic);
pic_get_args(pic, "*", &argc, &argv);
cont = (struct pic_cont *)pic_ptr(pic_proc_cv_ref(pic, proc, 0));
cont = (struct pic_cont *)pic_ptr(pic_attr_ref(pic, proc, "@@cont"));
cont->results = pic_list_by_array(pic, argc, argv);
/* execute guard handlers */
@ -245,8 +245,7 @@ pic_callcc(pic_state *pic, struct pic_proc *proc)
c = pic_proc_new(pic, cont_call, "<continuation-procedure>");
/* save the continuation object in proc */
pic_proc_cv_init(pic, c, 1);
pic_proc_cv_set(pic, c, 0, pic_obj_value(cont));
pic_attr_set(pic, c, "@@cont", pic_obj_value(cont));
return pic_apply1(pic, proc, pic_obj_value(c));
}
@ -267,8 +266,7 @@ pic_callcc_trampoline(pic_state *pic, struct pic_proc *proc)
c = pic_proc_new(pic, cont_call, "<continuation-procedure>");
/* save the continuation object in proc */
pic_proc_cv_init(pic, c, 1);
pic_proc_cv_set(pic, c, 0, pic_obj_value(cont));
pic_attr_set(pic, c, "@@cont", pic_obj_value(cont));
return pic_apply_trampoline(pic, proc, pic_list1(pic, pic_obj_value(c)));
}

View File

@ -50,7 +50,7 @@ pic_proc_name(struct pic_proc *proc)
}
struct pic_dict *
pic_proc_attr(pic_state *pic, struct pic_proc *proc)
pic_attr(pic_state *pic, struct pic_proc *proc)
{
if (proc->attr == NULL) {
proc->attr = pic_dict_new(pic);
@ -58,75 +58,16 @@ pic_proc_attr(pic_state *pic, struct pic_proc *proc)
return proc->attr;
}
void
pic_proc_cv_init(pic_state *pic, struct pic_proc *proc, size_t cv_size)
{
struct pic_env *env;
if (proc->env != NULL) {
pic_error(pic, "env slot already in use");
}
env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env), PIC_TT_ENV);
env->regc = cv_size;
env->regs = (pic_value *)pic_calloc(pic, cv_size, sizeof(pic_value));
env->up = NULL;
proc->env = env;
}
int
pic_proc_cv_size(pic_state *pic, struct pic_proc *proc)
{
UNUSED(pic);
return proc->env ? proc->env->regc : 0;
}
pic_value
pic_proc_cv_ref(pic_state *pic, struct pic_proc *proc, size_t i)
pic_attr_ref(pic_state *pic, struct pic_proc *proc, const char *key)
{
if (proc->env == NULL) {
pic_error(pic, "no closed env");
}
return proc->env->regs[i];
return pic_dict_ref(pic, pic_attr(pic, proc), pic_intern_cstr(pic, key));
}
void
pic_proc_cv_set(pic_state *pic, struct pic_proc *proc, size_t i, pic_value v)
pic_attr_set(pic_state *pic, struct pic_proc *proc, const char *key, pic_value v)
{
if (proc->env == NULL) {
pic_error(pic, "no closed env");
}
proc->env->regs[i] = v;
}
static pic_value
papply_call(pic_state *pic)
{
size_t argc;
pic_value *argv, arg, arg_list;
struct pic_proc *proc;
pic_get_args(pic, "*", &argc, &argv);
proc = pic_proc_ptr(pic_proc_cv_ref(pic, pic_get_proc(pic), 0));
arg = pic_proc_cv_ref(pic, pic_get_proc(pic), 1);
arg_list = pic_list_by_array(pic, argc, argv);
arg_list = pic_cons(pic, arg, arg_list);
return pic_apply(pic, proc, arg_list);
}
struct pic_proc *
pic_papply(pic_state *pic, struct pic_proc *proc, pic_value arg)
{
struct pic_proc *pa_proc;
pa_proc = pic_proc_new(pic, papply_call, "<partial-applied-procedure>");
pic_proc_cv_init(pic, pa_proc, 2);
pic_proc_cv_set(pic, pa_proc, 0, pic_obj_value(proc));
pic_proc_cv_set(pic, pa_proc, 1, arg);
return pa_proc;
pic_dict_set(pic, pic_attr(pic, proc), pic_intern_cstr(pic, key), v);
}
static pic_value
@ -225,7 +166,7 @@ pic_proc_attribute(pic_state *pic)
pic_get_args(pic, "l", &proc);
return pic_obj_value(pic_proc_attr(pic, proc));
return pic_obj_value(pic_attr(pic, proc));
}
void