fix: resolve forward references if definition is needed in lookfor()
This commit is contained in:
parent
f8fb06210d
commit
7e502b0937
4 changed files with 58 additions and 15 deletions
|
@ -12,13 +12,15 @@ CID = $(EMHOME)/bin/cid
|
||||||
CURRDIR = .
|
CURRDIR = .
|
||||||
|
|
||||||
INCLUDES = -I$(MHDIR) -I$(EMHOME)/h -I$(PKGDIR)
|
INCLUDES = -I$(MHDIR) -I$(EMHOME)/h -I$(PKGDIR)
|
||||||
|
OLIBS = $(LIBDIR)/libem_mes.a $(OBJECTCODE) $(LIBDIR)/libinput.a $(LIBDIR)/libassert.a $(LIBDIR)/liballoc.a $(MALLOC) $(LIBDIR)/libprint.a $(LIBDIR)/libstring.a $(LIBDIR)/libsystem.a
|
||||||
|
|
||||||
GF = program.g declar.g expression.g statement.g
|
GF = program.g declar.g expression.g statement.g
|
||||||
GENGFILES= tokenfile.g
|
GENGFILES= tokenfile.g
|
||||||
GFILES =$(GENGFILES) $(GF)
|
GFILES =$(GENGFILES) $(GF)
|
||||||
LLGENOPTIONS = -v
|
LLGENOPTIONS = -v
|
||||||
PROFILE =
|
PROFILE =
|
||||||
CFLAGS = $(PROFILE) $(INCLUDES) -O -DSTATIC=
|
COPTIONS=
|
||||||
|
CFLAGS = $(PROFILE) $(INCLUDES) $(COPTIONS) -O -DSTATIC=
|
||||||
LINTFLAGS = -DSTATIC= -DNORCSID
|
LINTFLAGS = -DSTATIC= -DNORCSID
|
||||||
MALLOC = $(LIBDIR)/malloc.o
|
MALLOC = $(LIBDIR)/malloc.o
|
||||||
LDFLAGS = -i $(PROFILE)
|
LDFLAGS = -i $(PROFILE)
|
||||||
|
@ -56,6 +58,18 @@ all: Cfiles
|
||||||
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) $(CURRDIR)/main ; else EMHOME=$(EMHOME); export EMHOME; sh Resolve main ; fi'
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) $(CURRDIR)/main ; else EMHOME=$(EMHOME); export EMHOME; sh Resolve main ; fi'
|
||||||
@rm -f nmclash.o a.out
|
@rm -f nmclash.o a.out
|
||||||
|
|
||||||
|
Omain: Cfiles
|
||||||
|
rm -f *.o
|
||||||
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) "COPTIONS="-DPEEPHOLE $(CURRDIR)/omain ; else EMHOME=$(EMHOME); export EMHOME; ./Resolve omain ; fi'
|
||||||
|
@rm -f nmclash.o a.out
|
||||||
|
mv *.o PEEPHOLE
|
||||||
|
|
||||||
|
CEmain: Cfiles
|
||||||
|
rm -f *.o
|
||||||
|
sh -c 'if $(CC) nmclash.c > /dev/null 2>&1 ; then make "EMHOME="$(EMHOME) "COPTIONS="-DCODE_EXPANDER $(CURRDIR)/cemain ; else EMHOME=$(EMHOME); export EMHOME; ./Resolve cemain ; fi'
|
||||||
|
@rm -f nmclash.o a.out
|
||||||
|
mv *.o CODE_EXPANDER
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
cp $(CURRDIR)/main $(EMHOME)/lib/em_m2
|
cp $(CURRDIR)/main $(EMHOME)/lib/em_m2
|
||||||
rm -f $(EMHOME)/man/em_m2.6 $(EMHOME)/man/modula-2.1
|
rm -f $(EMHOME)/man/em_m2.6 $(EMHOME)/man/modula-2.1
|
||||||
|
@ -63,8 +77,8 @@ install: all
|
||||||
|
|
||||||
cmp: all
|
cmp: all
|
||||||
-cmp $(CURRDIR)/main $(EMHOME)/lib/em_m2
|
-cmp $(CURRDIR)/main $(EMHOME)/lib/em_m2
|
||||||
-cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6
|
-cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6
|
||||||
-cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1
|
-cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1
|
||||||
|
|
||||||
opr:
|
opr:
|
||||||
make pr | opr
|
make pr | opr
|
||||||
|
@ -86,14 +100,14 @@ longnames: $(SRC) $(HFILES)
|
||||||
|
|
||||||
# entry points not to be used directly
|
# entry points not to be used directly
|
||||||
|
|
||||||
Cfiles: hfiles LLfiles $(GENC) $(GENH) Makefile
|
Cfiles: hfiles LLfiles $(GENC) $(GENH) Makefile
|
||||||
echo $(SRC) $(HFILES) > Cfiles
|
echo $(SRC) $(HFILES) > Cfiles
|
||||||
|
|
||||||
LLfiles: $(GFILES)
|
LLfiles: $(GFILES)
|
||||||
$(LLGEN) $(LLGENOPTIONS) $(GFILES)
|
$(LLGEN) $(LLGENOPTIONS) $(GFILES)
|
||||||
@touch LLfiles
|
@touch LLfiles
|
||||||
|
|
||||||
hfiles: Parameters make.hfiles
|
hfiles: Parameters make.hfiles
|
||||||
make.hfiles Parameters
|
make.hfiles Parameters
|
||||||
touch hfiles
|
touch hfiles
|
||||||
|
|
||||||
|
@ -125,10 +139,10 @@ next.c: $(NEXTFILES) ./make.next
|
||||||
char.c: char.tab tab
|
char.c: char.tab tab
|
||||||
tab -fchar.tab >char.c
|
tab -fchar.tab >char.c
|
||||||
|
|
||||||
tab:
|
tab:
|
||||||
$(CC) tab.c -o tab
|
$(CC) tab.c -o tab
|
||||||
|
|
||||||
depend: Cfiles
|
depend: Cfiles
|
||||||
sed '/^#AUTOAUTO/,$$d' Makefile > Makefile.new
|
sed '/^#AUTOAUTO/,$$d' Makefile > Makefile.new
|
||||||
echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >> Makefile.new
|
echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >> Makefile.new
|
||||||
$(MKDEP) $(SRC) |\
|
$(MKDEP) $(SRC) |\
|
||||||
|
@ -149,10 +163,19 @@ Xlint:
|
||||||
$(LIBDIR)/llib-lstring.ln \
|
$(LIBDIR)/llib-lstring.ln \
|
||||||
$(LIBDIR)/llib-lsystem.ln
|
$(LIBDIR)/llib-lsystem.ln
|
||||||
|
|
||||||
$(CURRDIR)/main: $(OBJ)
|
$(CURRDIR)/main: $(OBJ) $(CURRDIR)/Makefile
|
||||||
$(CC) $(LDFLAGS) $(OBJ) $(LIBDIR)/libem_mes.a $(OBJECTCODE) $(LIBDIR)/libinput.a $(LIBDIR)/libassert.a $(LIBDIR)/liballoc.a $(MALLOC) $(LIBDIR)/libprint.a $(LIBDIR)/libstring.a $(LIBDIR)/libsystem.a -o $(CURRDIR)/main
|
$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/main
|
||||||
-size $(CURRDIR)/main
|
-size $(CURRDIR)/main
|
||||||
|
|
||||||
|
$(CURRDIR)/omain: $(OBJ) $(CURRDIR)/Makefile
|
||||||
|
$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/omain
|
||||||
|
size $(CURRDIR)/omain
|
||||||
|
|
||||||
|
$(CURRDIR)/cemain: $(OBJ) $(CURRDIR)/Makefile
|
||||||
|
$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(CURRDIR)/cemain
|
||||||
|
size $(CURRDIR)/cemain
|
||||||
|
|
||||||
|
|
||||||
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO
|
||||||
LLlex.o: LLlex.h
|
LLlex.o: LLlex.h
|
||||||
LLlex.o: Lpars.h
|
LLlex.o: Lpars.h
|
||||||
|
|
|
@ -12,6 +12,9 @@ currdir=`pwd`
|
||||||
case $1 in
|
case $1 in
|
||||||
main) target=$currdir/$1
|
main) target=$currdir/$1
|
||||||
;;
|
;;
|
||||||
|
omain) target=$currdir/$1
|
||||||
|
options=-DPEEPHOLE
|
||||||
|
;;
|
||||||
Xlint) target=$1
|
Xlint) target=$1
|
||||||
;;
|
;;
|
||||||
*) echo "$0: $1: Illegal argument" 1>&2
|
*) echo "$0: $1: Illegal argument" 1>&2
|
||||||
|
@ -51,4 +54,4 @@ $i: clashes $PW/$i
|
||||||
\$(CID) -Fclashes < $PW/$i > $i
|
\$(CID) -Fclashes < $PW/$i > $i
|
||||||
EOF
|
EOF
|
||||||
done
|
done
|
||||||
make EMHOME=$EMHOME CURRDIR=$currdir $target
|
make EMHOME=$EMHOME CURRDIR=$currdir COPTIONS=$options $target
|
||||||
|
|
|
@ -111,6 +111,7 @@ define(id, scope, kind)
|
||||||
*/
|
*/
|
||||||
register t_def *df;
|
register t_def *df;
|
||||||
|
|
||||||
|
DO_DEBUG(options['S'], print("define %s, %x\n", id->id_text, kind));
|
||||||
df = lookup(id, scope, D_IMPORT, 0);
|
df = lookup(id, scope, D_IMPORT, 0);
|
||||||
if ( /* Already in this scope */
|
if ( /* Already in this scope */
|
||||||
df
|
df
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
extern int pass_1;
|
extern int pass_1;
|
||||||
|
#ifdef DEBUG
|
||||||
|
extern char options[];
|
||||||
|
#endif
|
||||||
|
|
||||||
t_def *
|
t_def *
|
||||||
lookup(id, scope, import, flags)
|
lookup(id, scope, import, flags)
|
||||||
|
@ -65,6 +68,7 @@ lookup(id, scope, import, flags)
|
||||||
assert(df->imp_def != 0);
|
assert(df->imp_def != 0);
|
||||||
df = df->imp_def;
|
df = df->imp_def;
|
||||||
}
|
}
|
||||||
|
DO_DEBUG(options['S'], print("lookup %s, %x\n", id->id_text, df->df_kind));
|
||||||
}
|
}
|
||||||
return df;
|
return df;
|
||||||
}
|
}
|
||||||
|
@ -78,24 +82,36 @@ lookfor(id, vis, message, flags)
|
||||||
If it is not defined create a dummy definition and,
|
If it is not defined create a dummy definition and,
|
||||||
if message is set, give an error message
|
if message is set, give an error message
|
||||||
*/
|
*/
|
||||||
register t_scopelist *sc = vis;
|
register t_scopelist *sc;
|
||||||
|
t_scopelist *sc1 = 0;
|
||||||
t_def *df;
|
t_def *df;
|
||||||
|
|
||||||
while (sc) {
|
for (sc = vis; sc; sc = nextvisible(sc)) {
|
||||||
df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags);
|
df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags);
|
||||||
if (df) {
|
if (df) {
|
||||||
|
if (message && df->df_kind == D_FORWARD) {
|
||||||
|
if (! sc1) sc1 = sc;
|
||||||
|
while (sc && sc->sc_scope != df->df_scope) {
|
||||||
|
sc = enclosing(sc);
|
||||||
|
}
|
||||||
|
if (sc) continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (pass_1 && message) {
|
if (pass_1 && message) {
|
||||||
|
if (sc1) sc = sc1;
|
||||||
while (vis->sc_scope->sc_level >
|
while (vis->sc_scope->sc_level >
|
||||||
sc->sc_scope->sc_level) {
|
sc->sc_scope->sc_level ||
|
||||||
|
(sc1 &&
|
||||||
|
vis->sc_scope->sc_level >=
|
||||||
|
sc->sc_scope->sc_level)) {
|
||||||
define( id->nd_IDF,
|
define( id->nd_IDF,
|
||||||
vis->sc_scope,
|
vis->sc_scope,
|
||||||
D_INUSE)-> imp_def = df;
|
D_INUSE)-> imp_def = df;
|
||||||
vis = nextvisible(vis);
|
vis = enclosing(vis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return df;
|
return df;
|
||||||
}
|
}
|
||||||
sc = nextvisible(sc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message) id_not_declared(id);
|
if (message) id_not_declared(id);
|
||||||
|
|
Loading…
Add table
Reference in a new issue