Fixed some problems:
authorceriel <none@none>
Wed, 11 Nov 1987 13:10:08 +0000 (13:10 +0000)
committerceriel <none@none>
Wed, 11 Nov 1987 13:10:08 +0000 (13:10 +0000)
files that use the em_code module must include the em_code.h file
improved checking of definitions after use
fixed problem with ranges in case statements

13 files changed:
lang/m2/comp/Makefile
lang/m2/comp/Version.c
lang/m2/comp/casestat.C
lang/m2/comp/chk_expr.c
lang/m2/comp/def.c
lang/m2/comp/defmodule.c
lang/m2/comp/enter.c
lang/m2/comp/error.c
lang/m2/comp/lookup.c
lang/m2/comp/main.c
lang/m2/comp/scope.C
lang/m2/comp/tmpvar.C
lang/m2/comp/type.c

index 4c62d25..92a46ab 100644 (file)
@@ -183,7 +183,7 @@ error.o: input.h
 error.o: inputtype.h
 error.o: main.h
 error.o: node.h
-error.o: squeeze.h
+error.o: nostrict.h
 error.o: strict3rd.h
 error.o: warning.h
 main.o: LLlex.h
@@ -221,6 +221,7 @@ type.o: def.h
 type.o: idf.h
 type.o: nocross.h
 type.o: node.h
+type.o: nostrict.h
 type.o: scope.h
 type.o: squeeze.h
 type.o: target_sizes.h
@@ -316,8 +317,8 @@ chk_expr.o: main.h
 chk_expr.o: misc.h
 chk_expr.o: nocross.h
 chk_expr.o: node.h
+chk_expr.o: nostrict.h
 chk_expr.o: scope.h
-chk_expr.o: squeeze.h
 chk_expr.o: standards.h
 chk_expr.o: strict3rd.h
 chk_expr.o: target_sizes.h
@@ -326,7 +327,7 @@ chk_expr.o: warning.h
 options.o: idfsize.h
 options.o: main.h
 options.o: nocross.h
-options.o: squeeze.h
+options.o: nostrict.h
 options.o: strict3rd.h
 options.o: target_sizes.h
 options.o: type.h
@@ -416,8 +417,8 @@ declar.o: main.h
 declar.o: misc.h
 declar.o: nocross.h
 declar.o: node.h
+declar.o: nostrict.h
 declar.o: scope.h
-declar.o: squeeze.h
 declar.o: strict3rd.h
 declar.o: target_sizes.h
 declar.o: type.h
index 1fa3d2a..ee822b0 100644 (file)
@@ -1 +1 @@
-static char Version[] = "ACK Modula-2 compiler Version 0.25";
+static char Version[] = "ACK Modula-2 compiler Version 0.26";
index ec81d25..5d163a0 100644 (file)
@@ -238,10 +238,13 @@ AddCases(sh, node, lbl)
                        assert(node->nd_right->nd_class == Value);
 
                        node->nd_type = node->nd_left->nd_type;
-                       for (node->nd_INT = node->nd_left->nd_INT;
-                            node->nd_INT != node->nd_right->nd_INT;
-                            node->nd_INT++) {
+                       node->nd_INT = node->nd_left->nd_INT;
+                       for (;;) {
                                if (! AddOneCase(sh, node, lbl)) return 0;
+                               if (node->nd_INT == node->nd_right->nd_INT) {
+                                       break;
+                               }
+                               node->nd_INT++;
                        }
                        return 1;
                }
index f21e48f..e77b89f 100644 (file)
@@ -266,7 +266,7 @@ ChkLinkOrName(expp, flags)
                        return 0;
                }
 
-               if (!(df = lookup(expp->nd_IDF, left->nd_type->rec_scope, 1, flags))) {
+               if (!(df = lookup(expp->nd_IDF, left->nd_type->rec_scope, D_IMPORTED, flags))) {
                        id_not_declared(expp);
                        return 0;
                }
index ba7b6bc..5f2e8f5 100644 (file)
@@ -14,6 +14,7 @@
 #include       <alloc.h>
 #include       <em_arith.h>
 #include       <em_label.h>
+#include       <em_code.h>
 #include       <assert.h>
 
 #include       "LLlex.h"
@@ -96,14 +97,9 @@ define(id, scope, kind)
        */
        register t_def *df;
 
-       df = lookup(id, scope, 2, 0);
+       df = lookup(id, scope, D_IMPORT, 0);
        if (    /* Already in this scope */
                df
-          ||   /* A closed scope, and id defined in the pervasive scope */
-               ( 
-                 scopeclosed(scope)
-               &&
-                 (df = lookup(id, PervasiveScope, 2, 0)))
           ) {
                switch(df->df_kind) {
                case D_INUSE:
@@ -265,7 +261,7 @@ DeclProc(type, id)
        else {
                char *name;
 
-               df = lookup(id, CurrentScope, 1, 0);
+               df = lookup(id, CurrentScope, D_IMPORTED, 0);
                if (df && df->df_kind == D_PROCHEAD) {
                        /* C_exp already generated when we saw the definition
                           in the definition module
index 5cb99d8..2af9d43 100644 (file)
@@ -97,14 +97,14 @@ GetDefinitionModule(id, incr)
        t_scope *newsc = CurrentScope;
 
        level += incr;
-       df = lookup(id, GlobalScope, 1, 0);
+       df = lookup(id, GlobalScope, D_IMPORTED, 0);
        if (!df) {
                /* Read definition module. Make an exception for SYSTEM.
                */
                DefId = id;
                if (!strcmp(id->id_text, "SYSTEM")) {
                        do_SYSTEM();
-                       df = lookup(id, GlobalScope, 1, 0);
+                       df = lookup(id, GlobalScope, D_IMPORTED, 0);
                }
                else {
                        extern int ForeignFlag;
@@ -115,7 +115,7 @@ GetDefinitionModule(id, incr)
                        if (!is_anon_idf(id) && GetFile(id->id_text)) {
 
                                DefModule();
-                               df = lookup(id, GlobalScope, 1, 0);
+                               df = lookup(id, GlobalScope, D_IMPORTED, 0);
                                if (level == 1 &&
                                    (!df || !(df->df_flags & D_FOREIGN))) {
                                        /* The module is directly imported by
@@ -137,7 +137,7 @@ GetDefinitionModule(id, incr)
                                }
                        }
                        else {
-                               df = lookup(id, GlobalScope, 1, 0);
+                               df = lookup(id, GlobalScope, D_IMPORTED, 0);
                                newsc->sc_name = id->id_text;
                        }
                        vis = CurrVis;
index 4afbdcc..10e47f4 100644 (file)
@@ -129,7 +129,7 @@ EnterVarList(Idlist, type, local)
        for (; idlist; idlist = idlist->nd_right) {
                df = define(idlist->nd_IDF, CurrentScope, D_VARIABLE);
                df->df_type = type;
-               df->df_flags &= ~(D_USED | D_DEFINED);
+               /* df->df_flags &= ~(D_USED | D_DEFINED); */
                if (idlist->nd_left) {
                        /* An address was supplied
                        */
@@ -382,7 +382,9 @@ EnterExportList(Idlist, qualified)
                           scope imports it.
                        */
                        df1 = lookup(idlist->nd_IDF,
-                                    enclosing(CurrVis)->sc_scope, 1, 0);
+                                    enclosing(CurrVis)->sc_scope,
+                                    D_IMPORTED,
+                                    0);
                        if (df1) {
                                /* It was already defined in the enclosing
                                   scope. There are two legal possibilities,
index 8ec5346..b6275bd 100644 (file)
@@ -20,6 +20,7 @@
 #include       <system.h>
 #include       <em_arith.h>
 #include       <em_label.h>
+#include       <em_code.h>
 
 #include       "strict3rd.h"
 #include       "input.h"
index 8375aac..05b7a9c 100644 (file)
@@ -44,6 +44,12 @@ lookup(id, scope, import, flags)
             df && df->df_scope != scope;
             df1 = df, df = df->df_next) { /* nothing */ }
 
+       if (! df && import && scopeclosed(scope)) {
+               for (df = id->id_def, df1 = 0;
+                    df && df->df_scope != PervasiveScope;
+                    df1 = df, df = df->df_next) { /* nothing */ }
+       }
+
        if (df) {
                /* Found it
                */
@@ -55,12 +61,9 @@ lookup(id, scope, import, flags)
                        id->id_def = df;
                }
                df->df_flags |= flags;
-               if (import) {
-                       while (df->df_kind & D_IMPORTED) {
-                               if (df->df_kind == D_INUSE && import != 1) break;
-                               assert(df->imp_def != 0);
-                               df = df->imp_def;
-                       }
+               while (df->df_kind & import) {
+                       assert(df->imp_def != 0);
+                       df = df->imp_def;
                }
        }
        return df;
@@ -79,14 +82,16 @@ lookfor(id, vis, message, flags)
        t_def *df;
 
        while (sc) {
-               df = lookup(id->nd_IDF, sc->sc_scope, 1, flags);
+               df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags);
                if (df) {
-                       if (pass_1 &&
-                           message && 
-                           sc->sc_scope->sc_level < vis->sc_scope->sc_level &&
-                           ! scopeclosed(vis->sc_scope)) {
-                               define(id->nd_IDF, vis->sc_scope, D_INUSE)->
-                                       imp_def = df;
+                       if (pass_1 && message) {
+                               while (vis->sc_scope->sc_level >
+                                      sc->sc_scope->sc_level) {
+                                       define( id->nd_IDF,
+                                               vis->sc_scope,
+                                               D_INUSE)-> imp_def = df;
+                                       vis = nextvisible(vis);
+                               }
                        }
                        return df;
                }
index a7c4167..498d597 100644 (file)
@@ -14,6 +14,7 @@
 #include       <system.h>
 #include       <em_arith.h>
 #include       <em_label.h>
+#include       <em_code.h>
 #include       <alloc.h>
 
 #include       "strict3rd.h"
index 4e92c40..6b4a91c 100644 (file)
@@ -49,7 +49,6 @@ open_scope(scopetype)
        if (scopetype == OPENSCOPE) {
                ls->sc_next = ls->sc_encl;
        }
-       else    ls->sc_next = PervVis;
        CurrVis = ls;
 }
 
index 8bb65a0..d90104e 100644 (file)
@@ -20,6 +20,7 @@
 
 #include       <em_arith.h>
 #include       <em_label.h>
+#include       <em_code.h>
 #include       <em_reg.h>
 #include       <alloc.h>
 #include       <assert.h>
index 2ebf2bf..d7e8967 100644 (file)
@@ -623,7 +623,7 @@ type_or_forward(ptp)
        register t_node *nd;
        register t_def *df, *df1;
 
-       if ((df1 = lookup(dot.TOK_IDF, CurrentScope, 1, D_USED))) {
+       if ((df1 = lookup(dot.TOK_IDF, CurrentScope, D_IMPORTED, D_USED))) {
                /* Either a Module or a Type, but in both cases defined
                   in this scope, so this is the correct identification
                */