xref: /inferno-os/libinterp/stack.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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.Forsyth newstack(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.Forsyth extend(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.Forsyth unextend(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.Forsyth unframe(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