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 void protomark(TProtoFunc *f) { if (!f->head.marked) { LocVar *v = f->locvars; int32 i; f->head.marked = 1; if (f->fileName) strmark(f->fileName); for (i = 0; i < f->nconsts; i++) markobject(&f->consts[i]); if (v) { for (; v->line != -1; v++) { if (v->varname) strmark(v->varname); } } } }
static void globalmark() { TaggedString *g; for (g = (TaggedString *)rootglobal.next; g; g = (TaggedString *)g->head.next){ if (g->globalval.ttype != LUA_T_NIL) { markobject(&g->globalval); strmark(g); // cannot collect non nil global variables } } }
static void globalmark (void) { TaggedString *g; for (g=(TaggedString *)L->rootglobal.next; g; g=(TaggedString *)g->head.next){ LUA_ASSERT(g->constindex >= 0, "userdata in global list"); if (g->u.s.globalval.ttype != LUA_T_NIL) { markobject(&g->u.s.globalval); strmark(g); /* cannot collect non nil global variables */ } } }
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; }
static void markobject (GCState *st, TObject *o) { switch (ttype(o)) { case LUA_TUSERDATA: case LUA_TSTRING: strmark(tsvalue(o)); break; case LUA_TMARK: markclosure(st, infovalue(o)->func); break; case LUA_TFUNCTION: markclosure(st, clvalue(o)); break; case LUA_TTABLE: { if (!ismarked(hvalue(o))) { hvalue(o)->mark = st->tmark; /* chain it in list of marked */ st->tmark = hvalue(o); } break; } default: break; /* numbers, etc */ } }