|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: #include "../h/gc.h" ! 3: #ifdef VAX ! 4: /* ! 5: * sweep - sweep the stack, marking all descriptors there. Method ! 6: * is to start at a known point, specifically, the frame that the ! 7: * fp points to, and then trace back along the stack looking for ! 8: * descriptors and local variables, marking them when they are found. ! 9: * The sp starts at the first frame, and then is moved up through ! 10: * the stack. Procedure, generator, and expression frames are ! 11: * recognized when the sp is a certain distance from the fp, gfp, ! 12: * and efp respectively. ! 13: * ! 14: * Sweeping problems can be manifested in a variety of ways due to ! 15: * the "if it can't be identified it's a descriptor" methodology. ! 16: */ ! 17: #undef gfp ! 18: #undef efp ! 19: #undef fp ! 20: sweep(fp) ! 21: int *fp; ! 22: { ! 23: register int *sp, *gfp, *efp, *ap; ! 24: int *getap(); ! 25: int nargs; ! 26: ! 27: ap = getap(fp); /* Get pointer to 0(ap) for frame ! 28: on top of stack. */ ! 29: sp = fp - FRAMELIMIT; /* Start sp at _file word of current ! 30: frame, the lowest word of it. */ ! 31: nargs = 0; /* Nargs counter is 0 initially. */ ! 32: while ((fp != 0 || nargs)) { /* Keep going until current fp is ! 33: 0 and no arguments are left. */ ! 34: if (sp == fp - FRAMELIMIT) { /* The sp has reached the lower ! 35: boundary of a procedure frame, ! 36: process the frame. */ ! 37: efp = (int *) ap[-1]; /* Get saved efp out of frame, it's ! 38: the first word below 0(ap). */ ! 39: gfp = (int *) ap[-2]; /* Saved gfp is second word below ! 40: 0(ap). */ ! 41: sp = ap + 2; /* First argument descriptor is ! 42: second word above 0(ap), point ! 43: sp at it. */ ! 44: ap = (int *) fp[2]; /* Get saved ap */ ! 45: fp = (int *) fp[3]; /* and fp from frame. */ ! 46: nargs = sp[-1]; /* Nargs is in word below first ! 47: argument descriptor. */ ! 48: } ! 49: else if (sp == gfp - 3) { /* The sp has reached the lower end ! 50: of a generator frame, process ! 51: the frame.*/ ! 52: fp = (int *) gfp[0]; /* Get old fp, available as saved ! 53: boundary value in the frame. */ ! 54: ap = getap(fp); /* Find 0(ap) corresponding to just- ! 55: restored boundary value. */ ! 56: sp = fp - FRAMELIMIT; /* Set up to trigger recognition of ! 57: procedure frame next time around*/ ! 58: } ! 59: else if (sp == efp - 2) { /* The sp has reached the lower end ! 60: of a generator frame, process ! 61: the frame. */ ! 62: gfp = (int *) efp[-1]; /* Restore gfp, */ ! 63: efp = (int *) efp[0]; /* and efp from frame. */ ! 64: sp += 3; /* Move up past expression frame ! 65: marker. */ ! 66: } ! 67: else { /* Assume the sp is pointing at a ! 68: descriptor. */ ! 69: mark(sp); /* Mark it. */ ! 70: sp += 2; /* Move past descriptor. */ ! 71: if (nargs) /* Decrement argument count if in an*/ ! 72: nargs--; /* argument list. */ ! 73: } ! 74: } ! 75: } ! 76: /* ! 77: * getap - return ap of frame addressed by fp ! 78: */ ! 79: int *getap(fp) ! 80: register int *fp; ! 81: { ! 82: register ! 83: int mask = fp[1]>>15 & 0x1ffe; /* Get register mask out of saved ! 84: psw word. */ ! 85: fp += 5; /* Point fp at where first saved ! 86: register (if any) is. */ ! 87: while (mask >>= 1) /* Move fp up for each register */ ! 88: fp += mask & 1; /* saved. When done, fp points */ ! 89: return fp; /* at word where ap would point */ ! 90: } ! 91: #endif VAX ! 92: ! 93: #ifdef PORT ! 94: sweep() ! 95: { ! 96: syserr("Call to sweep() in garbage collector not implemented yet"); ! 97: } ! 98: #endif PORT ! 99: ! 100: #ifdef PDP11 ! 101: /* ! 102: * sweep - sweep the stack, marking all descriptors there. ! 103: */ ! 104: ! 105: sweep(b) ! 106: int *b; ! 107: { ! 108: register int *sp, *r5, *r4; ! 109: int *r3, nargs; ! 110: ! 111: r5 = b; /* start at last Icon/C boundary */ ! 112: sp = r5 - 5; ! 113: nargs = 0; ! 114: while ((r5 != 0 || nargs) && sp < (int *)0177776) { ! 115: if (sp == r5 - 5) { /* at a procedure frame */ ! 116: r3 = r5[-2]; ! 117: r4 = r5[-1]; ! 118: r5 = r5[0]; ! 119: sp += 8; ! 120: nargs = sp[-1]; ! 121: } ! 122: else if (sp == r3 - 3) { /* at a generator frame */ ! 123: r5 = r3[0]; /* go to next boundary */ ! 124: sp = r5 - 5; ! 125: } ! 126: else if (sp == r4 - 2) { /* at an expression frame */ ! 127: r3 = r4[-1]; ! 128: r4 = r4[0]; ! 129: sp += 3; ! 130: } ! 131: else { /* must be a descriptor! */ ! 132: mark(sp); ! 133: sp += 2; ! 134: if (nargs) ! 135: nargs--; ! 136: } ! 137: } ! 138: } ! 139: #endif PDP11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.