commit 4964e7c8a0284a75a57cf591c3b3c77febaf40e6
parent 2c670baf24115d9c59b5869b89873b93af8b779d
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Mon, 2 Sep 2002 16:54:27 -0300
details
Diffstat:
4 files changed, 26 insertions(+), 32 deletions(-)
diff --git a/lgc.c b/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);
}
}
}
diff --git a/lobject.c b/lobject.c
@@ -1,5 +1,5 @@
/*
-** $Id: lobject.c,v 1.85 2002/07/17 16:25:13 roberto Exp roberto $
+** $Id: lobject.c,v 1.86 2002/08/07 14:35:55 roberto Exp roberto $
** Some generic functions over Lua objects
** See Copyright Notice in lua.h
*/
@@ -58,25 +58,17 @@ int luaO_log2 (unsigned int x) {
int luaO_rawequalObj (const TObject *t1, const TObject *t2) {
if (ttype(t1) != ttype(t2)) return 0;
switch (ttype(t1)) {
- case LUA_TNUMBER:
- return nvalue(t1) == nvalue(t2);
case LUA_TNIL:
return 1;
- case LUA_TSTRING:
- return tsvalue(t1) == tsvalue(t2);
case LUA_TBOOLEAN:
return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */
case LUA_TLIGHTUSERDATA:
return pvalue(t1) == pvalue(t2);
- case LUA_TUSERDATA:
- return uvalue(t1) == uvalue(t2);
- case LUA_TTABLE:
- return hvalue(t1) == hvalue(t2);
- case LUA_TFUNCTION:
- return clvalue(t1) == clvalue(t2);
+ case LUA_TNUMBER:
+ return nvalue(t1) == nvalue(t2);
+ default:
+ return gcvalue(t1) == gcvalue(t2);
}
- lua_assert(0);
- return 0; /* to avoid warnings */
}
diff --git a/lobject.h b/lobject.h
@@ -1,5 +1,5 @@
/*
-** $Id: lobject.h,v 1.143 2002/08/16 14:45:55 roberto Exp roberto $
+** $Id: lobject.h,v 1.144 2002/08/30 19:09:21 roberto Exp roberto $
** Type definitions for Lua objects
** See Copyright Notice in lua.h
*/
@@ -67,6 +67,7 @@ typedef struct lua_TObject {
/* Macros to access values */
#define ttype(o) ((o)->tt)
+#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc)
#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p)
#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n)
#define tsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts)
@@ -113,6 +114,9 @@ typedef struct lua_TObject {
#define setnilvalue(obj) ((obj)->tt=LUA_TNIL)
+/*
+** for internal debug only
+*/
#define checkconsistency(obj) \
lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt))
diff --git a/ltable.c b/ltable.c
@@ -1,5 +1,5 @@
/*
-** $Id: ltable.c,v 1.117 2002/08/16 14:45:55 roberto Exp roberto $
+** $Id: ltable.c,v 1.118 2002/08/30 19:09:21 roberto Exp roberto $
** Lua tables (hash)
** See Copyright Notice in lua.h
*/
@@ -83,12 +83,8 @@ Node *luaH_mainposition (const Table *t, const TObject *key) {
return hashboolean(t, bvalue(key));
case LUA_TLIGHTUSERDATA:
return hashpointer(t, pvalue(key));
- case LUA_TUSERDATA:
- return hashpointer(t, uvalue(key));
- case LUA_TFUNCTION:
- return hashpointer(t, clvalue(key));
- case LUA_TTABLE:
- return hashpointer(t, hvalue(key));
+ default:
+ return hashpointer(t, gcvalue(key));
}
lua_assert(0);
return 0; /* to avoid warnings */