From 115087344797d0aafb23f4fe5b902fdebd2c3310 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 11 Sep 2013 09:26:14 -0300 Subject: [PATCH] 'luaC_newobj' does not handle special cases; only special case now is threads, which do not use 'luaC_newobj' anymore. --- lfunc.c | 8 ++++---- lgc.c | 19 ++++++------------- lgc.h | 11 +++++------ lstate.c | 18 +++++++++++------- lstring.c | 6 +++--- ltable.c | 4 ++-- 6 files changed, 31 insertions(+), 35 deletions(-) diff --git a/lfunc.c b/lfunc.c index 0db0a87b..3727b6cf 100644 --- a/lfunc.c +++ b/lfunc.c @@ -1,5 +1,5 @@ /* -** $Id: lfunc.c,v 2.36 2013/08/27 18:53:35 roberto Exp roberto $ +** $Id: lfunc.c,v 2.37 2013/08/27 20:04:00 roberto Exp roberto $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ @@ -21,14 +21,14 @@ Closure *luaF_newCclosure (lua_State *L, int n) { - Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n), NULL, 0)->cl; + Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n))->cl; c->c.nupvalues = cast_byte(n); return c; } Closure *luaF_newLclosure (lua_State *L, int n) { - Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), NULL, 0)->cl; + Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n))->cl; c->l.p = NULL; c->l.nupvalues = cast_byte(n); while (n--) c->l.upvals[n] = NULL; @@ -85,7 +85,7 @@ void luaF_close (lua_State *L, StkId level) { Proto *luaF_newproto (lua_State *L) { - Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto), &G(L)->allgc, 0)->p; + Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto))->p; nolocal(obj2gco(f)); /* prototypes are never local */ f->k = NULL; f->sizek = 0; diff --git a/lgc.c b/lgc.c index da1d3fdc..26da16de 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 2.157 2013/08/30 19:14:26 roberto Exp roberto $ +** $Id: lgc.c,v 2.158 2013/09/03 15:37:10 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -200,22 +200,15 @@ void luaC_fix (lua_State *L, GCObject *o) { /* ** create a new collectable object (with given type and size) and link -** it to '*list'. 'offset' tells how many bytes to allocate before the -** object itself (used only by states). +** it to 'localgc' list. */ -GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, - int offset) { +GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { global_State *g = G(L); - char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz)); - GCObject *o = obj2gco(raw + offset); + GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); gch(o)->marked = luaC_white(g); - if (list == NULL) - list = &g->localgc; /* standard list for collectable objects */ - else - l_setbit(gch(o)->marked, LOCALMARK); /* mark object as not in 'localgc' */ gch(o)->tt = tt; - gch(o)->next = *list; - *list = o; + gch(o)->next = g->localgc; + g->localgc = o; return o; } diff --git a/lgc.h b/lgc.h index 7e385136..6912d24a 100644 --- a/lgc.h +++ b/lgc.h @@ -1,5 +1,5 @@ /* -** $Id: lgc.h,v 2.70 2013/08/30 19:14:26 roberto Exp roberto $ +** $Id: lgc.h,v 2.71 2013/09/03 15:37:10 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -79,7 +79,7 @@ #define WHITE1BIT 1 /* object is white (type 1) */ #define BLACKBIT 2 /* object is black */ #define FINALIZEDBIT 3 /* object has been marked for finalization */ -#define LOCALBIT 4 /* object is not local */ +#define NOLOCALBIT 4 /* object is not local */ #define LOCALMARK 5 /* object is 'locally marked' or out of local list */ /* bit 7 is currently used by tests (luaL_checkmemory) */ @@ -90,7 +90,7 @@ #define isblack(x) testbit((x)->gch.marked, BLACKBIT) #define isgray(x) /* neither white nor black */ \ (!testbits((x)->gch.marked, WHITEBITS | bitmask(BLACKBIT))) -#define islocal(x) (!testbit((x)->gch.marked, LOCALBIT)) +#define islocal(x) (!testbit((x)->gch.marked, NOLOCALBIT)) #define tofinalize(x) testbit((x)->gch.marked, FINALIZEDBIT) @@ -101,7 +101,7 @@ #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) -#define nolocal(x) l_setbit((x)->gch.marked, LOCALBIT) +#define nolocal(x) l_setbit((x)->gch.marked, NOLOCALBIT) #define valnolocal(v) { if (iscollectable(v)) nolocal(gcvalue(v)); } #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) @@ -140,8 +140,7 @@ LUAI_FUNC void luaC_step (lua_State *L); LUAI_FUNC void luaC_forcestep (lua_State *L); LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); -LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, - GCObject **list, int offset); +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); LUAI_FUNC void luaC_barrierproto_ (lua_State *L, Proto *p, Closure *c); diff --git a/lstate.c b/lstate.c index 3c79eb6c..414e27d2 100644 --- a/lstate.c +++ b/lstate.c @@ -1,5 +1,5 @@ /* -** $Id: lstate.c,v 2.110 2013/09/03 15:37:10 roberto Exp roberto $ +** $Id: lstate.c,v 2.111 2013/09/05 19:31:49 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -237,16 +237,20 @@ static void close_state (lua_State *L) { LUA_API lua_State *lua_newthread (lua_State *L) { + global_State *g = G(L); lua_State *L1; lua_lock(L); luaC_checkGC(L); - /* create new thread, linked after 'l_registry' */ - L1 = &luaC_newobj(L, LUA_TTHREAD, sizeof(LX), - &hvalue(&G(L)->l_registry)->next, offsetof(LX, l))->th; + /* create new thread */ + L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; + L1->marked = luaC_white(g) | bitmask(LOCALMARK) | bitmask(NOLOCALBIT); + L1->tt = LUA_TTHREAD; + /* link it after 'l_registry' */ + L1->next = hvalue(&g->l_registry)->next; + hvalue(&g->l_registry)->next = obj2gco(L1); setthvalue(L, L->top, L1); api_incr_top(L); - preinit_state(L1, G(L)); - nolocal(obj2gco(L1)); /* threads are never local */ + preinit_state(L1, g); L1->hookmask = L->hookmask; L1->basehookcount = L->basehookcount; L1->hook = L->hook; @@ -279,7 +283,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { L->next = NULL; L->tt = LUA_TTHREAD; g->currentwhite = bitmask(WHITE0BIT); - L->marked = luaC_white(g) | bitmask(LOCALBIT); + L->marked = luaC_white(g) | bitmask(NOLOCALBIT); g->gckind = KGC_NORMAL; preinit_state(L, g); g->frealloc = f; diff --git a/lstring.c b/lstring.c index 4adfbf41..bd40841d 100644 --- a/lstring.c +++ b/lstring.c @@ -1,5 +1,5 @@ /* -** $Id: lstring.c,v 2.33 2013/08/28 18:30:26 roberto Exp roberto $ +** $Id: lstring.c,v 2.34 2013/09/05 19:31:49 roberto Exp roberto $ ** String table (keeps all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -101,7 +101,7 @@ static TString *createstrobj (lua_State *L, const char *str, size_t l, TString *ts; size_t totalsize; /* total size of TString object */ totalsize = sizeof(TString) + ((l + 1) * sizeof(char)); - ts = &luaC_newobj(L, tag, totalsize, NULL, 0)->ts; + ts = &luaC_newobj(L, tag, totalsize)->ts; ts->tsv.len = l; ts->tsv.hash = h; ts->tsv.extra = 0; @@ -178,7 +178,7 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { Udata *u; if (s > MAX_SIZE - sizeof(Udata)) luaM_toobig(L); - u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s, NULL, 0)->u; + u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s)->u; u->uv.len = s; u->uv.metatable = NULL; u->uv.env = e; diff --git a/ltable.c b/ltable.c index a582feaa..493782db 100644 --- a/ltable.c +++ b/ltable.c @@ -1,5 +1,5 @@ /* -** $Id: ltable.c,v 2.81 2013/08/28 18:30:26 roberto Exp roberto $ +** $Id: ltable.c,v 2.82 2013/08/29 13:49:57 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -378,7 +378,7 @@ static void rehash (lua_State *L, Table *t, const TValue *ek) { Table *luaH_new (lua_State *L) { - Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table), NULL, 0)->h; + Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table))->h; t->metatable = NULL; t->flags = cast_byte(~0); t->array = NULL;