diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-02-19 10:52:42 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-02-19 10:52:42 -0300 |
commit | c86b9da02276652a22426b2a5a194ba1f070fcf4 (patch) | |
tree | a910fbba8cdae6ad2344205b6547e154b6a12dff /lgc.c | |
parent | a4c6dcf999ddea865e295ea34926a838a1f97b61 (diff) | |
download | lua-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.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -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: { |