summaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2012-01-20 20:05:50 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2012-01-20 20:05:50 -0200
commitfd22ccd6d020bca1039626ee0c7de42b237a5686 (patch)
treec9f756634bec409b4ccb3f1a8e21357f409a7ddd /lgc.c
parent76eab106df01013de80033ac07586a79879fca55 (diff)
downloadlua-fd22ccd6d020bca1039626ee0c7de42b237a5686.tar.gz
lua-fd22ccd6d020bca1039626ee0c7de42b237a5686.tar.bz2
lua-fd22ccd6d020bca1039626ee0c7de42b237a5686.zip
object tag keeps variant bits too -> no need for 'isC' field in
Closures + more strick typing for closure variants
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c64
1 files changed, 41 insertions, 23 deletions
diff --git a/lgc.c b/lgc.c
index 348d3598..18b063c5 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.115 2011/11/28 17:25:48 roberto Exp roberto $ 2** $Id: lgc.c,v 2.116 2011/12/02 13:18:41 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*/
@@ -217,7 +217,8 @@ void luaC_checkupvalcolor (global_State *g, UpVal *uv) {
217GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, 217GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list,
218 int offset) { 218 int offset) {
219 global_State *g = G(L); 219 global_State *g = G(L);
220 GCObject *o = obj2gco(cast(char *, luaM_newobject(L, tt, sz)) + offset); 220 char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz));
221 GCObject *o = obj2gco(raw + offset);
221 if (list == NULL) 222 if (list == NULL)
222 list = &g->allgc; /* standard list for collectable objects */ 223 list = &g->allgc; /* standard list for collectable objects */
223 gch(o)->marked = luaC_white(g); 224 gch(o)->marked = luaC_white(g);
@@ -266,8 +267,13 @@ static void reallymarkobject (global_State *g, GCObject *o) {
266 gray2black(o); /* make it black */ 267 gray2black(o); /* make it black */
267 return; 268 return;
268 } 269 }
269 case LUA_TFUNCTION: { 270 case LUA_TLCL: {
270 gco2cl(o)->c.gclist = g->gray; 271 gco2lcl(o)->gclist = g->gray;
272 g->gray = o;
273 break;
274 }
275 case LUA_TCCL: {
276 gco2ccl(o)->gclist = g->gray;
271 g->gray = o; 277 g->gray = o;
272 break; 278 break;
273 } 279 }
@@ -470,20 +476,20 @@ static int traverseproto (global_State *g, Proto *f) {
470} 476}
471 477
472 478
473static int traverseclosure (global_State *g, Closure *cl) { 479static int traverseCclosure (global_State *g, CClosure *cl) {
474 if (cl->c.isC) { 480 int i;
475 int i; 481 for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */
476 for (i=0; i<cl->c.nupvalues; i++) /* mark its upvalues */ 482 markvalue(g, &cl->upvalue[i]);
477 markvalue(g, &cl->c.upvalue[i]); 483 return TRAVCOST + cl->nupvalues;
478 } 484}
479 else { 485
480 int i; 486static int traverseLclosure (global_State *g, LClosure *cl) {
481 lua_assert(cl->l.nupvalues == cl->l.p->sizeupvalues); 487 int i;
482 markobject(g, cl->l.p); /* mark its prototype */ 488 assert(cl->nupvalues == cl->p->sizeupvalues);
483 for (i=0; i<cl->l.nupvalues; i++) /* mark its upvalues */ 489 markobject(g, cl->p); /* mark its prototype */
484 markobject(g, cl->l.upvals[i]); 490 for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */
485 } 491 markobject(g, cl->upvals[i]);
486 return TRAVCOST + cl->c.nupvalues; 492 return TRAVCOST + cl->nupvalues;
487} 493}
488 494
489 495
@@ -517,10 +523,15 @@ static int propagatemark (global_State *g) {
517 g->gray = h->gclist; 523 g->gray = h->gclist;
518 return traversetable(g, h); 524 return traversetable(g, h);
519 } 525 }
520 case LUA_TFUNCTION: { 526 case LUA_TLCL: {
521 Closure *cl = gco2cl(o); 527 LClosure *cl = gco2lcl(o);
522 g->gray = cl->c.gclist; 528 g->gray = cl->gclist;
523 return traverseclosure(g, cl); 529 return traverseLclosure(g, cl);
530 }
531 case LUA_TCCL: {
532 CClosure *cl = gco2ccl(o);
533 g->gray = cl->gclist;
534 return traverseCclosure(g, cl);
524 } 535 }
525 case LUA_TTHREAD: { 536 case LUA_TTHREAD: {
526 lua_State *th = gco2th(o); 537 lua_State *th = gco2th(o);
@@ -640,7 +651,14 @@ static void clearvalues (GCObject *l, GCObject *f) {
640static void freeobj (lua_State *L, GCObject *o) { 651static void freeobj (lua_State *L, GCObject *o) {
641 switch (gch(o)->tt) { 652 switch (gch(o)->tt) {
642 case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; 653 case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
643 case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; 654 case LUA_TLCL: {
655 luaM_freemem(L, o, sizeLclosure(gco2lcl(o)->nupvalues));
656 break;
657 }
658 case LUA_TCCL: {
659 luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues));
660 break;
661 }
644 case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; 662 case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break;
645 case LUA_TTABLE: luaH_free(L, gco2t(o)); break; 663 case LUA_TTABLE: luaH_free(L, gco2t(o)); break;
646 case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; 664 case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break;