static void setnodevector (lua_State *L, Hash *t, lint32 size) { int i; if (size > MAX_INT) lua_error(L, "table overflow"); t->node = luaM_newvector(L, size, Node); for (i=0; i<(int)size; i++) { ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; t->node[i].next = NULL; } L->nblocks += gcsize(L, size) - gcsize(L, t->size); t->size = size; t->firstfree = &t->node[size-1]; /* first free position to be used */ }
static void rehash(Hash *t) { int32 nold = nhash(t); Node *vold = nodevector(t); int32 i; if (!emptyslots(t)) nhash(t) = luaO_redimension(nhash(t)); nodevector(t) = hashnodecreate(nhash(t)); for (i = 0; i < nold; i++) { Node *n = vold + i; if (ttype(ref(n)) != LUA_T_NIL && ttype(val(n)) != LUA_T_NIL) *node(t, present(t, ref(n))) = *n; // copy old node to luaM_new hash } nblocks += gcsize(t->nhash) - gcsize(nold); luaM_free(vold); }
static void rehash (Hash *t) { int nold = nhash(t); Node *vold = nodevector(t); int nnew = newsize(t); int i; nodevector(t) = hashnodecreate(nnew); nhash(t) = nnew; for (i=0; i<nold; i++) { Node *n = vold+i; if (ttype(ref(n)) != LUA_T_NIL && ttype(val(n)) != LUA_T_NIL) *node(t, present(t, ref(n))) = *n; /* copy old node to luaM_new hash */ } L->nblocks += gcsize(nnew)-gcsize(nold); luaM_free(vold); }
void luaH_free(Hash *frees) { while (frees) { Hash *next = (Hash *)frees->head.next; nblocks -= gcsize(frees->nhash); hashdelete(frees); frees = next; } }
Hash *luaH_new(int32 nhash) { Hash *t = luaM_new(Hash); nhash = luaO_redimension((int32)((float)nhash / REHASH_LIMIT)); nodevector(t) = hashnodecreate(nhash); nhash(t) = nhash; nuse(t) = 0; t->htag = TagDefault; luaO_insertlist(&roottable, (GCnode *)t); nblocks += gcsize(nhash); return t; }
Hash *luaH_new (lua_State *L, int size) { Hash *t = luaM_new(L, Hash); t->htag = TagDefault; t->next = L->roottable; L->roottable = t; t->mark = t; t->size = 0; L->nblocks += gcsize(L, 0); t->node = NULL; setnodevector(L, t, luaO_power2(size)); return t; }
void luaH_free (lua_State *L, Hash *t) { L->nblocks -= gcsize(L, t->size); luaM_free(L, t->node); luaM_free(L, t); }