diff options
| -rw-r--r-- | lgc.c | 30 |
1 files changed, 13 insertions, 17 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.166 2013/09/17 15:40:06 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.167 2013/12/13 15:17:00 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 | */ |
| @@ -226,54 +226,50 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | |||
| 226 | ** upvalues are already linked in 'headuv' list.) | 226 | ** upvalues are already linked in 'headuv' list.) |
| 227 | */ | 227 | */ |
| 228 | static void reallymarkobject (global_State *g, GCObject *o) { | 228 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 229 | lu_mem size; | ||
| 230 | reentry: | 229 | reentry: |
| 231 | white2gray(o); | 230 | white2gray(o); |
| 232 | switch (gch(o)->tt) { | 231 | switch (gch(o)->tt) { |
| 233 | case LUA_TSHRSTR: | 232 | case LUA_TSHRSTR: |
| 234 | case LUA_TLNGSTR: { | 233 | case LUA_TLNGSTR: { |
| 235 | size = sizestring(gco2ts(o)); | 234 | gray2black(o); |
| 236 | break; /* nothing else to mark; make it black */ | 235 | g->GCmemtrav += sizestring(gco2ts(o)); |
| 236 | break; | ||
| 237 | } | 237 | } |
| 238 | case LUA_TUSERDATA: { | 238 | case LUA_TUSERDATA: { |
| 239 | Table *mt = gco2u(o)->metatable; | 239 | markobject(g, gco2u(o)->metatable); /* mark its metatable */ |
| 240 | markobject(g, mt); | ||
| 241 | gray2black(o); | 240 | gray2black(o); |
| 242 | g->GCmemtrav += sizeudata(gco2u(o)); | 241 | g->GCmemtrav += sizeudata(gco2u(o)); |
| 243 | /* markobject(g, gco2u(o)->env); */ | ||
| 244 | o = obj2gco(gco2u(o)->env); | 242 | o = obj2gco(gco2u(o)->env); |
| 245 | if (o && iswhite(o)) | 243 | if (o && iswhite(o)) |
| 246 | goto reentry; | 244 | goto reentry; /* reallymarkobject(g, gco2u(o)->env); */ |
| 247 | return; | 245 | break; |
| 248 | } | 246 | } |
| 249 | case LUA_TLCL: { | 247 | case LUA_TLCL: { |
| 250 | gco2lcl(o)->gclist = g->gray; | 248 | gco2lcl(o)->gclist = g->gray; |
| 251 | g->gray = o; | 249 | g->gray = o; |
| 252 | return; | 250 | break; |
| 253 | } | 251 | } |
| 254 | case LUA_TCCL: { | 252 | case LUA_TCCL: { |
| 255 | gco2ccl(o)->gclist = g->gray; | 253 | gco2ccl(o)->gclist = g->gray; |
| 256 | g->gray = o; | 254 | g->gray = o; |
| 257 | return; | 255 | break; |
| 258 | } | 256 | } |
| 259 | case LUA_TTABLE: { | 257 | case LUA_TTABLE: { |
| 260 | linktable(gco2t(o), &g->gray); | 258 | linktable(gco2t(o), &g->gray); |
| 261 | return; | 259 | break; |
| 262 | } | 260 | } |
| 263 | case LUA_TTHREAD: { | 261 | case LUA_TTHREAD: { |
| 264 | gco2th(o)->gclist = g->gray; | 262 | gco2th(o)->gclist = g->gray; |
| 265 | g->gray = o; | 263 | g->gray = o; |
| 266 | return; | 264 | break; |
| 267 | } | 265 | } |
| 268 | case LUA_TPROTO: { | 266 | case LUA_TPROTO: { |
| 269 | gco2p(o)->gclist = g->gray; | 267 | gco2p(o)->gclist = g->gray; |
| 270 | g->gray = o; | 268 | g->gray = o; |
| 271 | return; | 269 | break; |
| 272 | } | 270 | } |
| 273 | default: lua_assert(0); return; | 271 | default: lua_assert(0); break; |
| 274 | } | 272 | } |
| 275 | gray2black(o); | ||
| 276 | g->GCmemtrav += size; | ||
| 277 | } | 273 | } |
| 278 | 274 | ||
| 279 | 275 | ||
