|
|
1.1 root 1: #include <u.h>
2: #include <libc.h>
3: #include <bio.h>
4: #include <ctype.h>
5: #define Extern extern
6: #include "parl.h"
7: #include "globl.h"
8:
9: void
10: cominit(Node *v, Type *t, Node *i, int off)
11: {
12: Type *comt;
13: int ind, l, cnt, dim, sz;
14: Node n, **ilist, *in, *treg, *tdat;
15:
16: if(opt('i')) {
17: print("COMINIT %N T %T off %d\n", v, t, off);
18: ptree(i, 0);
19: }
20:
21: switch(t->type) {
22: case TINT:
23: case TUINT:
24: case TSINT:
25: case TSUINT:
26: case TCHAR:
27: case TFLOAT:
28: case TIND:
29: case TCHANNEL:
30: if(i->sun >= Sucall) {
31: treg = stknode(builtype[TIND]);
32: v->type = OREGISTER;
33: v->t = builtype[TIND];
34: assign(v, treg);
35: tdat = stknode(i->t);
36: n.t = i->t;
37: n.type = OASGN;
38: n.left = tdat;
39: n.right = i;
40: n.islval = 0;
41: genexp(&n, ZeroN);
42: assign(treg, v);
43: v->type = OINDREG;
44: v->ival = off;
45: v->t = t;
46: genexp(tdat, v);
47: break;
48: }
49: v->ival = off;
50: v->t = t;
51: n.type = OASGN;
52: n.t = t;
53: n.left = v;
54: n.right = i;
55: n.islval = 0;
56: genexp(&n, ZeroN);
57: break;
58:
59: case TARRAY:
60: veccnt = 0;
61: listcount(i->left, 0);
62: ilist = malloc(sizeof(Node*)*veccnt);
63: veccnt = 0;
64: listcount(i->left, ilist);
65: cnt = veccnt;
66:
67: sz = t->next->size;
68: ind = 0;
69: dim = 0;
70: for(l = 0; l < cnt; l++) {
71: if(ind > dim)
72: dim = ind;
73: in = ilist[l];
74: if(in->type != OINDEX) {
75: cominit(v, t->next, in, off+ind);
76: ind += sz;
77: continue;
78: }
79: ind = in->left->ival*sz;
80: cominit(v, t->next, in->right, off+ind);
81: ind += sz;
82: }
83: break;
84:
85: case TADT:
86: case TUNION:
87: case TAGGREGATE:
88: if(i->type != OILIST) {
89: if(i->sun >= Sucall) {
90: v->ival = 0;
91: v->type = OREGISTER;
92: v->t = at(TIND, t);
93: treg = stknode(v->t);
94: assign(v, treg);
95: in = an(OADD, treg, con(off));
96: in->t = v->t;
97: in = an(OIND, in, ZeroN);
98: in->t = t;
99: n.type = OASGN;
100: n.t = t;
101: n.left = in;
102: n.right = i;
103: n.islval = 0;
104: genexp(&n, ZeroN);
105: assign(treg, v);
106: v->type = OINDREG;
107: break;
108: }
109: v->ival = 0;
110: v->t = at(TIND, t);
111: v->type = OREGISTER;
112: in = an(OADD, v, con(off));
113: in->t = v->t;
114: in = an(OIND, in, ZeroN);
115: in->t = t;
116: n.type = OASGN;
117: n.t = t;
118: n.left = in;
119: n.right = i;
120: n.islval = 0;
121: genexp(&n, ZeroN);
122: v->type = OINDREG;
123: break;
124: }
125:
126: veccnt = 0;
127: listcount(i->left, 0);
128: ilist = malloc(sizeof(Node*)*veccnt);
129: veccnt = 0;
130: listcount(i->left, ilist);
131:
132: cnt = veccnt;
133: comt = t->next;
134: for(l = 0; l < cnt; l++) {
135: cominit(v, comt, ilist[l], off+comt->offset);
136: for(;;) {
137: comt = comt->member;
138: if(comt == ZeroT)
139: break;
140: /* Skip adt prototypes */
141: if(comt->type != TFUNC)
142: break;
143: }
144: }
145: break;
146:
147: case TFUNC:
148: case TVOID:
149: fatal("cominit");
150: }
151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.