** 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.) */
| 233 | ** upvalues are already linked in 'headuv' list.) |
| 234 | */ |
| 235 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 236 | reentry: |
| 237 | white2gray(o); |
| 238 | switch (o->tt) { |
| 239 | case LUA_TSHRSTR: { |
| 240 | gray2black(o); |
| 241 | g->GCmemtrav += sizelstring(gco2ts(o)->shrlen); |
| 242 | break; |
| 243 | } |
| 244 | case LUA_TLNGSTR: { |
| 245 | gray2black(o); |
| 246 | g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen); |
| 247 | break; |
| 248 | } |
| 249 | case LUA_TUSERDATA: { |
| 250 | TValue uvalue; |
| 251 | markobjectN(g, gco2u(o)->metatable); /* mark its metatable */ |
| 252 | gray2black(o); |
| 253 | g->GCmemtrav += sizeudata(gco2u(o)); |
| 254 | getuservalue(g->mainthread, gco2u(o), &uvalue); |
| 255 | if (valiswhite(&uvalue)) { /* markvalue(g, &uvalue); */ |
| 256 | o = gcvalue(&uvalue); |
| 257 | goto reentry; |
| 258 | } |
| 259 | break; |
| 260 | } |
| 261 | case LUA_TLCL: { |
| 262 | linkgclist(gco2lcl(o), g->gray); |
| 263 | break; |
| 264 | } |
| 265 | case LUA_TCCL: { |
| 266 | linkgclist(gco2ccl(o), g->gray); |
| 267 | break; |
| 268 | } |
| 269 | case LUA_TTABLE: { |
| 270 | linkgclist(gco2t(o), g->gray); |
| 271 | break; |
| 272 | } |
| 273 | case LUA_TTHREAD: { |
| 274 | linkgclist(gco2th(o), g->gray); |
| 275 | break; |
| 276 | } |
| 277 | case LUA_TPROTO: { |
| 278 | linkgclist(gco2p(o), g->gray); |
| 279 | break; |
| 280 | } |
| 281 | default: lua_assert(0); break; |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | |
| 286 | /* |
no outgoing calls
no test coverage detected