#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 ???) */
#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;
} df_value;
};
-#define SetUsed(df) ((df)->df_flags |= D_USED)
-
/* ALLOCDEF "def" 50 */
extern struct def
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;
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;
} :
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\"",
}
DefinitionModule--;
match_id(df->df_idf, dot.TOK_IDF);
+ df->df_flags &= ~D_BUSY;
}
'.'
;
}
tp = construct_type(T_SET, tp);
- tp->tp_size = WA(((ub - lb) + 8) >> 3);
+ tp->tp_size = WA((ub - lb + 8) >> 3);
return tp;
}