details
This commit is contained in:
24
lgc.c
24
lgc.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lgc.c,v 1.147 2002/08/16 20:00:28 roberto Exp roberto $
|
||||
** $Id: lgc.c,v 1.148 2002/08/30 19:09:21 roberto Exp roberto $
|
||||
** Garbage Collector
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@@ -48,10 +48,15 @@ typedef struct GCState {
|
||||
|
||||
static void reallymarkobject (GCState *st, GCObject *o);
|
||||
|
||||
#define markobject(st,o) \
|
||||
if (iscollectable(o)) reallymarkobject(st,(o)->value.gc)
|
||||
#define markobject(st,o) { checkconsistency(o); \
|
||||
if (iscollectable(o) && !ismarked(gcvalue(o))) reallymarkobject(st,gcvalue(o)); }
|
||||
|
||||
#define marktable(st,t) reallymarkobject(st, cast(GCObject *, (t)))
|
||||
#define condmarkobject(st,o,c) { checkconsistency(o); \
|
||||
if (iscollectable(o) && !ismarked(gcvalue(o)) && (c)) \
|
||||
reallymarkobject(st,gcvalue(o)); }
|
||||
|
||||
#define marktable(st,t) { if (!ismarked(cast(GCObject *, t))) \
|
||||
reallymarkobject(st, cast(GCObject *, (t))); }
|
||||
|
||||
|
||||
static void markproto (Proto *f) {
|
||||
@@ -96,7 +101,6 @@ static void markclosure (GCState *st, Closure *cl) {
|
||||
|
||||
|
||||
static void reallymarkobject (GCState *st, GCObject *o) {
|
||||
if (ismarked(o)) return;
|
||||
mark(o);
|
||||
switch (o->gch.tt) {
|
||||
case LUA_TFUNCTION: {
|
||||
@@ -157,10 +161,8 @@ static void traversestacks (GCState *st) {
|
||||
|
||||
static void marktmu (GCState *st) {
|
||||
GCObject *u;
|
||||
for (u = G(st->L)->tmudata; u; u = u->uv.next) {
|
||||
mark(u);
|
||||
marktable(st, (&u->u)->uv.metatable);
|
||||
}
|
||||
for (u = G(st->L)->tmudata; u; u = u->uv.next)
|
||||
reallymarkobject(st, u);
|
||||
}
|
||||
|
||||
|
||||
@@ -221,8 +223,8 @@ static void traversetable (GCState *st, Table *h) {
|
||||
Node *n = node(h, i);
|
||||
if (!ttisnil(val(n))) {
|
||||
lua_assert(!ttisnil(key(n)));
|
||||
if (!weakkey) markobject(st, key(n));
|
||||
if (!weakvalue) markobject(st, val(n));
|
||||
condmarkobject(st, key(n), !weakkey);
|
||||
condmarkobject(st, val(n), !weakvalue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user