aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-02-19 10:52:42 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-02-19 10:52:42 -0300
commitc86b9da02276652a22426b2a5a194ba1f070fcf4 (patch)
treea910fbba8cdae6ad2344205b6547e154b6a12dff /lgc.c
parenta4c6dcf999ddea865e295ea34926a838a1f97b61 (diff)
downloadlua-c86b9da02276652a22426b2a5a194ba1f070fcf4.tar.gz
lua-c86b9da02276652a22426b2a5a194ba1f070fcf4.tar.bz2
lua-c86b9da02276652a22426b2a5a194ba1f070fcf4.zip
userdata can have any Lua value as uservalue
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lgc.c b/lgc.c
index c210b67e..93e22f0f 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.176 2014/02/18 13:39:37 roberto Exp roberto $ 2** $Id: lgc.c,v 2.177 2014/02/18 13:46:26 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*/
@@ -233,12 +233,15 @@ static void reallymarkobject (global_State *g, GCObject *o) {
233 break; 233 break;
234 } 234 }
235 case LUA_TUSERDATA: { 235 case LUA_TUSERDATA: {
236 TValue uvalue;
236 markobject(g, gco2u(o)->metatable); /* mark its metatable */ 237 markobject(g, gco2u(o)->metatable); /* mark its metatable */
237 gray2black(o); 238 gray2black(o);
238 g->GCmemtrav += sizeudata(gco2u(o)); 239 g->GCmemtrav += sizeudata(gco2u(o));
239 o = obj2gco(gco2u(o)->env); 240 getuservalue(g->mainthread, rawgco2u(o), &uvalue);
240 if (o && iswhite(o)) 241 if (valiswhite(&uvalue)) { /* markvalue(g, &uvalue); */
241 goto reentry; /* reallymarkobject(g, gco2u(o)->env); */ 242 o = gcvalue(&uvalue);
243 goto reentry;
244 }
242 break; 245 break;
243 } 246 }
244 case LUA_TLCL: { 247 case LUA_TLCL: {