33 #define GCSinsideatomic (GCSpause + 1) 39 #define GCSWEEPCOST ((sizeof(TString) + 4) / 4) 42 #define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4)) 45 #define GCFINALIZECOST GCSWEEPCOST 52 #define STEPMULADJ 200 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)) 301 for (o = g->
tobefnz; o != NULL; o = o->next)
315 while ((thread = *p) != NULL) {
322 thread->
twups = thread;
324 if (uv->
u.
open.touched) {
326 uv->
u.
open.touched = 0;
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++) {
521 uv->
u.
open.touched = 1;
536 for (; o < th->
top; o++)
573 g->
gray = cl->gclist;
579 g->
gray = cl->gclist;
615 while ((w = next) != NULL) {
616 next =
gco2t(w)->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;
751 return (*p == NULL) ? NULL :
p;
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) {
1058 if (g->
gray == NULL)
1118 if (debt <= 0)
return 0;
unsigned short callstatus
static l_mem getdebt(global_State *g)
struct UpVal::@2::@3 open
void luaE_setdebt(global_State *g, l_mem debt)
void luaE_freethread(lua_State *L, lua_State *L1)
static int iscleared(global_State *g, const TValue *o)
static int traverseephemeron(global_State *g, Table *h)
static void setpause(global_State *g)
static void traverseweakvalue(global_State *g, Table *h)
void luaC_checkfinalizer(lua_State *L, GCObject *o, Table *mt)
#define gfasttm(g, et, e)
static void dothecall(lua_State *L, void *ud)
void luaD_shrinkstack(lua_State *L)
void luaC_step(lua_State *L)
static void markbeingfnz(global_State *g)
#define setgcovalue(L, obj, x)
static lu_mem traversethread(global_State *g, lua_State *th)
static void propagateall(global_State *g)
#define markobjectN(g, t)
void luaS_remove(lua_State *L, TString *ts)
static void clearvalues(global_State *g, GCObject *l, GCObject *f)
static lu_mem singlestep(lua_State *L)
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
void luaC_freeallobjects(lua_State *L)
static void freeLclosure(lua_State *L, LClosure *cl)
static lu_mem traversetable(global_State *g, Table *h)
void luaS_clearcache(global_State *g)
void luaC_upvdeccount(lua_State *L, UpVal *uv)
static void callallpendingfinalizers(lua_State *L)
static lu_mem traverseCclosure(global_State *g, CClosure *cl)
void luaC_runtilstate(lua_State *L, int statesmask)
GCObject * luaC_newobj(lua_State *L, int tt, size_t sz)
static void checkSizes(lua_State *L, global_State *g)
void luaC_barrier_(lua_State *L, GCObject *o, GCObject *v)
void luaC_barrierback_(lua_State *L, Table *t)
static void remarkupvals(global_State *g)
#define luaM_freemem(L, b, s)
static GCObject ** findlast(GCObject **p)
void luaC_upvalbarrier_(lua_State *L, UpVal *uv)
std::size_t size(const std::string &str)
Length in characters of a UTF-8 string.
#define getuservalue(L, u, o)
struct lua_State * mainthread
static void clearkeys(global_State *g, GCObject *l, GCObject *f)
int luaD_pcall(lua_State *L, Pfunc func, void *u, ptrdiff_t old_top, ptrdiff_t ef)
#define luaM_newobject(L, tag, s)
static void restartcollection(global_State *g)
static lu_mem traverseLclosure(global_State *g, LClosure *cl)
static void removeentry(Node *n)
struct Upvaldesc Upvaldesc
static GCObject * udata2finalize(global_State *g)
static void markmt(global_State *g)
static void traversestrongtable(global_State *g, Table *h)
static void propagatemark(global_State *g)
static void convergeephemerons(global_State *g)
struct Table * mt[LUA_NUMTAGS]
static void GCTM(lua_State *L, int propagateerrors)
l_noret luaD_throw(lua_State *L, int errcode)
const TValue * luaT_gettmbyobj(lua_State *L, const TValue *o, TMS event)
static void reallymarkobject(global_State *g, GCObject *o)
static l_mem atomic(lua_State *L)
void luaC_fix(lua_State *L, GCObject *o)
static void entersweep(lua_State *L)
void luaH_free(lua_State *L, Table *t)
static int traverseproto(global_State *g, Proto *f)
const char * luaO_pushfstring(lua_State *L, const char *fmt,...)
void luaD_callnoyield(lua_State *L, StkId func, int nResults)
unsigned long Instruction
static int runafewfinalizers(lua_State *L)
#define sweepwholelist(L, p)
void luaS_resize(lua_State *L, int newsize)
static lu_mem sweepstep(lua_State *L, global_State *g, int nextstate, GCObject **nextlist)
void luaC_fullgc(lua_State *L, int isemergency)
#define setdeadvalue(obj)
void luaF_freeproto(lua_State *L, Proto *f)
static map_location::DIRECTION n
static GCObject ** sweeplist(lua_State *L, GCObject **p, lu_mem count)
static GCObject ** sweeptolive(lua_State *L, GCObject **p)
static void separatetobefnz(global_State *g, int all)
static void freeobj(lua_State *L, GCObject *o)