merge
This commit is contained in:
commit
0a681f38eb
1 changed files with 26 additions and 8 deletions
|
@ -123,6 +123,7 @@ struct Frame {
|
||||||
struct Interp {
|
struct Interp {
|
||||||
uchar *pc;
|
uchar *pc;
|
||||||
Frame *fp;
|
Frame *fp;
|
||||||
|
Frame *fb;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Interp interp;
|
static Interp interp;
|
||||||
|
@ -130,7 +131,9 @@ static Frame stack[32];
|
||||||
|
|
||||||
#define PC interp.pc
|
#define PC interp.pc
|
||||||
#define FP interp.fp
|
#define FP interp.fp
|
||||||
#define FB stack
|
#define FB interp.fb
|
||||||
|
|
||||||
|
#define F0 stack
|
||||||
#define FT &stack[nelem(stack)]
|
#define FT &stack[nelem(stack)]
|
||||||
|
|
||||||
static Heap *hp;
|
static Heap *hp;
|
||||||
|
@ -234,7 +237,7 @@ gc(void)
|
||||||
if(h->mark & 2)
|
if(h->mark & 2)
|
||||||
gcmark(H2D(h));
|
gcmark(H2D(h));
|
||||||
|
|
||||||
for(f = FP; f >= FB; f--){
|
for(f = FP; f >= F0; f--){
|
||||||
for(i=0; i<f->narg; i++)
|
for(i=0; i<f->narg; i++)
|
||||||
gcmark(f->arg[i]);
|
gcmark(f->arg[i]);
|
||||||
gcmark(f->env);
|
gcmark(f->env);
|
||||||
|
@ -485,9 +488,13 @@ putle(uchar *p, int len, uvlong v)
|
||||||
static uvlong
|
static uvlong
|
||||||
rwreg(void *reg, int off, int len, uvlong v, int write)
|
rwreg(void *reg, int off, int len, uvlong v, int write)
|
||||||
{
|
{
|
||||||
|
Interp save;
|
||||||
uchar buf[8], *p;
|
uchar buf[8], *p;
|
||||||
Region *r;
|
Region *r;
|
||||||
|
|
||||||
|
save = interp; /* save, in case we reenter the interpreter */
|
||||||
|
FB = FP+1; /* allocate new base */
|
||||||
|
|
||||||
switch(TAG(reg)){
|
switch(TAG(reg)){
|
||||||
case 'b':
|
case 'b':
|
||||||
p = reg;
|
p = reg;
|
||||||
|
@ -498,7 +505,7 @@ rwreg(void *reg, int off, int len, uvlong v, int write)
|
||||||
putle(p, len, v);
|
putle(p, len, v);
|
||||||
else
|
else
|
||||||
v = getle(p, len);
|
v = getle(p, len);
|
||||||
return v;
|
goto Out;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
r = reg;
|
r = reg;
|
||||||
|
@ -547,10 +554,13 @@ rwreg(void *reg, int off, int len, uvlong v, int write)
|
||||||
(Name*)r->name, spacename[r->space],
|
(Name*)r->name, spacename[r->space],
|
||||||
r->off, off, len, v);
|
r->off, off, len, v);
|
||||||
}
|
}
|
||||||
return v;
|
goto Out;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ~0;
|
v = -1;
|
||||||
|
Out:
|
||||||
|
interp = save; /* restore */
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uvlong
|
static uvlong
|
||||||
|
@ -937,6 +947,8 @@ xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret)
|
||||||
void *r;
|
void *r;
|
||||||
|
|
||||||
PC = pc;
|
PC = pc;
|
||||||
|
if(FB < F0 || FB >= FT)
|
||||||
|
goto Out;
|
||||||
FP = FB;
|
FP = FB;
|
||||||
|
|
||||||
FP->tag = 0;
|
FP->tag = 0;
|
||||||
|
@ -946,7 +958,7 @@ xec(uchar *pc, uchar *end, Name *dot, Env *env, void **pret)
|
||||||
FP->start = PC;
|
FP->start = PC;
|
||||||
FP->end = end;
|
FP->end = end;
|
||||||
FP->aux = end;
|
FP->aux = end;
|
||||||
FB->ref = nil;
|
FP->ref = nil;
|
||||||
FP->dot = dot;
|
FP->dot = dot;
|
||||||
FP->env = env;
|
FP->env = env;
|
||||||
FP->op = nil;
|
FP->op = nil;
|
||||||
|
@ -2153,6 +2165,9 @@ amlinit(void)
|
||||||
{
|
{
|
||||||
Name *n;
|
Name *n;
|
||||||
|
|
||||||
|
FB = F0;
|
||||||
|
FP = F0-1;
|
||||||
|
|
||||||
fmtinstall('V', Vfmt);
|
fmtinstall('V', Vfmt);
|
||||||
fmtinstall('N', Nfmt);
|
fmtinstall('N', Nfmt);
|
||||||
|
|
||||||
|
@ -2190,7 +2205,8 @@ void
|
||||||
amlexit(void)
|
amlexit(void)
|
||||||
{
|
{
|
||||||
amlroot = nil;
|
amlroot = nil;
|
||||||
FP = FB-1;
|
FB = F0;
|
||||||
|
FP = F0-1;
|
||||||
gc();
|
gc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2269,6 +2285,8 @@ amleval(void *dot, char *fmt, ...)
|
||||||
return -1;
|
return -1;
|
||||||
if(m->eval == nil)
|
if(m->eval == nil)
|
||||||
return xec(m->start, m->end, forkname(m->name), e, r);
|
return xec(m->start, m->end, forkname(m->name), e, r);
|
||||||
|
if(FB < F0 || FB >= FT)
|
||||||
|
return -1;
|
||||||
FP = FB;
|
FP = FB;
|
||||||
FP->op = nil;
|
FP->op = nil;
|
||||||
FP->env = e;
|
FP->env = e;
|
||||||
|
|
Loading…
Reference in a new issue