1 /* S C O P E M E C H A N I S M */
18 struct scope *GlobalScope, *PervasiveScope, *BlockScope;
19 struct scopelist *CurrVis;
20 extern int proclevel; /* declared in declar.g */
25 register struct scope *sc = new_scope();
26 register struct scopelist *ls = new_scopelist();
28 sc->sc_level = proclevel;
30 ls->sc_scope = PervasiveScope;
31 ls->sc_count = ++sccount;
37 register struct scope *sc = new_scope();
38 register struct scopelist *ls = new_scopelist();
40 sc->sc_level = proclevel;
43 ls->sc_count = ++sccount;
49 /* When this procedure is called, the next visible scope is equal to
50 the statically enclosing scope
52 register struct def *df;
54 assert(CurrentScope != 0);
55 df = CurrentScope->sc_def;
56 if (doclean) while (df) {
57 struct def *next = df->df_nextinscope;
58 if (! (df->df_flags & (D_VARPAR|D_VALPAR))) remove_def(df);
61 CurrVis = CurrVis->next;
65 register struct node *nd;
66 register struct type *tp;
68 /* Enter a forward reference into the current scope. This is
69 * used in pointertypes.
71 register struct def *df = define(nd->nd_IDF, CurrentScope, D_FORWTYPE);
72 register struct forwtype *fw_type = new_forwtype();
74 fw_type->f_next = df->df_fortype;
75 df->df_fortype = fw_type;
83 /* the program parameters must be global variables of some file type */
84 register struct def *df = CurrentScope->sc_def;
87 if( df->df_kind & D_PARAMETER ) {
88 if( !is_anon_idf(df->df_idf) ) {
89 if( df->df_type == error_type )
90 error("program parameter \"%s\" must be a global variable",
92 else if( df->df_type->tp_fund != T_FILE )
93 error("program parameter \"%s\" must have a file type",
96 df->df_kind = D_VARIABLE;
98 else df->df_kind = D_ERROR;
100 df = df->df_nextinscope;
106 /* check if all forward declarations are defined */
107 register struct def *df = CurrentScope->sc_def;
110 if( df->df_kind == D_FWPROCEDURE )
111 error("procedure \"%s\" not defined", df->df_idf->id_text);
112 else if( df->df_kind == D_FWFUNCTION )
113 error("function \"%s\" not defined", df->df_idf->id_text);
115 df = df->df_nextinscope;