| 6556 | |
| 6557 | |
| 6558 | static l_mem singlestep (lua_State *L) { |
| 6559 | global_State *g = G(L); |
| 6560 | /*lua_checkmemory(L);*/ |
| 6561 | switch (g->gcstate) { |
| 6562 | case GCSpause: { |
| 6563 | markroot(L); /* start a new collection */ |
| 6564 | return 0; |
| 6565 | } |
| 6566 | case GCSpropagate: { |
| 6567 | if (g->gray) |
| 6568 | return propagatemark(g); |
| 6569 | else { /* no more `gray' objects */ |
| 6570 | atomic(L); /* finish mark phase */ |
| 6571 | return 0; |
| 6572 | } |
| 6573 | } |
| 6574 | case GCSsweepstring: { |
| 6575 | lu_mem old = g->totalbytes; |
| 6576 | sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); |
| 6577 | if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ |
| 6578 | g->gcstate = GCSsweep; /* end sweep-string phase */ |
| 6579 | lua_assert(old >= g->totalbytes); |
| 6580 | g->estimate -= old - g->totalbytes; |
| 6581 | return GCSWEEPCOST; |
| 6582 | } |
| 6583 | case GCSsweep: { |
| 6584 | lu_mem old = g->totalbytes; |
| 6585 | g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); |
| 6586 | if (*g->sweepgc == NULL) { /* nothing more to sweep? */ |
| 6587 | checkSizes(L); |
| 6588 | g->gcstate = GCSfinalize; /* end sweep phase */ |
| 6589 | } |
| 6590 | lua_assert(old >= g->totalbytes); |
| 6591 | g->estimate -= old - g->totalbytes; |
| 6592 | return GCSWEEPMAX*GCSWEEPCOST; |
| 6593 | } |
| 6594 | case GCSfinalize: { |
| 6595 | if (g->tmudata) { |
| 6596 | GCTM(L); |
| 6597 | if (g->estimate > GCFINALIZECOST) |
| 6598 | g->estimate -= GCFINALIZECOST; |
| 6599 | return GCFINALIZECOST; |
| 6600 | } |
| 6601 | else { |
| 6602 | g->gcstate = GCSpause; /* end collection */ |
| 6603 | g->gcdept = 0; |
| 6604 | return 0; |
| 6605 | } |
| 6606 | } |
| 6607 | default: lua_assert(0); return 0; |
| 6608 | } |
| 6609 | } |
| 6610 | |
| 6611 | |
| 6612 | void luaC_step (lua_State *L) { |
no test coverage detected