D_BUSY added, to check recursive deps in def modules
authorceriel <none@none>
Tue, 16 Dec 1986 15:22:33 +0000 (15:22 +0000)
committerceriel <none@none>
Tue, 16 Dec 1986 15:22:33 +0000 (15:22 +0000)
lang/m2/comp/def.H
lang/m2/comp/defmodule.c
lang/m2/comp/program.g
lang/m2/comp/type.c

index d27f32c..3462d4b 100644 (file)
@@ -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
index 2fe30ea..d5f6876 100644 (file)
@@ -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;
index 6867279..40d8113 100644 (file)
@@ -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;
                        }
        '.'
 ;
index a700371..cea6114 100644 (file)
@@ -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;
 }