|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)frame.c 5.2 (Berkeley) 4/7/87"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Activation record handling. ! 13: * ! 14: * The routines curframe and nextframe cheat by using a global copy ! 15: * of the display. This means there can't be multiple instances of ! 16: * them active at the same time and nextframe won't work in arbitrary cases. ! 17: * ! 18: * This could be solved by putting the display copy into the FRAME structure, ! 19: * but I didn't feel like doing this. The idea is that they be used ! 20: * in looping through all frames, if I had generators I would use them. ! 21: */ ! 22: ! 23: #include "defs.h" ! 24: #include "runtime.h" ! 25: #include "machine.h" ! 26: #include "process.h" ! 27: #include "sym.h" ! 28: #include "object.h" ! 29: #include "mappings.h" ! 30: #include "process/pxinfo.h" ! 31: #include "frame.rep" ! 32: #include "process/process.rep" ! 33: ! 34: /* ! 35: * Return a pointer to the current activation record. ! 36: * Return NIL if currently in the main program. ! 37: * The storage is static. ! 38: */ ! 39: ! 40: #define MAXDEPTH 7 ! 41: #define dispblk(dp) ((dp - DISPLAY) / 2) ! 42: ! 43: LOCAL ADDRESS *display[MAXDEPTH]; ! 44: LOCAL int dispindex; ! 45: ! 46: FRAME *curframe() ! 47: { ! 48: static FRAME frame; ! 49: FRAME *frp; ! 50: ADDRESS *dp, *disp; ! 51: int i; ! 52: ! 53: frp = &frame; ! 54: dp = curdp(); ! 55: disp = contents(dp); ! 56: if (dispblk(dp) <= MAINBLK) { ! 57: return NIL; ! 58: } else { ! 59: getframe(frp, disp); ! 60: for (i = 1; i < MAXDEPTH; i++) { ! 61: display[i] = dispval(i); ! 62: } ! 63: dispindex = dispblk(dp); ! 64: return frp; ! 65: } ! 66: } ! 67: ! 68: /* ! 69: * Return a pointer to the next activation record up the stack. ! 70: * Return NIL if there is none. ! 71: * Writes over space pointed to by given argument. ! 72: */ ! 73: ! 74: FRAME *nextframe(frp) ! 75: FRAME *frp; ! 76: { ! 77: ADDRESS *fp; ! 78: ! 79: if (dispblk(frp->save_dp) <= MAINBLK) { ! 80: return(NIL); ! 81: } else { ! 82: display[dispindex] = frp->save_disp; ! 83: dispindex = dispblk(frp->save_dp); ! 84: fp = display[dispindex]; ! 85: getframe(frp, fp); ! 86: return(frp); ! 87: } ! 88: } ! 89: ! 90: /* ! 91: * Return the frame associated with the given function. ! 92: */ ! 93: ! 94: FRAME *findframe(f) ! 95: SYM *f; ! 96: { ! 97: static FRAME frame; ! 98: FRAME *frp, *prevfrp; ! 99: ! 100: frame.save_dp = curdp(); ! 101: frame.save_disp = contents(frame.save_dp); ! 102: prevfrp = &frame; ! 103: for (frp = curframe(); frp != NIL; frp = nextframe(frp)) { ! 104: if (whatblock(entry(frp)) == f) { ! 105: return frp; ! 106: } ! 107: *prevfrp = *frp; ! 108: } ! 109: if (f == program) { ! 110: return prevfrp; ! 111: } else { ! 112: return NIL; ! 113: } ! 114: } ! 115: ! 116: /* ! 117: * Get the activation record associated with the given display pointer. ! 118: */ ! 119: ! 120: LOCAL getframe(frp, disp) ! 121: FRAME *frp; ! 122: ADDRESS *disp; ! 123: { ! 124: if (disp == NIL) { ! 125: panic("bad disp in getframe"); ! 126: } ! 127: dread(frp, disp, sizeof(FRAME)); ! 128: frp->save_pc -= ENDOFF; ! 129: } ! 130: ! 131: /* ! 132: * Return the address of the display in the px process for the given block. ! 133: */ ! 134: ! 135: ADDRESS *dispval(b) ! 136: int b; ! 137: { ! 138: ADDRESS *r; ! 139: ! 140: dread(&r, (ADDRESS) (DISPLAY + 2*b), sizeof(r)); ! 141: return r; ! 142: } ! 143: ! 144: /* ! 145: * Return the current display pointer. ! 146: */ ! 147: ! 148: ADDRESS *curdp() ! 149: { ! 150: ADDRESS *r; ! 151: ! 152: dread(&r, (ADDRESS) DP, sizeof(r)); ! 153: return r; ! 154: } ! 155: ! 156: /* ! 157: * Return the contents of the given display pointer. ! 158: */ ! 159: ! 160: ADDRESS *contents(dp) ! 161: ADDRESS *dp; ! 162: { ! 163: ADDRESS *r; ! 164: ! 165: dread(&r, (ADDRESS) dp, sizeof(r)); ! 166: return r; ! 167: } ! 168: ! 169: /* ! 170: * Return the px stack address associated with a given frame pointer. ! 171: * Actually, to confuse the issue we want the stack address of the ! 172: * frame one up from the given one. ! 173: */ ! 174: ! 175: ADDRESS stkaddr(frp, b) ! 176: FRAME *frp; ! 177: int b; ! 178: { ! 179: return (ADDRESS) display[b]; ! 180: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.