diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2012-01-20 20:05:50 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2012-01-20 20:05:50 -0200 |
commit | fd22ccd6d020bca1039626ee0c7de42b237a5686 (patch) | |
tree | c9f756634bec409b4ccb3f1a8e21357f409a7ddd /lgc.c | |
parent | 76eab106df01013de80033ac07586a79879fca55 (diff) | |
download | lua-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.c | 64 |
1 files changed, 41 insertions, 23 deletions
@@ -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) { | |||
217 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, | 217 | GCObject *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 | ||
473 | static int traverseclosure (global_State *g, Closure *cl) { | 479 | static 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; | 486 | static 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) { | |||
640 | static void freeobj (lua_State *L, GCObject *o) { | 651 | static 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; |