31#define GCSWEEPCOST ((sizeof(TString) + 4) / 4)
34#define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4))
37#define GCFINALIZENUM 4
58#define maskcolors (~(bit2mask(BLACKBIT, OLDBIT) | WHITEBITS))
59#define makewhite(g,x) \
60 (gch(x)->marked = cast_byte((gch(x)->marked & maskcolors) | luaC_white(g)))
62#define white2gray(x) resetbits(gch(x)->marked, WHITEBITS)
63#define black2gray(x) resetbit(gch(x)->marked, BLACKBIT)
66#define isfinalized(x) testbit(gch(x)->marked, FINALIZEDBIT)
68#define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n)))
71#define checkconsistency(obj) \
72 lua_longassert(!iscollectable(obj) || righttt(obj))
75#define markvalue(g,o) { checkconsistency(o); \
76 if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }
78#define markobject(g,t) { if ((t) && iswhite(obj2gco(t))) \
79 reallymarkobject(g, obj2gco(t)); }
94#define gnodelast(h) gnode(h, cast(size_t, sizenode(h)))
100#define linktable(h,p) ((h)->gclist = *(p), *(p) = obj2gco(h))
221 gch(o)->next = *list;
246 switch (
gch(o)->tt) {
264 size =
sizeof(
UpVal);
360 for (n =
gnode(h, 0); n < limit; n++) {
392 for (n =
gnode(h, 0); n < limit; n++) {
421 for (n =
gnode(h, 0); n < limit; n++) {
435 const char *weakkey, *weakvalue;
439 ((weakkey = strchr(
svalue(mode),
'k')),
440 (weakvalue = strchr(
svalue(mode),
'v')),
441 (weakkey || weakvalue))) {
462 for (i = 0; i < f->
sizek; i++)
466 for (i = 0; i < f->
sizep; i++)
481 for (i = 0; i < cl->nupvalues; i++)
489 for (i = 0; i < cl->nupvalues; i++)
500 for (; o < th->
top; o++)
526 switch (
gch(o)->tt) {
535 g->
gray = cl->gclist;
541 g->
gray = cl->gclist;
626 for (; l != f; l =
gco2t(l)->gclist) {
629 for (n =
gnode(h, 0); n < limit; n++) {
644 for (; l != f; l =
gco2t(l)->gclist) {
653 for (n =
gnode(h, 0); n < limit; n++) {
664 switch (
gch(o)->tt) {
690#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM)
734 while (*p !=
NULL && count-- > 0) {
736 int marked =
gch(curr)->marked;
738 *p =
gch(curr)->next;
747 gch(curr)->marked =
cast_byte((marked & toclear) | toset);
748 p = &
gch(curr)->next;
827 if (status !=
LUA_OK && propagateerrors) {
851 while (*lastnext !=
NULL)
852 lastnext = &
gch(*lastnext)->next;
853 while ((curr = *p) !=
NULL) {
857 p = &
gch(curr)->next;
860 *p =
gch(curr)->next;
861 gch(curr)->next = *lastnext;
863 lastnext = &
gch(curr)->next;
887 for (p = &g->
allgc; *p != o; p = &
gch(*p)->next) { }
914 l_mem debt, threshold;
925 (bitmask(GCSsweepstring) | bitmask(GCSsweepudata) | bitmask(GCSsweep))
954 if (mode == g->
gckind)
return;
978 GCTM(L, propagateerrors);
1143 if (stepmul < 40) stepmul = 40;
1191 int origkind = g->
gckind;
int luaD_pcall(lua_State *L, Pfunc func, void *u, ptrdiff_t old_top, ptrdiff_t ef)
void luaD_call(lua_State *L, StkId func, int nResults)
void luaD_throw(lua_State *L, int errcode)
void luaF_freeproto(lua_State *L, Proto *f)
void luaF_freeupval(lua_State *L, UpVal *uv)
#define luaC_objbarrier(L, p, o)
#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)
struct lua_State lua_State
#define luaZ_freebuffer(L, buff)
void luaD_shrinkstack(lua_State *L)
void luaC_checkfinalizer(lua_State *L, GCObject *o, Table *mt)
static int traverseproto(global_State *g, Proto *f)
static int iscleared(global_State *g, const TValue *o)
GCObject * luaC_newobj(lua_State *L, int tt, size_t sz, GCObject **list, int offset)
static int entersweep(lua_State *L)
static void traversestrongtable(global_State *g, Table *h)
static void convergeephemerons(global_State *g)
void luaC_forcestep(lua_State *L)
static void markbeingfnz(global_State *g)
static lu_mem traverseLclosure(global_State *g, LClosure *cl)
#define sweepwholelist(L, p)
void luaC_barrierback_(lua_State *L, GCObject *o)
static void removeentry(Node *n)
void luaC_barrier_(lua_State *L, GCObject *o, GCObject *v)
static void callallpendingfinalizers(lua_State *L, int propagateerrors)
static void incstep(lua_State *L)
static void setpause(global_State *g, l_mem estimate)
static void remarkupvals(global_State *g)
static lu_mem traversetable(global_State *g, Table *h)
void luaC_checkupvalcolor(global_State *g, UpVal *uv)
static void generationalcollection(lua_State *L)
static GCObject * udata2finalize(global_State *g)
static void clearvalues(global_State *g, GCObject *l, GCObject *f)
static void dothecall(lua_State *L, void *ud)
static void sweepthread(lua_State *L, lua_State *L1)
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)
void luaC_changemode(lua_State *L, int mode)
static void retraversegrays(global_State *g)
static void checkSizes(lua_State *L)
static void reallymarkobject(global_State *g, GCObject *o)
void luaC_step(lua_State *L)
static void propagatelist(global_State *g, GCObject *l)
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)
void luaC_fullgc(lua_State *L, int isemergency)
static GCObject ** sweeptolive(lua_State *L, GCObject **p, int *n)
static void propagatemark(global_State *g)
static lu_mem traversestack(global_State *g, lua_State *th)
static void separatetobefnz(lua_State *L, int all)
LUAI_FUNC void luaC_barrierproto_(lua_State *L, Proto *p, Closure *c)
static lu_mem singlestep(lua_State *L)
static void traverseweakvalue(global_State *g, Table *h)
static l_mem atomic(lua_State *L)
static int traverseephemeron(global_State *g, Table *h)
#define isgenerational(g)
#define keepinvariantout(g)
#define luaM_newobject(L, tag, s)
#define setdeadvalue(obj)
struct Upvaldesc Upvaldesc
#define setgcovalue(L, obj, x)
void luaE_freeCI(lua_State *L)
void luaE_setdebt(global_State *g, l_mem debt)
struct lua_State * mainthread
struct Table * mt[NUM_TAGS]