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.139 2013/03/15 18:33:36 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.140.1.2 2013/04/26 18:22:05 roberto Exp $ |
| 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 | ||
