diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-26 10:35:03 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-26 10:35:03 -0300 |
| commit | 2952bc5fc9cdc05ed061539cb7be26899513f004 (patch) | |
| tree | ac3b1438843797e816ed04fac102c0820ea174ea /lgc.c | |
| parent | 38d3bc89093010fa9c460b61a1965d9077b5378f (diff) | |
| download | lua-2952bc5fc9cdc05ed061539cb7be26899513f004.tar.gz lua-2952bc5fc9cdc05ed061539cb7be26899513f004.tar.bz2 lua-2952bc5fc9cdc05ed061539cb7be26899513f004.zip | |
special compact representation for userdata with no user values
(a common case)
Diffstat (limited to 'lgc.c')
| -rw-r--r-- | lgc.c | 19 |
1 files changed, 16 insertions, 3 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.250 2018/02/23 13:16:18 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.251 2018/02/23 13:21:27 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 | */ |
| @@ -118,11 +118,15 @@ static lu_mem atomic (lua_State *L); | |||
| 118 | static GCObject **getgclist (GCObject *o) { | 118 | static GCObject **getgclist (GCObject *o) { |
| 119 | switch (o->tt) { | 119 | switch (o->tt) { |
| 120 | case LUA_TTABLE: return &gco2t(o)->gclist; | 120 | case LUA_TTABLE: return &gco2t(o)->gclist; |
| 121 | case LUA_TUSERDATA: return &gco2u(o)->gclist; | ||
| 122 | case LUA_TLCL: return &gco2lcl(o)->gclist; | 121 | case LUA_TLCL: return &gco2lcl(o)->gclist; |
| 123 | case LUA_TCCL: return &gco2ccl(o)->gclist; | 122 | case LUA_TCCL: return &gco2ccl(o)->gclist; |
| 124 | case LUA_TTHREAD: return &gco2th(o)->gclist; | 123 | case LUA_TTHREAD: return &gco2th(o)->gclist; |
| 125 | case LUA_TPROTO: return &gco2p(o)->gclist; | 124 | case LUA_TPROTO: return &gco2p(o)->gclist; |
| 125 | case LUA_TUSERDATA: { | ||
| 126 | Udata *u = gco2u(o); | ||
| 127 | lua_assert(u->nuvalue > 0); | ||
| 128 | return &u->gclist; | ||
| 129 | } | ||
| 126 | default: lua_assert(0); return 0; | 130 | default: lua_assert(0); return 0; |
| 127 | } | 131 | } |
| 128 | } | 132 | } |
| @@ -290,8 +294,17 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
| 290 | markvalue(g, uv->v); /* mark its content */ | 294 | markvalue(g, uv->v); /* mark its content */ |
| 291 | break; | 295 | break; |
| 292 | } | 296 | } |
| 297 | case LUA_TUSERDATA: { | ||
| 298 | Udata *u = gco2u(o); | ||
| 299 | if (u->nuvalue == 0) { /* no user values? */ | ||
| 300 | markobjectN(g, u->metatable); /* mark its metatable */ | ||
| 301 | gray2black(o); /* nothing else to mark */ | ||
| 302 | break; | ||
| 303 | } | ||
| 304 | /* else *//* FALLTHROUGH */ | ||
| 305 | } | ||
| 293 | case LUA_TLCL: case LUA_TCCL: case LUA_TTABLE: | 306 | case LUA_TLCL: case LUA_TCCL: case LUA_TTABLE: |
| 294 | case LUA_TUSERDATA: case LUA_TTHREAD: case LUA_TPROTO: { | 307 | case LUA_TTHREAD: case LUA_TPROTO: { |
| 295 | linkobjgclist(o, g->gray); | 308 | linkobjgclist(o, g->gray); |
| 296 | break; | 309 | break; |
| 297 | } | 310 | } |
