From c9af0768fc009bac1c2eb929a81e39b74f8956a5 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 17 Dec 2010 10:05:37 -0200 Subject: GC does not mark dead registers inside activation record --- lvm.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lvm.c b/lvm.c index 06dc4861..98715d0a 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.125 2010/10/29 17:52:46 roberto Exp roberto $ +** $Id: lvm.c,v 2.126 2010/12/06 21:08:36 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -471,7 +471,7 @@ void luaV_finishOp (lua_State *L) { #define Protect(x) { {x;}; base = ci->u.l.base; } -#define checkGC(L) Protect(luaC_checkGC(L); luai_threadyield(L);) +#define checkGC(L,c) Protect(luaC_condGC(L, c); luai_threadyield(L);) #define arith_op(op,tm) { \ @@ -558,7 +558,11 @@ void luaV_execute (lua_State *L) { sethvalue(L, ra, t); if (b != 0 || c != 0) luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); - checkGC(L); + checkGC(L, + L->top = ra + 1; /* limit of live values */ + luaC_step(L); + L->top = ci->top; /* restore top */ + ) ) vmcase(OP_SELF, StkId rb = RB(i); @@ -603,10 +607,17 @@ void luaV_execute (lua_State *L) { vmcase(OP_CONCAT, int b = GETARG_B(i); int c = GETARG_C(i); + StkId rb; L->top = base + c + 1; /* mark the end of concat operands */ - Protect(luaV_concat(L, c-b+1); checkGC(L);) + Protect(luaV_concat(L, c - b + 1)); + ra = RA(i); /* 'luav_concat' may invoke TMs and move the stack */ + rb = b + base; + setobjs2s(L, ra, rb); + checkGC(L, + L->top = (ra >= rb ? ra + 1 : rb); /* limit of live values */ + luaC_step(L); + ) L->top = ci->top; /* restore top */ - setobjs2s(L, RA(i), base+b); ) vmcase(OP_JMP, dojump(GETARG_sBx(i)); @@ -780,7 +791,11 @@ void luaV_execute (lua_State *L) { pushclosure(L, p, cl->upvals, base, ra); /* create a new one */ else setclvalue(L, ra, ncl); /* push cashed closure */ - checkGC(L); + checkGC(L, + L->top = ra + 1; /* limit of live values */ + luaC_step(L); + L->top = ci->top; /* restore top */ + ) ) vmcase(OP_VARARG, int b = GETARG_B(i) - 1; -- cgit v1.2.3-55-g6feb