From c8585efc7807b3cfeb1622a73f48a285ea4da5e5 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 13 Dec 2013 13:17:00 -0200 Subject: [PATCH] use goto to implement a tail call in 'reallymarkobject' --- lgc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lgc.c b/lgc.c index ee4c90cc..b7371308 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.165 2013/09/13 16:21:52 roberto Exp roberto $ +** $Id: lgc.c,v 2.166 2013/09/17 15:40:06 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -227,6 +227,7 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { */ static void reallymarkobject (global_State *g, GCObject *o) { lu_mem size; + reentry: white2gray(o); switch (gch(o)->tt) { case LUA_TSHRSTR: @@ -237,9 +238,13 @@ static void reallymarkobject (global_State *g, GCObject *o) { case LUA_TUSERDATA: { Table *mt = gco2u(o)->metatable; markobject(g, mt); - markobject(g, gco2u(o)->env); - size = sizeudata(gco2u(o)); - break; + gray2black(o); + g->GCmemtrav += sizeudata(gco2u(o)); + /* markobject(g, gco2u(o)->env); */ + o = obj2gco(gco2u(o)->env); + if (o && iswhite(o)) + goto reentry; + return; } case LUA_TLCL: { gco2lcl(o)->gclist = g->gray;