diff --git a/include/picrin/proc.h b/include/picrin/proc.h index 039a4384..b91960de 100644 --- a/include/picrin/proc.h +++ b/include/picrin/proc.h @@ -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) } diff --git a/src/cont.c b/src/cont.c index f84e55c7..de076874 100644 --- a/src/cont.c +++ b/src/cont.c @@ -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, ""); /* 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, ""); /* 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))); } diff --git a/src/proc.c b/src/proc.c index cfb9bcbb..84967224 100644 --- a/src/proc.c +++ b/src/proc.c @@ -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, ""); - 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