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_VALUE	(D_PROCEDURE|D_VARIABLE|D_FIELD|D_ENUM|D_CONST|D_PROCHEAD) | ||||||
| #define D_ISTYPE	(D_HIDDEN|D_TYPE|D_FTYPE) | #define D_ISTYPE	(D_HIDDEN|D_TYPE|D_FTYPE) | ||||||
| #define is_type(dfx)	((dfx)->df_kind & D_ISTYPE) | #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_NOREG		0x01	/* set if it may not reside in a register */ | ||||||
| #define D_USED		0x02	/* set if used (future use ???) */ | #define D_USED		0x02	/* set if used (future use ???) */ | ||||||
| #define D_DEFINED	0x04	/* set if it is assigned a value (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_VALPAR	0x10	/* set if it is a value parameter */ | ||||||
| #define D_EXPORTED	0x20	/* set if exported */ | #define D_EXPORTED	0x20	/* set if exported */ | ||||||
| #define D_QEXPORTED	0x40	/* set if qualified exported */ | #define D_QEXPORTED	0x40	/* set if qualified exported */ | ||||||
|  | #define D_BUSY		0x80	/* set if busy reading this definition module */ | ||||||
| 	struct type *df_type; | 	struct type *df_type; | ||||||
| 	union { | 	union { | ||||||
| 		struct module df_module; | 		struct module df_module; | ||||||
|  | @ -120,8 +121,6 @@ struct def	{		/* list of definitions for a name */ | ||||||
| 	} df_value; | 	} df_value; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define SetUsed(df)	((df)->df_flags |= D_USED) |  | ||||||
| 
 |  | ||||||
| /* ALLOCDEF "def" 50 */ | /* ALLOCDEF "def" 50 */ | ||||||
| 
 | 
 | ||||||
| extern struct def | extern struct def | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ GetDefinitionModule(id, incr) | ||||||
| 		We may have to read the definition module itself. | 		We may have to read the definition module itself. | ||||||
| 		Also increment level by "incr". | 		Also increment level by "incr". | ||||||
| 	*/ | 	*/ | ||||||
| 	struct def *df; | 	register struct def *df; | ||||||
| 	static int level; | 	static int level; | ||||||
| 	struct scopelist *vis; | 	struct scopelist *vis; | ||||||
| 
 | 
 | ||||||
|  | @ -101,6 +101,10 @@ GetDefinitionModule(id, incr) | ||||||
| 			df->mod_vis = vis; | 			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) { | 	else if (df == Defined && level == 1) { | ||||||
| 		error("cannot import from currently defined module"); | 		error("cannot import from currently defined module"); | ||||||
| 		df->df_kind = D_ERROR; | 		df->df_kind = D_ERROR; | ||||||
|  |  | ||||||
|  | @ -121,6 +121,7 @@ DefinitionModule | ||||||
| } : | } : | ||||||
| 	DEFINITION | 	DEFINITION | ||||||
| 	MODULE IDENT	{ df = define(dot.TOK_IDF, GlobalScope, D_MODULE); | 	MODULE IDENT	{ df = define(dot.TOK_IDF, GlobalScope, D_MODULE); | ||||||
|  | 			  df->df_flags |= D_BUSY; | ||||||
| 			  if (!Defined) Defined = df; | 			  if (!Defined) Defined = df; | ||||||
| 			  if (df->df_idf != DefId) { | 			  if (df->df_idf != DefId) { | ||||||
| 				error("DEFINITION MODULE name is not \"%s\"", | 				error("DEFINITION MODULE name is not \"%s\"", | ||||||
|  | @ -155,6 +156,7 @@ node_warning(exportlist, W_OLDFASHIONED, "export list in definition module ignor | ||||||
| 			  } | 			  } | ||||||
| 			  DefinitionModule--; | 			  DefinitionModule--; | ||||||
| 			  match_id(df->df_idf, dot.TOK_IDF); | 			  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 = construct_type(T_SET, tp); | ||||||
| 	tp->tp_size = WA(((ub - lb) + 8) >> 3); | 	tp->tp_size = WA((ub - lb + 8) >> 3); | ||||||
| 	return tp; | 	return tp; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue