|
|
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: * Constant set constructor.
17: * settype is the type of the
18: * set if we think that we know it
19: * if not we try our damndest to figure
20: * out what the type should be.
21: */
22: struct nl *
23: cset(r, settype, x)
24: int *r;
25: struct nl *settype;
26: int x;
27: {
28: register *e;
29: register struct nl *t, *exptype;
30: int n, *el;
31:
32: if (settype == NIL) {
33: /*
34: * So far we have no indication
35: * of what the set type should be.
36: * We "look ahead" and try to infer
37: * The type of the constant set
38: * by evaluating one of its members.
39: */
40: e = r[2];
41: if (e == NIL)
42: return (nl+TSET); /* tenative for [] */
43: e = e[1];
44: if (e == NIL)
45: return (NIL);
46: if (e[0] == T_RANG)
47: e = e[1];
48: codeoff();
49: t = rvalue(e, NIL);
50: codeon();
51: if (t == NIL)
52: return (NIL);
53: /*
54: * The type of the set, settype, is
55: * deemed to be a set of the base type
56: * of t, which we call exptype. If,
57: * however, this would involve a
58: * "set of integer", we cop out
59: * and use "intset"'s current scoped
60: * type instead.
61: */
62: if (isa(t, "r")) {
63: error("Sets may not have 'real' elements");
64: return (NIL);
65: }
66: if (isnta(t, "bcsi")) {
67: error("Set elements must be scalars, not %ss", nameof(t));
68: return (NIL);
69: }
70: if (isa(t, "i")) {
71: settype = lookup(intset);
72: if (settype == NIL)
73: panic("intset");
74: settype = settype->type;
75: if (settype == NIL)
76: return (NIL);
77: if (isnta(settype, "t")) {
78: error("Set default type \"intset\" is not a set");
79: return (NIL);
80: }
81: exptype = settype->type;
82: } else {
83: exptype = t->type;
84: if (exptype == NIL)
85: return (NIL);
86: if (exptype->class != RANGE)
87: exptype = exptype->type;
88: settype = defnl(0, SET, exptype, 0);
89: }
90: } else {
91: if (settype->class != SET) {
92: /*
93: * e.g string context [1,2] = 'abc'
94: */
95: error("Constant set involved in non set context");
96: return (NIL);
97: }
98: exptype = settype->type;
99: }
100: if (x == NIL)
101: put2(O_PUSH, -width(settype));
102: n = 0;
103: for (el=r[2]; el; el=el[2]) {
104: n++;
105: e = el[1];
106: if (e == NIL)
107: return (NIL);
108: if (e[0] == T_RANG) {
109: t = rvalue(e[2], NIL);
110: if (t == NIL) {
111: rvalue(e[1], NIL);
112: continue;
113: }
114: if (incompat(t, exptype, e[2]))
115: cerror("Upper bound of element type clashed with set type in constant set");
116: else
117: convert(t, nl+T2INT);
118: t = rvalue(e[1], NIL);
119: if (t == NIL)
120: continue;
121: if (incompat(t, exptype, e[1]))
122: cerror("Lower bound of element type clashed with set type in constant set");
123: else
124: convert(t, nl+T2INT);
125: } else {
126: t = rvalue((int *) e, NLNIL);
127: if (t == NIL)
128: continue;
129: if (incompat(t, exptype, e))
130: cerror("Element type clashed with set type in constant set");
131: else
132: convert(t, nl+T2INT);
133: put1(O_SDUP);
134: }
135: }
136: if (x == NIL) {
137: setran(exptype);
138: put(4, O_CTTOT, n, set.lwrb, set.uprbp);
139: } else
140: put2(O_CON2, n);
141: return (settype);
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.