diff options
-rw-r--r-- | lgc.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.140 2013/03/16 21:10:18 roberto Exp $ | 2 | ** $Id: lgc.c,v 2.140.1.1 2013/04/12 18:48:47 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 | */ |
@@ -493,17 +493,24 @@ static lu_mem traverseLclosure (global_State *g, LClosure *cl) { | |||
493 | 493 | ||
494 | 494 | ||
495 | static lu_mem traversestack (global_State *g, lua_State *th) { | 495 | static lu_mem traversestack (global_State *g, lua_State *th) { |
496 | int n = 0; | ||
496 | StkId o = th->stack; | 497 | StkId o = th->stack; |
497 | if (o == NULL) | 498 | if (o == NULL) |
498 | return 1; /* stack not completely built yet */ | 499 | return 1; /* stack not completely built yet */ |
499 | for (; o < th->top; o++) | 500 | for (; o < th->top; o++) /* mark live elements in the stack */ |
500 | markvalue(g, o); | 501 | markvalue(g, o); |
501 | if (g->gcstate == GCSatomic) { /* final traversal? */ | 502 | if (g->gcstate == GCSatomic) { /* final traversal? */ |
502 | StkId lim = th->stack + th->stacksize; /* real end of stack */ | 503 | StkId lim = th->stack + th->stacksize; /* real end of stack */ |
503 | for (; o < lim; o++) /* clear not-marked stack slice */ | 504 | for (; o < lim; o++) /* clear not-marked stack slice */ |
504 | setnilvalue(o); | 505 | setnilvalue(o); |
505 | } | 506 | } |
506 | return sizeof(lua_State) + sizeof(TValue) * th->stacksize; | 507 | else { /* count call infos to compute size */ |
508 | CallInfo *ci; | ||
509 | for (ci = &th->base_ci; ci != th->ci; ci = ci->next) | ||
510 | n++; | ||
511 | } | ||
512 | return sizeof(lua_State) + sizeof(TValue) * th->stacksize + | ||
513 | sizeof(CallInfo) * n; | ||
507 | } | 514 | } |
508 | 515 | ||
509 | 516 | ||