diff options
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id$ | 2 | ** $Id: lgc.c $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -212,7 +212,7 @@ void luaC_barrierback_ (lua_State *L, GCObject *o) { | |||
212 | lua_assert(g->gckind != KGC_GEN || (isold(o) && getage(o) != G_TOUCHED1)); | 212 | lua_assert(g->gckind != KGC_GEN || (isold(o) && getage(o) != G_TOUCHED1)); |
213 | if (getage(o) != G_TOUCHED2) /* not already in gray list? */ | 213 | if (getage(o) != G_TOUCHED2) /* not already in gray list? */ |
214 | linkobjgclist(o, g->grayagain); /* link it in 'grayagain' */ | 214 | linkobjgclist(o, g->grayagain); /* link it in 'grayagain' */ |
215 | black2gray(o); /* make table gray (again) */ | 215 | black2gray(o); /* make object gray (again) */ |
216 | setage(o, G_TOUCHED1); /* touched in current cycle */ | 216 | setage(o, G_TOUCHED1); /* touched in current cycle */ |
217 | } | 217 | } |
218 | 218 | ||
@@ -515,6 +515,19 @@ static lu_mem traversetable (global_State *g, Table *h) { | |||
515 | } | 515 | } |
516 | 516 | ||
517 | 517 | ||
518 | static int traverseudata (global_State *g, Udata *u) { | ||
519 | int i; | ||
520 | markobjectN(g, u->metatable); /* mark its metatable */ | ||
521 | for (i = 0; i < u->nuvalue; i++) | ||
522 | markvalue(g, &u->uv[i].uv); | ||
523 | if (g->gckind == KGC_GEN) { | ||
524 | linkgclist(u, g->grayagain); /* keep it in some gray list */ | ||
525 | black2gray(u); | ||
526 | } | ||
527 | return 1 + u->nuvalue; | ||
528 | } | ||
529 | |||
530 | |||
518 | /* | 531 | /* |
519 | ** Check the cache of a prototype, to keep invariants. If the | 532 | ** Check the cache of a prototype, to keep invariants. If the |
520 | ** cache is white, clear it. (A cache should not prevent the | 533 | ** cache is white, clear it. (A cache should not prevent the |
@@ -613,15 +626,6 @@ static int traversethread (global_State *g, lua_State *th) { | |||
613 | } | 626 | } |
614 | 627 | ||
615 | 628 | ||
616 | static int traverseudata (global_State *g, Udata *u) { | ||
617 | int i; | ||
618 | markobjectN(g, u->metatable); /* mark its metatable */ | ||
619 | for (i = 0; i < u->nuvalue; i++) | ||
620 | markvalue(g, &u->uv[i].uv); | ||
621 | return 1 + u->nuvalue; | ||
622 | } | ||
623 | |||
624 | |||
625 | /* | 629 | /* |
626 | ** traverse one gray object, turning it to black (except for threads, | 630 | ** traverse one gray object, turning it to black (except for threads, |
627 | ** which are always gray). | 631 | ** which are always gray). |