diff options
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -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); | |||
118 | static GCObject **getgclist (GCObject *o) { | 118 | static 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 | } |