static void markclosure (GCState *st, Closure *cl) { if (!ismarked(cl)) { if (!cl->isC) protomark(cl->f.l); cl->mark = st->cmark; /* chain it for later traversal */ st->cmark = cl; } }
static void protomark (Proto *f) { if (!f->marked) { int i; f->marked = 1; strmark(f->source); for (i=0; i<f->nkstr; i++) strmark(f->kstr[i]); for (i=0; i<f->nkproto; i++) protomark(f->kproto[i]); for (i=0; i<f->nlocvars; i++) /* mark local-variable names */ strmark(f->locvars[i].varname); } }
static int32 markobject (TObject *o) { switch (ttype(o)) { case LUA_T_USERDATA: case LUA_T_STRING: strmark(tsvalue(o)); break; case LUA_T_ARRAY: hashmark(avalue(o)); break; case LUA_T_CLOSURE: case LUA_T_CLMARK: closuremark(o->value.cl); break; case LUA_T_PROTO: case LUA_T_PMARK: protomark(o->value.tf); break; default: break; /* numbers, cprotos, etc */ } return 0; }