|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #
3: /*
4: * pi - Pascal interpreter code translator
5: *
6: * Charles Haley, Bill Joy UCB
7: * Version 1.2 November 1978
8: */
9:
10: #include "whoami"
11: #include "0.h"
12: #include "tree.h"
13: #include "opcode.h"
14:
15: /*
16: * Label enters the definitions
17: * of the label declaration part
18: * into the namelist.
19: */
20: label(r, l)
21: int *r, l;
22: {
23: #ifndef PI0
24: register *ll;
25: register struct nl *p, *lp;
26:
27: lp = NIL;
28: #else
29: send(REVLAB, r);
30: #endif
31: line = l;
32: #ifndef PI1
33: if (parts & (CPRT|TPRT|VPRT))
34: error("Label declarations must precede const, type and var declarations");
35: if (parts & LPRT)
36: error("All labels must be declared in one label part");
37: parts |= LPRT;
38: #endif
39: #ifndef PI0
40: for (ll = r; ll != NIL; ll = ll[2]) {
41: l = getlab();
42: p = enter(defnl(ll[1], LABEL, 0, l));
43: /*
44: * Get the label for the eventual target
45: */
46: p->value[1] = getlab();
47: p->chain = lp;
48: p->nl_flags |= (NFORWD|NMOD);
49: p->value[NL_GOLEV] = NOTYET;
50: p->entloc = l;
51: lp = p;
52: /*
53: * This operator is between
54: * the bodies of two procedures
55: * and provides a target for
56: * gotos for this label via TRA.
57: */
58: putlab(l);
59: put2(O_GOTO | cbn<<9, p->value[1]);
60: }
61: gotos[cbn] = lp;
62: # ifdef PTREE
63: {
64: pPointer Labels = LabelDCopy( r );
65:
66: pDEF( PorFHeader[ nesting ] ).PorFLabels = Labels;
67: }
68: # endif
69: #endif
70: }
71:
72: #ifndef PI0
73: /*
74: * Gotoop is called when
75: * we get a statement "goto label"
76: * and generates the needed tra.
77: */
78: gotoop(s)
79: char *s;
80: {
81: register struct nl *p;
82:
83: gocnt++;
84: p = lookup(s);
85: if (p == NIL)
86: return (NIL);
87: put2(O_TRA4, p->entloc);
88: if (bn == cbn)
89: if (p->nl_flags & NFORWD) {
90: if (p->value[NL_GOLEV] == NOTYET) {
91: p->value[NL_GOLEV] = level;
92: p->value[NL_GOLINE] = line;
93: }
94: } else
95: if (p->value[NL_GOLEV] == DEAD) {
96: recovered();
97: error("Goto %s is into a structured statement", p->symbol);
98: }
99: }
100:
101: /*
102: * Labeled is called when a label
103: * definition is encountered, and
104: * marks that it has been found and
105: * patches the associated GOTO generated
106: * by gotoop.
107: */
108: labeled(s)
109: char *s;
110: {
111: register struct nl *p;
112:
113: p = lookup(s);
114: if (p == NIL)
115: return (NIL);
116: if (bn != cbn) {
117: error("Label %s not defined in correct block", s);
118: return;
119: }
120: if ((p->nl_flags & NFORWD) == 0) {
121: error("Label %s redefined", s);
122: return;
123: }
124: p->nl_flags &= ~NFORWD;
125: patch4(p->entloc);
126: if (p->value[NL_GOLEV] != NOTYET)
127: if (p->value[NL_GOLEV] < level) {
128: recovered();
129: error("Goto %s from line %d is into a structured statement", s, p->value[NL_GOLINE]);
130: }
131: p->value[NL_GOLEV] = level;
132: }
133: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.