diff --git a/3rd/lua/lgc.c b/3rd/lua/lgc.c index e7e1bbe6..e90766dc 100644 --- a/3rd/lua/lgc.c +++ b/3rd/lua/lgc.c @@ -80,9 +80,9 @@ (x->marked = cast_byte((x->marked & ~WHITEBITS) | bitmask(BLACKBIT))) -#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) +#define valiswhite(x) (iscollectable(x) && ispurewhite(gcvalue(x))) -#define keyiswhite(n) (keyiscollectable(n) && iswhite(gckey(n))) +#define keyiswhite(n) (keyiscollectable(n) && ispurewhite(gckey(n))) /* @@ -96,7 +96,7 @@ #define markkey(g, n) { if keyiswhite(n) reallymarkobject(g,gckey(n)); } -#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); } +#define markobject(g,t) { if (ispurewhite(t)) reallymarkobject(g, obj2gco(t)); } /* ** mark an object that can be NULL (either because it is really optional, @@ -188,7 +188,7 @@ static int iscleared (global_State *g, const GCObject *o) { markobject(g, o); /* strings are 'values', so are never weak */ return 0; } - else return iswhite(o); + else return ispurewhite(o); } @@ -289,8 +289,6 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { ** (only closures can), and a userdata's metatable must be a table. */ static void reallymarkobject (global_State *g, GCObject *o) { - if (isshared(o)) - return; switch (o->tt) { case LUA_VSHRSTR: case LUA_VLNGSTR: { diff --git a/3rd/lua/lgc.h b/3rd/lua/lgc.h index eb00bcf8..62a44e1a 100644 --- a/3rd/lua/lgc.h +++ b/3rd/lua/lgc.h @@ -120,6 +120,7 @@ #define isshared(x) (getage(x) == G_SHARED) #define makeshared(x) setage(x, G_SHARED) +#define ispurewhite(x) (iswhite(x) && !isshared(x)) #define changeage(o,f,t) \ check_exp(getage(o) == (f), (o)->marked ^= ((f)^(t))) @@ -167,15 +168,15 @@ #define luaC_barrier(L,p,v) ( \ - (iscollectable(v) && isblack(p) && iswhite(gcvalue(v)) && !isshared(gcvalue(v))) ? \ + (iscollectable(v) && isblack(p) && ispurewhite(gcvalue(v))) ? \ luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0)) #define luaC_barrierback(L,p,v) ( \ - (iscollectable(v) && isblack(p) && iswhite(gcvalue(v)) && !isshared(gcvalue(v))) ? \ + (iscollectable(v) && isblack(p) && ispurewhite(gcvalue(v))) ? \ luaC_barrierback_(L,p) : cast_void(0)) #define luaC_objbarrier(L,p,o) ( \ - (isblack(p) && iswhite(o) && !isshared(o)) ? \ + (isblack(p) && ispurewhite(o)) ? \ luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0)) LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);