| 67 | |
| 68 | |
| 69 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 70 | lua_assert(iswhite(o) && !isdead(g, o)); |
| 71 | white2gray(o); |
| 72 | switch (o->gch.tt) { |
| 73 | case LUA_TSTRING: { |
| 74 | return; |
| 75 | } |
| 76 | case LUA_TUSERDATA: { |
| 77 | Table *mt = gco2u(o)->metatable; |
| 78 | gray2black(o); /* udata are never gray */ |
| 79 | if (mt) markobject(g, mt); |
| 80 | markobject(g, gco2u(o)->env); |
| 81 | return; |
| 82 | } |
| 83 | case LUA_TUPVAL: { |
| 84 | UpVal *uv = gco2uv(o); |
| 85 | markvalue(g, uv->v); |
| 86 | if (uv->v == &uv->u.value) /* closed? */ |
| 87 | gray2black(o); /* open upvalues are never black */ |
| 88 | return; |
| 89 | } |
| 90 | case LUA_TFUNCTION: { |
| 91 | gco2cl(o)->c.gclist = g->gray; |
| 92 | g->gray = o; |
| 93 | break; |
| 94 | } |
| 95 | case LUA_TTABLE: { |
| 96 | gco2h(o)->gclist = g->gray; |
| 97 | g->gray = o; |
| 98 | break; |
| 99 | } |
| 100 | case LUA_TTHREAD: { |
| 101 | gco2th(o)->gclist = g->gray; |
| 102 | g->gray = o; |
| 103 | break; |
| 104 | } |
| 105 | case LUA_TPROTO: { |
| 106 | gco2p(o)->gclist = g->gray; |
| 107 | g->gray = o; |
| 108 | break; |
| 109 | } |
| 110 | default: lua_assert(0); |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | |
| 115 | static void marktmu (global_State *g) { |
no outgoing calls
no test coverage detected