summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-12-13 13:42:08 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-12-13 13:42:08 -0200
commit88e23f508c5d3e3bf160febb58cd4608aa994522 (patch)
treed38b5861ba7ca7d5909ce0d6a23753adc7df1fe3
parentc8585efc7807b3cfeb1622a73f48a285ea4da5e5 (diff)
downloadlua-88e23f508c5d3e3bf160febb58cd4608aa994522.tar.gz
lua-88e23f508c5d3e3bf160febb58cd4608aa994522.tar.bz2
lua-88e23f508c5d3e3bf160febb58cd4608aa994522.zip
details
-rw-r--r--lgc.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/lgc.c b/lgc.c
index b7371308..0ef4a679 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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*/
228static void reallymarkobject (global_State *g, GCObject *o) { 228static 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