diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-12-13 13:42:08 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-12-13 13:42:08 -0200 |
commit | 88e23f508c5d3e3bf160febb58cd4608aa994522 (patch) | |
tree | d38b5861ba7ca7d5909ce0d6a23753adc7df1fe3 | |
parent | c8585efc7807b3cfeb1622a73f48a285ea4da5e5 (diff) | |
download | lua-88e23f508c5d3e3bf160febb58cd4608aa994522.tar.gz lua-88e23f508c5d3e3bf160febb58cd4608aa994522.tar.bz2 lua-88e23f508c5d3e3bf160febb58cd4608aa994522.zip |
details
-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 | ||