1*37da2899SCharles.Forsyth #include "lib9.h" 2*37da2899SCharles.Forsyth #include "isa.h" 3*37da2899SCharles.Forsyth #include "interp.h" 4*37da2899SCharles.Forsyth #include "raise.h" 5*37da2899SCharles.Forsyth #include <pool.h> 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsyth #define T(r) *((void**)(R.r)) 8*37da2899SCharles.Forsyth 9*37da2899SCharles.Forsyth void newstack(Prog * p)10*37da2899SCharles.Forsythnewstack(Prog *p) 11*37da2899SCharles.Forsyth { 12*37da2899SCharles.Forsyth int l; 13*37da2899SCharles.Forsyth Type *t; 14*37da2899SCharles.Forsyth Frame *f; 15*37da2899SCharles.Forsyth Stkext *ns; 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth f = T(s); 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth t = f->t; 20*37da2899SCharles.Forsyth if(t == nil) 21*37da2899SCharles.Forsyth t = SEXTYPE(f)->reg.TR; 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth f->lr = nil; 24*37da2899SCharles.Forsyth f->mr = nil; 25*37da2899SCharles.Forsyth f->fp = nil; 26*37da2899SCharles.Forsyth l = p->R.M->m->ss; 27*37da2899SCharles.Forsyth /* 16 bytes for Stkext record keeping */ 28*37da2899SCharles.Forsyth if(l < t->size+16) 29*37da2899SCharles.Forsyth l = t->size+16; 30*37da2899SCharles.Forsyth ns = mallocz(l, 0); 31*37da2899SCharles.Forsyth if(ns == nil) 32*37da2899SCharles.Forsyth error(exNomem); 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth ns->reg.TR = t; 35*37da2899SCharles.Forsyth ns->reg.SP = nil; 36*37da2899SCharles.Forsyth ns->reg.TS = nil; 37*37da2899SCharles.Forsyth ns->reg.EX = nil; 38*37da2899SCharles.Forsyth p->R.EX = ns->stack; 39*37da2899SCharles.Forsyth p->R.TS = ns->stack + l; 40*37da2899SCharles.Forsyth p->R.SP = ns->reg.tos.fu + t->size; 41*37da2899SCharles.Forsyth p->R.FP = ns->reg.tos.fu; 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth memmove(p->R.FP, f, t->size); 44*37da2899SCharles.Forsyth f = (Frame*)p->R.FP; 45*37da2899SCharles.Forsyth f->t = nil; 46*37da2899SCharles.Forsyth } 47*37da2899SCharles.Forsyth 48*37da2899SCharles.Forsyth void extend(void)49*37da2899SCharles.Forsythextend(void) 50*37da2899SCharles.Forsyth { 51*37da2899SCharles.Forsyth int l; 52*37da2899SCharles.Forsyth Type *t; 53*37da2899SCharles.Forsyth Frame *f; 54*37da2899SCharles.Forsyth Stkext *ns; 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth t = R.s; 57*37da2899SCharles.Forsyth l = R.M->m->ss; 58*37da2899SCharles.Forsyth /* 16 bytes for Stkext record keeping */ 59*37da2899SCharles.Forsyth if(l < t->size+16) 60*37da2899SCharles.Forsyth l = 2*t->size+16; 61*37da2899SCharles.Forsyth ns = mallocz(l, 0); 62*37da2899SCharles.Forsyth if(ns == nil) 63*37da2899SCharles.Forsyth error(exNomem); 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth ns->reg.TR = t; 66*37da2899SCharles.Forsyth ns->reg.SP = R.SP; 67*37da2899SCharles.Forsyth ns->reg.TS = R.TS; 68*37da2899SCharles.Forsyth ns->reg.EX = R.EX; 69*37da2899SCharles.Forsyth f = ns->reg.tos.fr; 70*37da2899SCharles.Forsyth f->t = nil; 71*37da2899SCharles.Forsyth f->mr = nil; 72*37da2899SCharles.Forsyth R.s = f; 73*37da2899SCharles.Forsyth R.EX = ns->stack; 74*37da2899SCharles.Forsyth R.TS = ns->stack + l; 75*37da2899SCharles.Forsyth R.SP = ns->reg.tos.fu + t->size; 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsyth if (t->np) 78*37da2899SCharles.Forsyth initmem(t, f); 79*37da2899SCharles.Forsyth } 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth void unextend(Frame * f)82*37da2899SCharles.Forsythunextend(Frame *f) 83*37da2899SCharles.Forsyth { 84*37da2899SCharles.Forsyth Stkext *sx; 85*37da2899SCharles.Forsyth Type *t; 86*37da2899SCharles.Forsyth 87*37da2899SCharles.Forsyth sx = SEXTYPE(f); 88*37da2899SCharles.Forsyth R.SP = sx->reg.SP; 89*37da2899SCharles.Forsyth R.TS = sx->reg.TS; 90*37da2899SCharles.Forsyth R.EX = sx->reg.EX; 91*37da2899SCharles.Forsyth t = sx->reg.TR; 92*37da2899SCharles.Forsyth if (t->np) 93*37da2899SCharles.Forsyth freeptrs(f, t); 94*37da2899SCharles.Forsyth free(sx); 95*37da2899SCharles.Forsyth } 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth void unframe(void)98*37da2899SCharles.Forsythunframe(void) 99*37da2899SCharles.Forsyth { 100*37da2899SCharles.Forsyth Type *t; 101*37da2899SCharles.Forsyth Frame *f; 102*37da2899SCharles.Forsyth Stkext *sx; 103*37da2899SCharles.Forsyth 104*37da2899SCharles.Forsyth f = (Frame*)R.FP; 105*37da2899SCharles.Forsyth t = f->t; 106*37da2899SCharles.Forsyth if(t == nil) 107*37da2899SCharles.Forsyth t = SEXTYPE(f)->reg.TR; 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth R.SP = R.FP+t->size; 110*37da2899SCharles.Forsyth 111*37da2899SCharles.Forsyth f = T(s); 112*37da2899SCharles.Forsyth if(f->t == nil) { 113*37da2899SCharles.Forsyth sx = SEXTYPE(f); 114*37da2899SCharles.Forsyth R.TS = sx->reg.TS; 115*37da2899SCharles.Forsyth R.EX = sx->reg.EX; 116*37da2899SCharles.Forsyth free(sx); 117*37da2899SCharles.Forsyth } 118*37da2899SCharles.Forsyth } 119