33#define GCSinsideatomic (GCSpause + 1)
39#define GCSWEEPCOST ((sizeof(TString) + 4) / 4)
42#define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4))
45#define GCFINALIZECOST GCSWEEPCOST
66#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS))
67#define makewhite(g,x) \
68 (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g)))
70#define white2gray(x) resetbits(x->marked, WHITEBITS)
71#define black2gray(x) resetbit(x->marked, BLACKBIT)
74#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x)))
76#define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n)))
79#define checkconsistency(obj) \
80 lua_longassert(!iscollectable(obj) || righttt(obj))
83#define markvalue(g,o) { checkconsistency(o); \
84 if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }
86#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); }
92#define markobjectN(g,t) { if (t) markobject(g,t); }
107#define gnodelast(h) gnode(h, cast(size_t, sizenode(h)))
113#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o))
315 while ((thread = *p) !=
NULL) {
322 thread->
twups = thread;
366 for (n =
gnode(h, 0); n < limit; n++) {
408 for (n =
gnode(h, 0); n < limit; n++) {
438 for (n =
gnode(h, 0); n < limit; n++) {
452 const char *weakkey, *weakvalue;
456 ((weakkey = strchr(
svalue(mode),
'k')),
457 (weakvalue = strchr(
svalue(mode),
'v')),
458 (weakkey || weakvalue))) {
484 for (i = 0; i < f->
sizek; i++)
488 for (i = 0; i < f->
sizep; i++)
503 for (i = 0; i < cl->nupvalues; i++)
517 for (i = 0; i < cl->nupvalues; i++) {
536 for (; o < th->
top; o++)
573 g->
gray = cl->gclist;
579 g->
gray = cl->gclist;
640 for (; l != f; l =
gco2t(l)->gclist) {
643 for (n =
gnode(h, 0); n < limit; n++) {
659 for (; l != f; l =
gco2t(l)->gclist) {
668 for (n =
gnode(h, 0); n < limit; n++) {
688 for (i = 0; i < cl->nupvalues; i++) {
724#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM)
739 while (*p !=
NULL && count-- > 0) {
741 int marked = curr->marked;
827 if (status !=
LUA_OK && propagateerrors) {
884 while ((curr = *p) !=
NULL) {
890 curr->next = *lastnext;
892 lastnext = &curr->next;
915 for (p = &g->
allgc; *p != o; p = &(*p)->next) { }
941 l_mem threshold, debt;
1030 int nextstate,
GCObject **nextlist) {
1118 if (debt <= 0)
return 0;
int luaD_pcall(lua_State *L, Pfunc func, void *u, ptrdiff_t old_top, ptrdiff_t ef)
void luaD_throw(lua_State *L, int errcode)
void luaF_freeproto(lua_State *L, Proto *f)
#define luaM_freemem(L, b, s)
const char * luaO_pushfstring(lua_State *L, const char *fmt,...)
void luaE_freethread(lua_State *L, lua_State *L1)
void luaS_resize(lua_State *L, int newsize)
void luaH_free(lua_State *L, Table *t)
const TValue * luaT_gettmbyobj(lua_State *L, const TValue *o, TMS event)
#define gfasttm(g, et, e)
void luaD_shrinkstack(lua_State *L)
#define luaM_newobject(L, tag, s)
#define setdeadvalue(obj)
struct Upvaldesc Upvaldesc
#define setgcovalue(L, obj, x)
void luaE_setdebt(global_State *g, l_mem debt)
void luaD_callnoyield(lua_State *L, StkId func, int nResults)
static GCObject ** sweeptolive(lua_State *L, GCObject **p)
void luaC_checkfinalizer(lua_State *L, GCObject *o, Table *mt)
static lu_mem traversethread(global_State *g, lua_State *th)
void luaC_barrierback_(lua_State *L, Table *t)
static int traverseproto(global_State *g, Proto *f)
static void checkSizes(lua_State *L, global_State *g)
static int runafewfinalizers(lua_State *L)
static GCObject ** findlast(GCObject **p)
static int iscleared(global_State *g, const TValue *o)
static void separatetobefnz(global_State *g, int all)
static void traversestrongtable(global_State *g, Table *h)
static void callallpendingfinalizers(lua_State *L)
static void convergeephemerons(global_State *g)
void luaC_upvdeccount(lua_State *L, UpVal *uv)
static void markbeingfnz(global_State *g)
static lu_mem traverseLclosure(global_State *g, LClosure *cl)
#define sweepwholelist(L, p)
static void removeentry(Node *n)
void luaC_barrier_(lua_State *L, GCObject *o, GCObject *v)
void luaC_fix(lua_State *L, GCObject *o)
static void remarkupvals(global_State *g)
static lu_mem traversetable(global_State *g, Table *h)
static GCObject * udata2finalize(global_State *g)
static void clearvalues(global_State *g, GCObject *l, GCObject *f)
static void dothecall(lua_State *L, void *ud)
void luaC_runtilstate(lua_State *L, int statesmask)
static void propagateall(global_State *g)
static void markmt(global_State *g)
static void freeobj(lua_State *L, GCObject *o)
static lu_mem sweepstep(lua_State *L, global_State *g, int nextstate, GCObject **nextlist)
static void reallymarkobject(global_State *g, GCObject *o)
void luaC_step(lua_State *L)
void luaC_upvalbarrier_(lua_State *L, UpVal *uv)
static void setpause(global_State *g)
static lu_mem traverseCclosure(global_State *g, CClosure *cl)
static void GCTM(lua_State *L, int propagateerrors)
void luaC_freeallobjects(lua_State *L)
static GCObject ** sweeplist(lua_State *L, GCObject **p, lu_mem count)
static void restartcollection(global_State *g)
static void clearkeys(global_State *g, GCObject *l, GCObject *f)
static l_mem getdebt(global_State *g)
void luaC_fullgc(lua_State *L, int isemergency)
static void propagatemark(global_State *g)
GCObject * luaC_newobj(lua_State *L, int tt, size_t sz)
static lu_mem singlestep(lua_State *L)
static void traverseweakvalue(global_State *g, Table *h)
static void entersweep(lua_State *L)
static void freeLclosure(lua_State *L, LClosure *cl)
static l_mem atomic(lua_State *L)
#define markobjectN(g, t)
static int traverseephemeron(global_State *g, Table *h)
#define getuservalue(L, u, o)
void luaS_clearcache(global_State *g)
void luaS_remove(lua_State *L, TString *ts)
struct UpVal::@68::@69 open
struct lua_State * mainthread
struct Table * mt[NUM_TAGS]