aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 09:26:14 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 09:26:14 -0300
commit115087344797d0aafb23f4fe5b902fdebd2c3310 (patch)
tree732c83cee53b9d67b83cebfc2e5debd30d48eeed
parent79ab21be90792c00da98e5ec3d55c8a082c6e6de (diff)
downloadlua-115087344797d0aafb23f4fe5b902fdebd2c3310.tar.gz
lua-115087344797d0aafb23f4fe5b902fdebd2c3310.tar.bz2
lua-115087344797d0aafb23f4fe5b902fdebd2c3310.zip
'luaC_newobj' does not handle special cases; only special case
now is threads, which do not use 'luaC_newobj' anymore.
-rw-r--r--lfunc.c8
-rw-r--r--lgc.c19
-rw-r--r--lgc.h11
-rw-r--r--lstate.c18
-rw-r--r--lstring.c6
-rw-r--r--ltable.c4
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 @@
1/* 1/*
2** $Id: lfunc.c,v 2.36 2013/08/27 18:53:35 roberto Exp roberto $ 2** $Id: lfunc.c,v 2.37 2013/08/27 20:04:00 roberto Exp roberto $
3** Auxiliary functions to manipulate prototypes and closures 3** Auxiliary functions to manipulate prototypes and closures
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -21,14 +21,14 @@
21 21
22 22
23Closure *luaF_newCclosure (lua_State *L, int n) { 23Closure *luaF_newCclosure (lua_State *L, int n) {
24 Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n), NULL, 0)->cl; 24 Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n))->cl;
25 c->c.nupvalues = cast_byte(n); 25 c->c.nupvalues = cast_byte(n);
26 return c; 26 return c;
27} 27}
28 28
29 29
30Closure *luaF_newLclosure (lua_State *L, int n) { 30Closure *luaF_newLclosure (lua_State *L, int n) {
31 Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), NULL, 0)->cl; 31 Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n))->cl;
32 c->l.p = NULL; 32 c->l.p = NULL;
33 c->l.nupvalues = cast_byte(n); 33 c->l.nupvalues = cast_byte(n);
34 while (n--) c->l.upvals[n] = NULL; 34 while (n--) c->l.upvals[n] = NULL;
@@ -85,7 +85,7 @@ void luaF_close (lua_State *L, StkId level) {
85 85
86 86
87Proto *luaF_newproto (lua_State *L) { 87Proto *luaF_newproto (lua_State *L) {
88 Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto), &G(L)->allgc, 0)->p; 88 Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto))->p;
89 nolocal(obj2gco(f)); /* prototypes are never local */ 89 nolocal(obj2gco(f)); /* prototypes are never local */
90 f->k = NULL; 90 f->k = NULL;
91 f->sizek = 0; 91 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 @@
1/* 1/*
2** $Id: lgc.c,v 2.157 2013/08/30 19:14:26 roberto Exp roberto $ 2** $Id: lgc.c,v 2.158 2013/09/03 15:37:10 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -200,22 +200,15 @@ void luaC_fix (lua_State *L, GCObject *o) {
200 200
201/* 201/*
202** create a new collectable object (with given type and size) and link 202** create a new collectable object (with given type and size) and link
203** it to '*list'. 'offset' tells how many bytes to allocate before the 203** it to 'localgc' list.
204** object itself (used only by states).
205*/ 204*/
206GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, 205GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
207 int offset) {
208 global_State *g = G(L); 206 global_State *g = G(L);
209 char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz)); 207 GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
210 GCObject *o = obj2gco(raw + offset);
211 gch(o)->marked = luaC_white(g); 208 gch(o)->marked = luaC_white(g);
212 if (list == NULL)
213 list = &g->localgc; /* standard list for collectable objects */
214 else
215 l_setbit(gch(o)->marked, LOCALMARK); /* mark object as not in 'localgc' */
216 gch(o)->tt = tt; 209 gch(o)->tt = tt;
217 gch(o)->next = *list; 210 gch(o)->next = g->localgc;
218 *list = o; 211 g->localgc = o;
219 return o; 212 return o;
220} 213}
221 214
diff --git a/lgc.h b/lgc.h
index 7e385136..6912d24a 100644
--- a/lgc.h
+++ b/lgc.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.h,v 2.70 2013/08/30 19:14:26 roberto Exp roberto $ 2** $Id: lgc.h,v 2.71 2013/09/03 15:37:10 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -79,7 +79,7 @@
79#define WHITE1BIT 1 /* object is white (type 1) */ 79#define WHITE1BIT 1 /* object is white (type 1) */
80#define BLACKBIT 2 /* object is black */ 80#define BLACKBIT 2 /* object is black */
81#define FINALIZEDBIT 3 /* object has been marked for finalization */ 81#define FINALIZEDBIT 3 /* object has been marked for finalization */
82#define LOCALBIT 4 /* object is not local */ 82#define NOLOCALBIT 4 /* object is not local */
83#define LOCALMARK 5 /* object is 'locally marked' or out of local list */ 83#define LOCALMARK 5 /* object is 'locally marked' or out of local list */
84/* bit 7 is currently used by tests (luaL_checkmemory) */ 84/* bit 7 is currently used by tests (luaL_checkmemory) */
85 85
@@ -90,7 +90,7 @@
90#define isblack(x) testbit((x)->gch.marked, BLACKBIT) 90#define isblack(x) testbit((x)->gch.marked, BLACKBIT)
91#define isgray(x) /* neither white nor black */ \ 91#define isgray(x) /* neither white nor black */ \
92 (!testbits((x)->gch.marked, WHITEBITS | bitmask(BLACKBIT))) 92 (!testbits((x)->gch.marked, WHITEBITS | bitmask(BLACKBIT)))
93#define islocal(x) (!testbit((x)->gch.marked, LOCALBIT)) 93#define islocal(x) (!testbit((x)->gch.marked, NOLOCALBIT))
94 94
95#define tofinalize(x) testbit((x)->gch.marked, FINALIZEDBIT) 95#define tofinalize(x) testbit((x)->gch.marked, FINALIZEDBIT)
96 96
@@ -101,7 +101,7 @@
101#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) 101#define changewhite(x) ((x)->gch.marked ^= WHITEBITS)
102#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) 102#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT)
103 103
104#define nolocal(x) l_setbit((x)->gch.marked, LOCALBIT) 104#define nolocal(x) l_setbit((x)->gch.marked, NOLOCALBIT)
105#define valnolocal(v) { if (iscollectable(v)) nolocal(gcvalue(v)); } 105#define valnolocal(v) { if (iscollectable(v)) nolocal(gcvalue(v)); }
106 106
107#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) 107#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS)
@@ -140,8 +140,7 @@ LUAI_FUNC void luaC_step (lua_State *L);
140LUAI_FUNC void luaC_forcestep (lua_State *L); 140LUAI_FUNC void luaC_forcestep (lua_State *L);
141LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); 141LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
142LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); 142LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
143LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, 143LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);
144 GCObject **list, int offset);
145LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); 144LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
146LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); 145LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o);
147LUAI_FUNC void luaC_barrierproto_ (lua_State *L, Proto *p, Closure *c); 146LUAI_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 @@
1/* 1/*
2** $Id: lstate.c,v 2.110 2013/09/03 15:37:10 roberto Exp roberto $ 2** $Id: lstate.c,v 2.111 2013/09/05 19:31:49 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -237,16 +237,20 @@ static void close_state (lua_State *L) {
237 237
238 238
239LUA_API lua_State *lua_newthread (lua_State *L) { 239LUA_API lua_State *lua_newthread (lua_State *L) {
240 global_State *g = G(L);
240 lua_State *L1; 241 lua_State *L1;
241 lua_lock(L); 242 lua_lock(L);
242 luaC_checkGC(L); 243 luaC_checkGC(L);
243 /* create new thread, linked after 'l_registry' */ 244 /* create new thread */
244 L1 = &luaC_newobj(L, LUA_TTHREAD, sizeof(LX), 245 L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
245 &hvalue(&G(L)->l_registry)->next, offsetof(LX, l))->th; 246 L1->marked = luaC_white(g) | bitmask(LOCALMARK) | bitmask(NOLOCALBIT);
247 L1->tt = LUA_TTHREAD;
248 /* link it after 'l_registry' */
249 L1->next = hvalue(&g->l_registry)->next;
250 hvalue(&g->l_registry)->next = obj2gco(L1);
246 setthvalue(L, L->top, L1); 251 setthvalue(L, L->top, L1);
247 api_incr_top(L); 252 api_incr_top(L);
248 preinit_state(L1, G(L)); 253 preinit_state(L1, g);
249 nolocal(obj2gco(L1)); /* threads are never local */
250 L1->hookmask = L->hookmask; 254 L1->hookmask = L->hookmask;
251 L1->basehookcount = L->basehookcount; 255 L1->basehookcount = L->basehookcount;
252 L1->hook = L->hook; 256 L1->hook = L->hook;
@@ -279,7 +283,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
279 L->next = NULL; 283 L->next = NULL;
280 L->tt = LUA_TTHREAD; 284 L->tt = LUA_TTHREAD;
281 g->currentwhite = bitmask(WHITE0BIT); 285 g->currentwhite = bitmask(WHITE0BIT);
282 L->marked = luaC_white(g) | bitmask(LOCALBIT); 286 L->marked = luaC_white(g) | bitmask(NOLOCALBIT);
283 g->gckind = KGC_NORMAL; 287 g->gckind = KGC_NORMAL;
284 preinit_state(L, g); 288 preinit_state(L, g);
285 g->frealloc = f; 289 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 @@
1/* 1/*
2** $Id: lstring.c,v 2.33 2013/08/28 18:30:26 roberto Exp roberto $ 2** $Id: lstring.c,v 2.34 2013/09/05 19:31:49 roberto Exp roberto $
3** String table (keeps all strings handled by Lua) 3** String table (keeps all strings handled by Lua)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -101,7 +101,7 @@ static TString *createstrobj (lua_State *L, const char *str, size_t l,
101 TString *ts; 101 TString *ts;
102 size_t totalsize; /* total size of TString object */ 102 size_t totalsize; /* total size of TString object */
103 totalsize = sizeof(TString) + ((l + 1) * sizeof(char)); 103 totalsize = sizeof(TString) + ((l + 1) * sizeof(char));
104 ts = &luaC_newobj(L, tag, totalsize, NULL, 0)->ts; 104 ts = &luaC_newobj(L, tag, totalsize)->ts;
105 ts->tsv.len = l; 105 ts->tsv.len = l;
106 ts->tsv.hash = h; 106 ts->tsv.hash = h;
107 ts->tsv.extra = 0; 107 ts->tsv.extra = 0;
@@ -178,7 +178,7 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
178 Udata *u; 178 Udata *u;
179 if (s > MAX_SIZE - sizeof(Udata)) 179 if (s > MAX_SIZE - sizeof(Udata))
180 luaM_toobig(L); 180 luaM_toobig(L);
181 u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s, NULL, 0)->u; 181 u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s)->u;
182 u->uv.len = s; 182 u->uv.len = s;
183 u->uv.metatable = NULL; 183 u->uv.metatable = NULL;
184 u->uv.env = e; 184 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 @@
1/* 1/*
2** $Id: ltable.c,v 2.81 2013/08/28 18:30:26 roberto Exp roberto $ 2** $Id: ltable.c,v 2.82 2013/08/29 13:49:57 roberto Exp roberto $
3** Lua tables (hash) 3** Lua tables (hash)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -378,7 +378,7 @@ static void rehash (lua_State *L, Table *t, const TValue *ek) {
378 378
379 379
380Table *luaH_new (lua_State *L) { 380Table *luaH_new (lua_State *L) {
381 Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table), NULL, 0)->h; 381 Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table))->h;
382 t->metatable = NULL; 382 t->metatable = NULL;
383 t->flags = cast_byte(~0); 383 t->flags = cast_byte(~0);
384 t->array = NULL; 384 t->array = NULL;