| 606 | |
| 607 | |
| 608 | static l_mem traversetable (global_State *g, Table *h) { |
| 609 | markobjectN(g, h->metatable); |
| 610 | switch (getmode(g, h)) { |
| 611 | case 0: /* not weak */ |
| 612 | traversestrongtable(g, h); |
| 613 | break; |
| 614 | case 1: /* weak values */ |
| 615 | traverseweakvalue(g, h); |
| 616 | break; |
| 617 | case 2: /* weak keys */ |
| 618 | traverseephemeron(g, h, 0); |
| 619 | break; |
| 620 | case 3: /* all weak; nothing to traverse */ |
| 621 | if (g->gcstate == GCSpropagate) |
| 622 | linkgclist(h, g->grayagain); /* must visit again its metatable */ |
| 623 | else |
| 624 | linkgclist(h, g->allweak); /* must clear collected entries */ |
| 625 | break; |
| 626 | } |
| 627 | return cast(l_mem, 1 + 2*sizenode(h) + h->asize); |
| 628 | } |
| 629 | |
| 630 | |
| 631 | static l_mem traverseudata (global_State *g, Udata *u) { |
no test coverage detected