aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
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 /lstate.c
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.
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c18
1 files changed, 11 insertions, 7 deletions
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;