use registries for parameter table
This commit is contained in:
		
							parent
							
								
									111779c39e
								
							
						
					
					
						commit
						b983c77767
					
				|  | @ -92,6 +92,8 @@ typedef struct { | ||||||
| 
 | 
 | ||||||
|   pic_code *ip; |   pic_code *ip; | ||||||
| 
 | 
 | ||||||
|  |   pic_value ptable; | ||||||
|  | 
 | ||||||
|   struct pic_lib *lib, *prev_lib; |   struct pic_lib *lib, *prev_lib; | ||||||
| 
 | 
 | ||||||
|   pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; |   pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; | ||||||
|  | @ -130,9 +132,6 @@ typedef struct { | ||||||
|   pic_value libs; |   pic_value libs; | ||||||
|   struct pic_reg *attrs; |   struct pic_reg *attrs; | ||||||
| 
 | 
 | ||||||
|   pic_value ptable; |  | ||||||
|   size_t pnum; |  | ||||||
| 
 |  | ||||||
|   struct pic_reader *reader; |   struct pic_reader *reader; | ||||||
| 
 | 
 | ||||||
|   bool gc_enable; |   bool gc_enable; | ||||||
|  |  | ||||||
|  | @ -237,7 +237,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) | ||||||
| 
 | 
 | ||||||
|   /* parameter table */ |   /* parameter table */ | ||||||
|   pic->ptable = pic_nil_value(); |   pic->ptable = pic_nil_value(); | ||||||
|   pic->pnum = 0; |  | ||||||
| 
 | 
 | ||||||
|   /* native stack marker */ |   /* native stack marker */ | ||||||
|   pic->native_stack_start = &t; |   pic->native_stack_start = &t; | ||||||
|  |  | ||||||
|  | @ -17,15 +17,12 @@ static pic_value | ||||||
| var_get(pic_state *pic, struct pic_proc *var) | var_get(pic_state *pic, struct pic_proc *var) | ||||||
| { | { | ||||||
|   pic_value elem, it; |   pic_value elem, it; | ||||||
|   pic_sym *id; |   struct pic_reg *reg; | ||||||
|   struct pic_dict *dict; |  | ||||||
| 
 |  | ||||||
|   id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); |  | ||||||
| 
 | 
 | ||||||
|   pic_for_each (elem, pic->ptable, it) { |   pic_for_each (elem, pic->ptable, it) { | ||||||
|     dict = pic_dict_ptr(elem); |     reg = pic_reg_ptr(elem); | ||||||
|     if (pic_dict_has(pic, dict, id)) { |     if (pic_reg_has(pic, reg, var)) { | ||||||
|       return pic_dict_ref(pic, dict, id); |       return pic_reg_ref(pic, reg, var); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   pic_panic(pic, "logic flaw"); |   pic_panic(pic, "logic flaw"); | ||||||
|  | @ -34,14 +31,11 @@ var_get(pic_state *pic, struct pic_proc *var) | ||||||
| static pic_value | static pic_value | ||||||
| var_set(pic_state *pic, struct pic_proc *var, pic_value val) | var_set(pic_state *pic, struct pic_proc *var, pic_value val) | ||||||
| { | { | ||||||
|   pic_sym *id; |   struct pic_reg *reg; | ||||||
|   struct pic_dict *dict; |  | ||||||
| 
 | 
 | ||||||
|   id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); |   reg = pic_reg_ptr(pic_car(pic, pic->ptable)); | ||||||
| 
 | 
 | ||||||
|   dict = pic_dict_ptr(pic_car(pic, pic->ptable)); |   pic_reg_set(pic, reg, var, val); | ||||||
| 
 |  | ||||||
|   pic_dict_set(pic, dict, id, val); |  | ||||||
| 
 | 
 | ||||||
|   return pic_undef_value(); |   return pic_undef_value(); | ||||||
| } | } | ||||||
|  | @ -66,16 +60,12 @@ struct pic_proc * | ||||||
| pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) | pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) | ||||||
| { | { | ||||||
|   struct pic_proc *var; |   struct pic_proc *var; | ||||||
|   pic_value converter = conv ? pic_obj_value(conv) : pic_false_value(); |  | ||||||
|   pic_sym *id; |  | ||||||
| 
 | 
 | ||||||
|   var = pic_make_proc(pic, var_call, "<var-call>"); |   var = pic_make_proc(pic, var_call, "<var-call>"); | ||||||
| 
 | 
 | ||||||
|   if (conv != NULL) { |   if (conv != NULL) { | ||||||
|     pic_proc_env_set(pic, var, "conv", converter); |     pic_proc_env_set(pic, var, "conv", pic_obj_value(conv)); | ||||||
|   } |   } | ||||||
|   id = pic_intern(pic, pic_format(pic, "%d", pic->pnum++)); |  | ||||||
|   pic_proc_env_set(pic, var, "id", pic_obj_value(id)); |  | ||||||
| 
 | 
 | ||||||
|   pic_apply1(pic, var, init); |   pic_apply1(pic, var, init); | ||||||
| 
 | 
 | ||||||
|  | @ -101,7 +91,7 @@ pic_var_with_parameter(pic_state *pic) | ||||||
| 
 | 
 | ||||||
|   pic_get_args(pic, "l", &body); |   pic_get_args(pic, "l", &body); | ||||||
| 
 | 
 | ||||||
|   pic->ptable = pic_cons(pic, pic_obj_value(pic_make_dict(pic)), pic->ptable); |   pic->ptable = pic_cons(pic, pic_obj_value(pic_make_reg(pic)), pic->ptable); | ||||||
| 
 | 
 | ||||||
|   val = pic_apply0(pic, body); |   val = pic_apply0(pic, body); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki