D_BUSY added, to check recursive deps in def modules
This commit is contained in:
		
							parent
							
								
									33a89a8684
								
							
						
					
					
						commit
						a92c8bf067
					
				
					 4 changed files with 10 additions and 5 deletions
				
			
		|  | @ -97,7 +97,7 @@ struct def	{		/* list of definitions for a name */ | |||
| #define D_VALUE	(D_PROCEDURE|D_VARIABLE|D_FIELD|D_ENUM|D_CONST|D_PROCHEAD) | ||||
| #define D_ISTYPE	(D_HIDDEN|D_TYPE|D_FTYPE) | ||||
| #define is_type(dfx)	((dfx)->df_kind & D_ISTYPE) | ||||
| 	char df_flags; | ||||
| 	unsigned short  df_flags; | ||||
| #define D_NOREG		0x01	/* set if it may not reside in a register */ | ||||
| #define D_USED		0x02	/* set if used (future use ???) */ | ||||
| #define D_DEFINED	0x04	/* set if it is assigned a value (future use ???) */ | ||||
|  | @ -105,6 +105,7 @@ struct def	{		/* list of definitions for a name */ | |||
| #define D_VALPAR	0x10	/* set if it is a value parameter */ | ||||
| #define D_EXPORTED	0x20	/* set if exported */ | ||||
| #define D_QEXPORTED	0x40	/* set if qualified exported */ | ||||
| #define D_BUSY		0x80	/* set if busy reading this definition module */ | ||||
| 	struct type *df_type; | ||||
| 	union { | ||||
| 		struct module df_module; | ||||
|  | @ -120,8 +121,6 @@ struct def	{		/* list of definitions for a name */ | |||
| 	} df_value; | ||||
| }; | ||||
| 
 | ||||
| #define SetUsed(df)	((df)->df_flags |= D_USED) | ||||
| 
 | ||||
| /* ALLOCDEF "def" 50 */ | ||||
| 
 | ||||
| extern struct def | ||||
|  |  | |||
|  | @ -55,7 +55,7 @@ GetDefinitionModule(id, incr) | |||
| 		We may have to read the definition module itself. | ||||
| 		Also increment level by "incr". | ||||
| 	*/ | ||||
| 	struct def *df; | ||||
| 	register struct def *df; | ||||
| 	static int level; | ||||
| 	struct scopelist *vis; | ||||
| 
 | ||||
|  | @ -101,6 +101,10 @@ GetDefinitionModule(id, incr) | |||
| 			df->mod_vis = vis; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (df->df_flags & D_BUSY) { | ||||
| 		error("definition module \"%s\" depends on itself", | ||||
| 			id->id_text); | ||||
| 	} | ||||
| 	else if (df == Defined && level == 1) { | ||||
| 		error("cannot import from currently defined module"); | ||||
| 		df->df_kind = D_ERROR; | ||||
|  |  | |||
|  | @ -121,6 +121,7 @@ DefinitionModule | |||
| } : | ||||
| 	DEFINITION | ||||
| 	MODULE IDENT	{ df = define(dot.TOK_IDF, GlobalScope, D_MODULE); | ||||
| 			  df->df_flags |= D_BUSY; | ||||
| 			  if (!Defined) Defined = df; | ||||
| 			  if (df->df_idf != DefId) { | ||||
| 				error("DEFINITION MODULE name is not \"%s\"", | ||||
|  | @ -155,6 +156,7 @@ node_warning(exportlist, W_OLDFASHIONED, "export list in definition module ignor | |||
| 			  } | ||||
| 			  DefinitionModule--; | ||||
| 			  match_id(df->df_idf, dot.TOK_IDF); | ||||
| 			  df->df_flags &= ~D_BUSY; | ||||
| 			} | ||||
| 	'.' | ||||
| ; | ||||
|  |  | |||
|  | @ -383,7 +383,7 @@ set_type(tp) | |||
| 	} | ||||
| 
 | ||||
| 	tp = construct_type(T_SET, tp); | ||||
| 	tp->tp_size = WA(((ub - lb) + 8) >> 3); | ||||
| 	tp->tp_size = WA((ub - lb + 8) >> 3); | ||||
| 	return tp; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue