From 47fc57a2529c83376883f36954082cfe80ae588f Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> Date: Wed, 10 Dec 2003 10:13:36 -0200 Subject: `TObject' renamed to `TValue' + other name changes and better assertions for incremental garbage collection --- lgc.c | 104 +++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) (limited to 'lgc.c') diff --git a/lgc.c b/lgc.c index 8cb8620f..147593b0 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.186 2003/12/04 18:52:23 roberto Exp roberto $ +** $Id: lgc.c,v 1.187 2003/12/09 16:56:11 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -22,7 +22,7 @@ #include "ltm.h" -#define GCSTEPSIZE (20*sizeof(TObject)) +#define GCSTEPSIZE (20*sizeof(TValue)) #define gray2black(x) setbit((x)->gch.marked, BLACKBIT) @@ -39,8 +39,8 @@ #define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT) -#define isfinalized(u) testbit((u)->uv.marked, FINALIZEDBIT) -#define markfinalized(u) setbit((u)->uv.marked, FINALIZEDBIT) +#define isfinalized(u) testbit((u)->marked, FINALIZEDBIT) +#define markfinalized(u) setbit((u)->marked, FINALIZEDBIT) #define KEYWEAK bitmask(KEYWEAKBIT) @@ -55,8 +55,8 @@ if (iscollectable(o) && iswhite(gcvalue(o)) && (c)) \ reallymarkobject(g,gcvalue(o)); } -#define markobject(g,t) { if (iswhite(valtogco(t))) \ - reallymarkobject(g, valtogco(t)); } +#define markobject(g,t) { if (iswhite(obj2gco(t))) \ + reallymarkobject(g, obj2gco(t)); } @@ -66,34 +66,34 @@ static size_t objsize (GCObject *o) { switch (o->gch.tt) { case LUA_TSTRING: { - TString *ts = gcotots(o); + TString *ts = rawgco2ts(o); return sizestring(ts->tsv.len); } case LUA_TUSERDATA: { - Udata *u = gcotou(o); + Udata *u = rawgco2u(o); return sizeudata(u->uv.len); } case LUA_TTABLE: { - Table *h = gcotoh(o); - return sizeof(Table) + sizeof(TObject) * h->sizearray + + Table *h = gco2h(o); + return sizeof(Table) + sizeof(TValue) * h->sizearray + sizeof(Node) * sizenode(h); } case LUA_TUPVAL: return sizeof(UpVal); case LUA_TFUNCTION: { - Closure *cl = gcotocl(o); + Closure *cl = gco2cl(o); return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : sizeLclosure(cl->l.nupvalues); } case LUA_TTHREAD: { - lua_State *th = gcototh(o); - return sizeof(lua_State) + sizeof(TObject) * th->stacksize + + lua_State *th = gco2th(o); + return sizeof(lua_State) + sizeof(TValue) * th->stacksize + sizeof(CallInfo) * th->size_ci; } case LUA_TPROTO: { - Proto *p = gcotop(o); + Proto *p = gco2p(o); return sizeof(Proto) + sizeof(Instruction) * p->sizecode + - sizeof(Proto *) * p->sizep + sizeof(TObject) * p->sizek + + sizeof(Proto *) * p->sizep + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues; } @@ -112,29 +112,29 @@ static void reallymarkobject (global_State *g, GCObject *o) { return; } case LUA_TUSERDATA: { - Table *mt = gcotou(o)->uv.metatable; + Table *mt = gco2u(o)->metatable; gray2black(o); /* udata are never gray */ if (mt) markobject(g, mt); return; } case LUA_TFUNCTION: { - gcotocl(o)->c.gclist = g->gray; + gco2cl(o)->c.gclist = g->gray; break; } case LUA_TTABLE: { - gcotoh(o)->gclist = g->gray; + gco2h(o)->gclist = g->gray; break; } case LUA_TTHREAD: { - gcototh(o)->gclist = g->gray; + gco2th(o)->gclist = g->gray; break; } case LUA_TPROTO: { - gcotop(o)->gclist = g->gray; + gco2p(o)->gclist = g->gray; break; } case LUA_TUPVAL: { - gcotouv(o)->gclist = g->gray; + gco2uv(o)->gclist = g->gray; break; } default: lua_assert(0); @@ -161,15 +161,15 @@ size_t luaC_separateudata (lua_State *L) { GCObject **lastcollected = &collected; while ((curr = *p) != NULL) { lua_assert(curr->gch.tt == LUA_TUSERDATA); - if (!iswhite(curr) || isfinalized(gcotou(curr))) + if (!iswhite(curr) || isfinalized(gco2u(curr))) p = &curr->gch.next; /* don't bother with them */ - else if (fasttm(L, gcotou(curr)->uv.metatable, TM_GC) == NULL) { - markfinalized(gcotou(curr)); /* don't need finalization */ + else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) { + markfinalized(gco2u(curr)); /* don't need finalization */ p = &curr->gch.next; } else { /* must call its gc method */ - deadmem += sizeudata(gcotou(curr)->uv.len); - markfinalized(gcotou(curr)); + deadmem += sizeudata(gco2u(curr)->len); + markfinalized(gco2u(curr)); *p = curr->gch.next; curr->gch.next = NULL; /* link `curr' at the end of `collected' list */ *lastcollected = curr; @@ -187,7 +187,7 @@ static void traversetable (global_State *g, Table *h) { int i; int weakkey = 0; int weakvalue = 0; - const TObject *mode; + const TValue *mode; if (h->metatable) markobject(g, h->metatable); lua_assert(h->lsizenode || h->node == g->dummynode); @@ -200,7 +200,7 @@ static void traversetable (global_State *g, Table *h) { h->marked |= cast(lu_byte, (weakkey << KEYWEAKBIT) | (weakvalue << VALUEWEAKBIT)); h->gclist = g->weak; /* must be cleared after GC, ... */ - g->weak = valtogco(h); /* ... so put in the appropriate list */ + g->weak = obj2gco(h); /* ... so put in the appropriate list */ } } if (weakkey && weakvalue) return; @@ -230,7 +230,7 @@ static void traverseproto (global_State *g, Proto *f) { if (f->source) stringmark(f->source); for (i=0; i<f->sizek; i++) { /* mark literal strings */ if (ttisstring(f->k+i)) - stringmark(tsvalue(f->k+i)); + stringmark(rawtsvalue(f->k+i)); } for (i=0; i<f->sizeupvalues; i++) { /* mark upvalue names */ if (f->upvalues[i]) @@ -306,19 +306,19 @@ static l_mem propagatemarks (global_State *g, l_mem lim) { gray2black(o); switch (o->gch.tt) { case LUA_TTABLE: { - Table *h = gcotoh(o); + Table *h = gco2h(o); g->gray = h->gclist; traversetable(g, h); break; } case LUA_TFUNCTION: { - Closure *cl = gcotocl(o); + Closure *cl = gco2cl(o); g->gray = cl->c.gclist; traverseclosure(g, cl); break; } case LUA_TTHREAD: { - lua_State *th = gcototh(o); + lua_State *th = gco2th(o); g->gray = th->gclist; th->gclist = g->grayagain; g->grayagain = o; @@ -327,13 +327,13 @@ static l_mem propagatemarks (global_State *g, l_mem lim) { break; } case LUA_TPROTO: { - Proto *p = gcotop(o); + Proto *p = gco2p(o); g->gray = p->gclist; traverseproto(g, p); break; } case LUA_TUPVAL: { - UpVal *uv = gcotouv(o); + UpVal *uv = gco2uv(o); g->gray = uv->gclist; if (uv->v != &uv->value) { /* open? */ uv->gclist = g->grayagain; @@ -360,10 +360,10 @@ static l_mem propagatemarks (global_State *g, l_mem lim) { ** other objects: if really collected, cannot keep them; for userdata ** being finalized, keep them in keys, but not in values */ -static int iscleared (const TObject *o, int iskey) { +static int iscleared (const TValue *o, int iskey) { if (!iscollectable(o)) return 0; if (ttisstring(o)) { - stringmark(tsvalue(o)); /* strings are `values', so are never weak */ + stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */ return 0; } return iswhite(gcvalue(o)) || @@ -383,13 +383,13 @@ static void removekey (Node *n) { */ static void cleartable (GCObject *l) { while (l) { - Table *h = gcotoh(l); + Table *h = gco2h(l); int i = h->sizearray; lua_assert(testbit(h->marked, VALUEWEAKBIT) || testbit(h->marked, KEYWEAKBIT)); if (testbit(h->marked, VALUEWEAKBIT)) { while (i--) { - TObject *o = &h->array[i]; + TValue *o = &h->array[i]; if (iscleared(o, 0)) /* value was collected? */ setnilvalue(o); /* remove value */ } @@ -408,21 +408,21 @@ static void cleartable (GCObject *l) { static void freeobj (lua_State *L, GCObject *o) { switch (o->gch.tt) { - case LUA_TPROTO: luaF_freeproto(L, gcotop(o)); break; - case LUA_TFUNCTION: luaF_freeclosure(L, gcotocl(o)); break; - case LUA_TUPVAL: luaM_freelem(L, gcotouv(o)); break; - case LUA_TTABLE: luaH_free(L, gcotoh(o)); break; + case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; + case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; + case LUA_TUPVAL: luaM_freelem(L, gco2uv(o)); break; + case LUA_TTABLE: luaH_free(L, gco2h(o)); break; case LUA_TTHREAD: { - lua_assert(gcototh(o) != L && gcototh(o) != G(L)->mainthread); - luaE_freethread(L, gcototh(o)); + lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread); + luaE_freethread(L, gco2th(o)); break; } case LUA_TSTRING: { - luaM_free(L, o, sizestring(gcotots(o)->tsv.len)); + luaM_free(L, o, sizestring(gco2ts(o)->len)); break; } case LUA_TUSERDATA: { - luaM_free(L, o, sizeudata(gcotou(o)->uv.len)); + luaM_free(L, o, sizeudata(gco2u(o)->len)); break; } default: lua_assert(0); @@ -463,7 +463,7 @@ static l_mem sweepstrings (lua_State *L, int all, l_mem lim) { GCObject **p = &G(L)->strt.hash[i]; while ((curr = *p) != NULL) { int mark = curr->gch.marked; - lu_mem size = sizestring(gcotots(curr)->tsv.len); + lu_mem size = sizestring(gco2ts(curr)->len); if (!all && (!(mark & dead) || testbit(mark, FIXEDBIT))) { makewhite(g, curr); lua_assert(iswhite(curr) && !isdead(g, curr)); @@ -503,8 +503,8 @@ static void GCTM (lua_State *L) { g->gcstate = GCSroot; /* will restart GC */ else { GCObject *o = g->tmudata; - Udata *udata = gcotou(o); - const TObject *tm; + Udata *udata = rawgco2u(o); + const TValue *tm; g->tmudata = udata->uv.next; /* remove udata from `tmudata' */ udata->uv.next = g->firstudata->uv.next; /* return it to `root' list */ g->firstudata->uv.next = o; @@ -513,8 +513,8 @@ static void GCTM (lua_State *L) { if (tm != NULL) { lu_byte oldah = L->allowhook; L->allowhook = 0; /* stop debug hooks during GC tag method */ - setobj2s(L->top, tm); - setuvalue(L->top+1, udata); + setobj2s(L, L->top, tm); + setuvalue(L, L->top+1, udata); L->top += 2; luaD_call(L, L->top - 2, 0); L->allowhook = oldah; /* restore hooks */ @@ -545,7 +545,7 @@ static void markroot (lua_State *L) { global_State *g = G(L); lua_assert(g->gray == NULL); g->weak = NULL; - makewhite(g, valtogco(g->mainthread)); + makewhite(g, obj2gco(g->mainthread)); markobject(g, g->mainthread); markvalue(g, registry(L)); markobject(g, L); /* mark running thread */ -- cgit v1.2.3-55-g6feb