Merge branch 'cv-to-use-attr'
This commit is contained in:
		
						commit
						f23aebb29a
					
				|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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))); | ||||
|   } | ||||
|  |  | |||
							
								
								
									
										71
									
								
								src/proc.c
								
								
								
								
							
							
						
						
									
										71
									
								
								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, "<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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki