aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/lgc.c b/lgc.c
index 13f372d3..9da0f498 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.250 2018/02/23 13:16:18 roberto Exp roberto $ 2** $Id: lgc.c,v 2.251 2018/02/23 13:21:27 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -118,11 +118,15 @@ static lu_mem atomic (lua_State *L);
118static GCObject **getgclist (GCObject *o) { 118static GCObject **getgclist (GCObject *o) {
119 switch (o->tt) { 119 switch (o->tt) {
120 case LUA_TTABLE: return &gco2t(o)->gclist; 120 case LUA_TTABLE: return &gco2t(o)->gclist;
121 case LUA_TUSERDATA: return &gco2u(o)->gclist;
122 case LUA_TLCL: return &gco2lcl(o)->gclist; 121 case LUA_TLCL: return &gco2lcl(o)->gclist;
123 case LUA_TCCL: return &gco2ccl(o)->gclist; 122 case LUA_TCCL: return &gco2ccl(o)->gclist;
124 case LUA_TTHREAD: return &gco2th(o)->gclist; 123 case LUA_TTHREAD: return &gco2th(o)->gclist;
125 case LUA_TPROTO: return &gco2p(o)->gclist; 124 case LUA_TPROTO: return &gco2p(o)->gclist;
125 case LUA_TUSERDATA: {
126 Udata *u = gco2u(o);
127 lua_assert(u->nuvalue > 0);
128 return &u->gclist;
129 }
126 default: lua_assert(0); return 0; 130 default: lua_assert(0); return 0;
127 } 131 }
128} 132}
@@ -290,8 +294,17 @@ static void reallymarkobject (global_State *g, GCObject *o) {
290 markvalue(g, uv->v); /* mark its content */ 294 markvalue(g, uv->v); /* mark its content */
291 break; 295 break;
292 } 296 }
297 case LUA_TUSERDATA: {
298 Udata *u = gco2u(o);
299 if (u->nuvalue == 0) { /* no user values? */
300 markobjectN(g, u->metatable); /* mark its metatable */
301 gray2black(o); /* nothing else to mark */
302 break;
303 }
304 /* else *//* FALLTHROUGH */
305 }
293 case LUA_TLCL: case LUA_TCCL: case LUA_TTABLE: 306 case LUA_TLCL: case LUA_TCCL: case LUA_TTABLE:
294 case LUA_TUSERDATA: case LUA_TTHREAD: case LUA_TPROTO: { 307 case LUA_TTHREAD: case LUA_TPROTO: {
295 linkobjgclist(o, g->gray); 308 linkobjgclist(o, g->gray);
296 break; 309 break;
297 } 310 }