** mark an object. Userdata, strings, and closed upvalues are visited ** and turned black here. Other objects are marked gray and added ** to appropriate list to be visited (and turned black) later. (Open ** upvalues are already linked in 'headuv' list.) */
| 241 | ** upvalues are already linked in 'headuv' list.) |
| 242 | */ |
| 243 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 244 | lu_mem size; |
| 245 | white2gray(o); |
| 246 | switch (gch(o)->tt) { |
| 247 | case LUA_TSHRSTR: |
| 248 | case LUA_TLNGSTR: { |
| 249 | size = sizestring(gco2ts(o)); |
| 250 | break; /* nothing else to mark; make it black */ |
| 251 | } |
| 252 | case LUA_TUSERDATA: { |
| 253 | Table *mt = gco2u(o)->metatable; |
| 254 | markobject(g, mt); |
| 255 | markobject(g, gco2u(o)->env); |
| 256 | size = sizeudata(gco2u(o)); |
| 257 | break; |
| 258 | } |
| 259 | case LUA_TUPVAL: { |
| 260 | UpVal *uv = gco2uv(o); |
| 261 | markvalue(g, uv->v); |
| 262 | if (uv->v != &uv->u.value) /* open? */ |
| 263 | return; /* open upvalues remain gray */ |
| 264 | size = sizeof(UpVal); |
| 265 | break; |
| 266 | } |
| 267 | case LUA_TLCL: { |
| 268 | gco2lcl(o)->gclist = g->gray; |
| 269 | g->gray = o; |
| 270 | return; |
| 271 | } |
| 272 | case LUA_TCCL: { |
| 273 | gco2ccl(o)->gclist = g->gray; |
| 274 | g->gray = o; |
| 275 | return; |
| 276 | } |
| 277 | case LUA_TTABLE: { |
| 278 | linktable(gco2t(o), &g->gray); |
| 279 | return; |
| 280 | } |
| 281 | case LUA_TTHREAD: { |
| 282 | gco2th(o)->gclist = g->gray; |
| 283 | g->gray = o; |
| 284 | return; |
| 285 | } |
| 286 | case LUA_TPROTO: { |
| 287 | gco2p(o)->gclist = g->gray; |
| 288 | g->gray = o; |
| 289 | return; |
| 290 | } |
| 291 | default: lua_assert(0); return; |
| 292 | } |
| 293 | gray2black(o); |
| 294 | g->GCmemtrav += size; |
| 295 | } |
| 296 | |
| 297 | |
| 298 | /* |
no outgoing calls
no test coverage detected