refactor analyze_args
This commit is contained in:
		
							parent
							
								
									6d6420f2b9
								
							
						
					
					
						commit
						3158a41772
					
				|  | @ -54,23 +54,6 @@ analyze_args(pic_state *pic, pic_value args, bool *varg, int *argc, int *localc) | |||
|   return syms; | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| valid_formal(pic_state *pic, pic_value formal) | ||||
| { | ||||
|   bool varg; | ||||
|   int argc, localc; | ||||
|   pic_sym *syms; | ||||
| 
 | ||||
|   syms = analyze_args(pic, formal, &varg, &argc, &localc); | ||||
|   if (syms == NULL) { | ||||
|     return false; | ||||
|   } | ||||
|   else { | ||||
|     pic_free(pic, syms); | ||||
|     return true; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| typedef struct analyze_scope { | ||||
|   /* rest args variable is counted by localc */ | ||||
|   bool varg; | ||||
|  | @ -93,7 +76,7 @@ typedef struct analyze_state { | |||
|   pic_sym sREF, sRETURN; | ||||
| } analyze_state; | ||||
| 
 | ||||
| static void push_scope(analyze_state *, pic_value); | ||||
| static bool push_scope(analyze_state *, pic_value); | ||||
| static void pop_scope(analyze_state *); | ||||
| 
 | ||||
| #define register_symbol(pic, state, slot, name) do {    \ | ||||
|  | @ -164,28 +147,34 @@ destroy_analyze_state(analyze_state *state) | |||
|   pic_free(state->pic, state); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| static bool | ||||
| push_scope(analyze_state *state, pic_value args) | ||||
| { | ||||
|   pic_state *pic = state->pic; | ||||
|   analyze_scope *scope; | ||||
|   int i; | ||||
|   bool varg = false; | ||||
|   int argc, localc, i; | ||||
|   pic_sym *vars; | ||||
| 
 | ||||
|   if ((vars = analyze_args(pic, args, &varg, &argc, &localc)) == NULL) { | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   scope = (analyze_scope *)pic_alloc(pic, sizeof(analyze_scope)); | ||||
|   scope->up = state->scope; | ||||
|   scope->var_tbl = xh_new_int(); | ||||
|   scope->varg = false; | ||||
|   scope->vars = analyze_args(pic, args, &scope->varg, &scope->argc, &scope->localc); | ||||
| 
 | ||||
|   if (scope->vars == NULL) { | ||||
|     pic_error(pic, "logic flaw"); | ||||
|   } | ||||
|   scope->varg = varg; | ||||
|   scope->argc = argc; | ||||
|   scope->localc = localc; | ||||
|   scope->vars = vars; | ||||
| 
 | ||||
|   for (i = 1; i < scope->argc + scope->localc; ++i) { | ||||
|     xh_put_int(scope->var_tbl, scope->vars[i], 0); | ||||
|   } | ||||
| 
 | ||||
|   state->scope = scope; | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
|  | @ -427,14 +416,9 @@ analyze_lambda(analyze_state *state, pic_value obj) | |||
|     pic_error(pic, "syntax error"); | ||||
|   } | ||||
| 
 | ||||
|   /* formal arguments */ | ||||
|   args = pic_car(pic, pic_cdr(pic, obj)); | ||||
|   if (! valid_formal(pic, args)) { | ||||
|     pic_error(pic, "syntax error"); | ||||
|   } | ||||
| 
 | ||||
|   push_scope(state, args); | ||||
|   { | ||||
|   if (push_scope(state, args)) { | ||||
|     analyze_scope *scope = state->scope; | ||||
|     int i; | ||||
| 
 | ||||
|  | @ -465,8 +449,12 @@ analyze_lambda(analyze_state *state, pic_value obj) | |||
|       } | ||||
|     } | ||||
|     closes = pic_reverse(pic, closes); | ||||
| 
 | ||||
|     pop_scope(state); | ||||
|   } | ||||
|   else { | ||||
|     pic_errorf(pic, "invalid formal syntax: ~s", args); | ||||
|   } | ||||
|   pop_scope(state); | ||||
| 
 | ||||
|   obj = pic_list6(pic, pic_symbol_value(pic->sLAMBDA), args, locals, varg, closes, body); | ||||
|   pic_gc_arena_restore(pic, ai); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki