| 9535 | |
| 9536 | |
| 9537 | static void resize (lua_State *L, Table *t, int nasize, int nhsize) { |
| 9538 | int i; |
| 9539 | int oldasize = t->sizearray; |
| 9540 | int oldhsize = t->lsizenode; |
| 9541 | Node *nold = t->node; /* save old hash ... */ |
| 9542 | if (nasize > oldasize) /* array part must grow? */ |
| 9543 | setarrayvector(L, t, nasize); |
| 9544 | /* create new hash part with appropriate size */ |
| 9545 | setnodevector(L, t, nhsize); |
| 9546 | if (nasize < oldasize) { /* array part must shrink? */ |
| 9547 | t->sizearray = nasize; |
| 9548 | /* re-insert elements from vanishing slice */ |
| 9549 | for (i=nasize; i<oldasize; i++) { |
| 9550 | if (!ttisnil(&t->array[i])) |
| 9551 | setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); |
| 9552 | } |
| 9553 | /* shrink array */ |
| 9554 | luaM_reallocvector(L, t->array, oldasize, nasize, TValue); |
| 9555 | } |
| 9556 | /* re-insert elements from hash part */ |
| 9557 | for (i = twoto(oldhsize) - 1; i >= 0; i--) { |
| 9558 | Node *old = nold+i; |
| 9559 | if (!ttisnil(gval(old))) |
| 9560 | setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old)); |
| 9561 | } |
| 9562 | if (nold != dummynode) |
| 9563 | luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ |
| 9564 | } |
| 9565 | |
| 9566 | |
| 9567 | void luaH_resizearray (lua_State *L, Table *t, int nasize) { |
no test coverage detected