|
|
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.