From 621ef9f7675829234e75b0b3e73afc7a1a74aa16 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 19 Jan 2005 13:54:26 -0200 Subject: better control over GC collors of upvalues --- ltests.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'ltests.c') diff --git a/ltests.c b/ltests.c index e99b432f..8686fa73 100644 --- a/ltests.c +++ b/ltests.c @@ -272,7 +272,13 @@ static void checkclosure (global_State *g, Closure *cl) { static void checkstack (global_State *g, lua_State *L1) { StkId o; CallInfo *ci; + GCObject *uvo; lua_assert(!isdead(g, obj2gco(L1))); + for (uvo = L1->openupval; uvo != NULL; uvo = uvo->gch.next) { + UpVal *uv = gco2uv(uvo); + lua_assert(uv->v != &uv->u.value); /* must be open */ + lua_assert(!isblack(uvo)); /* open upvalues cannot be black */ + } checkliveness(g, gt(L1)); if (L1->base_ci) { for (ci = L1->base_ci; ci <= L1->ci; ci++) @@ -300,6 +306,7 @@ printf(">>> %d %s %02x\n", g->gcstate, luaT_typenames[o->gch.tt], o->gch.marke case LUA_TUPVAL: { UpVal *uv = gco2uv(o); lua_assert(uv->v == &uv->u.value); /* must be closed */ + lua_assert(!isgray(o)); /* closed upvalues are never gray */ checkvalref(g, o, uv->v); break; } @@ -333,14 +340,20 @@ printf(">>> %d %s %02x\n", g->gcstate, luaT_typenames[o->gch.tt], o->gch.marke int lua_checkmemory (lua_State *L) { global_State *g = G(L); GCObject *o; + UpVal *uv; checkstack(g, g->mainthread); for (o = g->rootgc; o != obj2gco(g->mainthread); o = o->gch.next) checkobject(g, o); - checkobject(g, obj2gco(g->mainthread)); - for (o = g->mainthread->next; o != NULL; o = o->gch.next) { + for (o = o->gch.next; o != NULL; o = o->gch.next) { lua_assert(o->gch.tt == LUA_TUSERDATA); checkobject(g, o); } + for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + lua_assert(uv->v != &uv->u.value); /* must be open */ + lua_assert(!isblack(obj2gco(uv))); /* open upvalues are never black */ + checkvalref(g, obj2gco(uv), uv->v); + } return 0; } -- cgit v1.2.3-55-g6feb