|
|
1.1 root 1: #include "../h/rt.h"
2: #ifdef VAX
3: /*
4: * ^x - return an entry block for co-expression x from the refresh block.
5: */
6:
7: refresh(nargs, arg1, arg0)
8: int nargs;
9: struct descrip arg1, arg0;
10: {
11: register int *ap, *sp, *tp;
12: struct descrip *dp, *dsp;
13: register struct b_estack *ep;
14: register struct b_eblock *hp;
15: int na, nl, *r5, *newap;
16: extern struct b_estack *alcestk();
17: extern interp();
18:
19: SetBound;
20: DeRef(arg1)
21: if (QUAL(arg1) || TYPE(arg1) != T_ESTACK)
22: runerr(118, &arg1);
23:
24: /*
25: * Get a new co-expression stack and initialize activator, result
26: * count, stack base, and fresh block location.
27: */
28: esneed();
29: ep = alcestk();
30: ep->activator = nulldesc;
31: ep->nresults = 0;
32: ep->freshblk = BLKLOC(arg1)->estack.freshblk;
33: ep->sbase = sp = (int *)ep;
34: /*
35: * Get number of arguments, number of locals, and a pointer to
36: * arg0 in the refresh block's argument list.
37: */
38: hp = (struct b_eblock *) BLKLOC(ep->freshblk);
39: na = hp->numargs;
40: nl = hp->numlocals;
41: ap = (int *) hp->elems;
42:
43: /*
44: * Copy arguments into new stack and refresh block.
45: */
46: dsp = (struct descrip *) sp;
47: dp = (struct descrip *) ap;
48: *--dsp = *dp++;
49: while (na-- > 0) {
50: *--dsp = *dp++;
51: }
52: sp = (int *) dsp;
53: ap = (int *) dp;
54:
55: /*
56: * Set up original procedure frame in new stack.
57: */
58: *--sp = hp->numargs; /* nargs */
59: *--sp = (hp->numargs*2) + 1; /* nwords */
60: newap = sp; /* save address of nwords */
61: *--sp = (int) interp; /* return pc */
62: *--sp = 0; /* saved r5 (frame pointer) */
63: *--sp = 0; /* saved ap */
64: *--sp = 0; /* psw/reg. mask */
65: *--sp = 0; /* condition handler */
66: r5 = sp; /* (save its address) */
67: *--sp = line; /* saved line number */
68: *--sp = (int) file; /* saved file name */
69:
70: /*
71: * Copy local variables into new stack.
72: */
73: dsp = (struct descrip *) sp;
74: dp = (struct descrip *) ap;
75: while (nl-- > 0) {
76: *--dsp = *dp++;
77: }
78: sp = (int *) dsp;
79: ap = (int *) dp;
80:
81: /*
82: * Set up dummy call to coact.
83: */
84: *--sp = nulldesc.type; /* place for result */
85: *--sp = INTVAL(nulldesc);
86: *--sp = nulldesc.type; /* place for activate coexpr */
87: *--sp = INTVAL(nulldesc);
88: *--sp = 1; /* nargs */
89: *--sp = 3; /* nwords */
90: tp = sp; /* save pointer to start of arg
91: list in this frame */
92: *--sp = (int) hp->ep; /* saved r9 (coexpr entry point) */
93: *--sp = (int) interp; /* return pc (entry point) */
94: *--sp = (int) r5; /* saved r5 */
95: *--sp = (int) newap; /* saved ap */
96: *--sp = 0x02000000; /* psw/reg mask with bit set to
97: restore r9, the ipc */
98: *--sp = 0;
99: ep->boundary = sp; /* (initial boundary) */
100: *--sp = line; /* saved line number */
101: *--sp = (int) file; /* saved file name */
102: ep->sp = sp; /* initial stack pointer */
103: ep->ap = tp;
104:
105: /*
106: * Return the new co-expression.
107: */
108: arg0.type = D_ESTACK;
109: BLKLOC(arg0) = (union block *) ep;
110: ClearBound;
111: }
112:
113: Opblock(refresh,1,"^")
114: #endif VAX
115:
116: #ifdef PORT
117: refresh()
118: {
119: syserr("Attempt to refresh a co-expression");
120: }
121: #endif PORT
122: #ifdef PDP11
123: /*
124: * ^x - return an entry block for co-expression x from the refresh block.
125: * NOTE: this code is highly dependent on stack frame layout.
126: */
127:
128: refresh(nargs, arg1, arg0)
129: int nargs;
130: struct descrip arg1, arg0;
131: {
132: register int *ap, *sp;
133: register struct b_estack *ep;
134: register struct b_eblock *hp;
135: int na, nl, *r5;
136: extern struct b_estack *alcestk();
137: extern interp();
138:
139: DeRef(arg1)
140: if (QUAL(arg1) || TYPE(arg1) != T_ESTACK)
141: runerr(118, &arg1);
142:
143: esneed(); /* check for room in stack space */
144: ep = alcestk(); /* allocate expression stack */
145: ep->activator = nulldesc;
146: ep->nresults = 0;
147: ep->freshblk = BLKLOC(arg1)->estack.freshblk;
148:
149: ep->sbase = sp = (int *)ep; /* initialize new stack pointer */
150: hp = BLKLOC(ep->freshblk);
151: na = hp->numargs; /* get value of nargs */
152: nl = hp->numlocals;
153: ap = hp->elems; /* find arg0 of caller */
154:
155: /* copy arguments into new stack and refresh block */
156: *--(struct descrip *)sp = *(struct descrip *)ap; /* copy arg0 */
157: while (na-- > 0)
158: *--(struct descrip *)sp = *++(struct descrip *)ap;
159:
160: /* set up original procedure frame in new stack */
161: *--sp = hp->numargs; /* copy nargs */
162: *--sp = 0; /* return pc */
163: *--sp = 0; /* saved r5 */
164: r5 = sp; /* (save its address) */
165: *--sp = 0; /* saved r4 */
166: *--sp = 0; /* saved r3 */
167: *--sp = 0; /* saved r2 */
168: *--sp = line; /* saved line number */
169: *--sp = file; /* saved file name */
170:
171: /* copy local variables into new stack */
172: while (nl-- > 0)
173: *--(struct descrip *)sp = *++(struct descrip *)ap;
174:
175: /* set up dummy call to activate */
176: *--(struct descrip *)sp = nulldesc; /* place for result */
177: *--(struct descrip *)sp = nulldesc; /* place for activate coexpr */
178: /* these values are the initial register state for the coexpression */
179: *--sp = 1; /* nargs */
180: *--sp = interp; /* return pc (entry point) */
181: *--sp = r5; /* saved r5 */
182: ep->boundary = sp; /* (initial boundary) */
183: *--sp = 0; /* saved r4 */
184: *--sp = 0; /* saved r3 */
185: *--sp = hp->ep; /* saved r2 */
186: *--sp = line; /* saved line number */
187: *--sp = file; /* saved file name */
188: ep->sp = sp; /* initial stack pointer */
189: arg0.type = D_ESTACK;
190: BLKLOC(arg0) = ep;
191: }
192: Opblock(refresh,1,"^")
193: #endif PDP11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.