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 =	.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
GENGFILES=	tokenfile.g
 | 
			
		||||
GFILES =$(GENGFILES) $(GF)
 | 
			
		||||
LLGENOPTIONS = -v
 | 
			
		||||
PROFILE =
 | 
			
		||||
CFLAGS = $(PROFILE) $(INCLUDES) -O -DSTATIC=
 | 
			
		||||
COPTIONS=
 | 
			
		||||
CFLAGS = $(PROFILE) $(INCLUDES) $(COPTIONS) -O -DSTATIC=
 | 
			
		||||
LINTFLAGS = -DSTATIC= -DNORCSID
 | 
			
		||||
MALLOC = $(LIBDIR)/malloc.o
 | 
			
		||||
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'
 | 
			
		||||
	@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
 | 
			
		||||
	cp $(CURRDIR)/main $(EMHOME)/lib/em_m2
 | 
			
		||||
	rm -f $(EMHOME)/man/em_m2.6 $(EMHOME)/man/modula-2.1
 | 
			
		||||
| 
						 | 
				
			
			@ -63,8 +77,8 @@ install:	all
 | 
			
		|||
 | 
			
		||||
cmp:	all
 | 
			
		||||
	-cmp $(CURRDIR)/main $(EMHOME)/lib/em_m2
 | 
			
		||||
	-cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6 
 | 
			
		||||
	-cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1 
 | 
			
		||||
	-cmp $(CURRDIR)/em_m2.6 $(EMHOME)/man/em_m2.6
 | 
			
		||||
	-cmp $(CURRDIR)/modula-2.1 $(EMHOME)/man/modula-2.1
 | 
			
		||||
 | 
			
		||||
opr:
 | 
			
		||||
	make pr | opr
 | 
			
		||||
| 
						 | 
				
			
			@ -86,14 +100,14 @@ longnames:	$(SRC) $(HFILES)
 | 
			
		|||
 | 
			
		||||
# entry points not to be used directly
 | 
			
		||||
 | 
			
		||||
Cfiles:	hfiles LLfiles $(GENC) $(GENH) Makefile
 | 
			
		||||
Cfiles: hfiles LLfiles $(GENC) $(GENH) Makefile
 | 
			
		||||
	echo $(SRC) $(HFILES) > Cfiles
 | 
			
		||||
 | 
			
		||||
LLfiles:	$(GFILES)
 | 
			
		||||
	$(LLGEN) $(LLGENOPTIONS) $(GFILES)
 | 
			
		||||
	@touch LLfiles
 | 
			
		||||
 | 
			
		||||
hfiles:	Parameters make.hfiles
 | 
			
		||||
hfiles: Parameters make.hfiles
 | 
			
		||||
	make.hfiles Parameters
 | 
			
		||||
	touch hfiles
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -125,10 +139,10 @@ next.c:		$(NEXTFILES) ./make.next
 | 
			
		|||
char.c: char.tab tab
 | 
			
		||||
	tab -fchar.tab >char.c
 | 
			
		||||
 | 
			
		||||
tab: 
 | 
			
		||||
tab:
 | 
			
		||||
	$(CC) tab.c -o tab
 | 
			
		||||
 | 
			
		||||
depend:	Cfiles
 | 
			
		||||
depend: Cfiles
 | 
			
		||||
	sed '/^#AUTOAUTO/,$$d' Makefile > Makefile.new
 | 
			
		||||
	echo '#AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO' >> Makefile.new
 | 
			
		||||
	$(MKDEP) $(SRC) |\
 | 
			
		||||
| 
						 | 
				
			
			@ -149,10 +163,19 @@ Xlint:
 | 
			
		|||
		$(LIBDIR)/llib-lstring.ln \
 | 
			
		||||
		$(LIBDIR)/llib-lsystem.ln
 | 
			
		||||
 | 
			
		||||
$(CURRDIR)/main:	$(OBJ)
 | 
			
		||||
	$(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
 | 
			
		||||
$(CURRDIR)/main:	$(OBJ) $(CURRDIR)/Makefile
 | 
			
		||||
	$(CC) $(LDFLAGS) $(OBJ) $(OLIBS) -o $(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
 | 
			
		||||
LLlex.o: LLlex.h
 | 
			
		||||
LLlex.o: Lpars.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,9 @@ currdir=`pwd`
 | 
			
		|||
case $1 in
 | 
			
		||||
main)	target=$currdir/$1
 | 
			
		||||
	;;
 | 
			
		||||
omain)	target=$currdir/$1
 | 
			
		||||
	options=-DPEEPHOLE
 | 
			
		||||
	;;
 | 
			
		||||
Xlint)	target=$1
 | 
			
		||||
	;;
 | 
			
		||||
*)	echo "$0: $1: Illegal argument" 1>&2
 | 
			
		||||
| 
						 | 
				
			
			@ -51,4 +54,4 @@ $i:	clashes $PW/$i
 | 
			
		|||
	\$(CID) -Fclashes < $PW/$i > $i
 | 
			
		||||
EOF
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
	DO_DEBUG(options['S'], print("define %s, %x\n", id->id_text, kind));
 | 
			
		||||
	df = lookup(id, scope, D_IMPORT, 0);
 | 
			
		||||
	if (	/* Already in this scope */
 | 
			
		||||
		df
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,9 @@
 | 
			
		|||
#include	"misc.h"
 | 
			
		||||
 | 
			
		||||
extern int	pass_1;
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
extern char	options[];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
t_def *
 | 
			
		||||
lookup(id, scope, import, flags)
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +68,7 @@ lookup(id, scope, import, flags)
 | 
			
		|||
			assert(df->imp_def != 0);
 | 
			
		||||
			df = df->imp_def;
 | 
			
		||||
		}
 | 
			
		||||
		DO_DEBUG(options['S'], print("lookup %s, %x\n", id->id_text, df->df_kind));
 | 
			
		||||
	}
 | 
			
		||||
	return df;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -78,24 +82,36 @@ lookfor(id, vis, message, flags)
 | 
			
		|||
		If it is not defined create a dummy definition and,
 | 
			
		||||
		if message is set, give an error message
 | 
			
		||||
	*/
 | 
			
		||||
	register t_scopelist *sc = vis;
 | 
			
		||||
	register t_scopelist *sc;
 | 
			
		||||
	t_scopelist *sc1 = 0;
 | 
			
		||||
	t_def *df;
 | 
			
		||||
 | 
			
		||||
	while (sc) {
 | 
			
		||||
	for (sc = vis; sc; sc = nextvisible(sc)) {
 | 
			
		||||
		df = lookup(id->nd_IDF, sc->sc_scope, D_IMPORTED, flags);
 | 
			
		||||
		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 (sc1) sc = sc1;
 | 
			
		||||
				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,
 | 
			
		||||
						vis->sc_scope,
 | 
			
		||||
						D_INUSE)-> imp_def = df;
 | 
			
		||||
					vis = nextvisible(vis);
 | 
			
		||||
					vis = enclosing(vis);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return df;
 | 
			
		||||
		}
 | 
			
		||||
		sc = nextvisible(sc);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (message) id_not_declared(id);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue