|
|
@ -1,5 +1,5 @@ |
|
|
|
/*
|
|
|
|
** $Id: ltable.c,v 1.105 2002/04/23 15:04:39 roberto Exp roberto $ |
|
|
|
** $Id: ltable.c,v 1.106 2002/05/08 17:34:00 roberto Exp roberto $ |
|
|
|
** Lua tables (hash) |
|
|
|
** See Copyright Notice in lua.h |
|
|
|
*/ |
|
|
@ -244,12 +244,13 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) { |
|
|
|
nold = t->node; /* save old hash ... */ |
|
|
|
else { /* old hash is `dummynode' */ |
|
|
|
lua_assert(t->node == G(L)->dummynode); |
|
|
|
temp[0] = t->node[0]; /* copy it to `temp' (in case of errors) */ |
|
|
|
temp[0] = t->node[0]; /* copy it to `temp' */ |
|
|
|
nold = temp; |
|
|
|
setnilvalue(key(G(L)->dummynode)); /* restate invariant */ |
|
|
|
setnilvalue(val(G(L)->dummynode)); |
|
|
|
lua_assert(G(L)->dummynode->next == NULL); |
|
|
|
} |
|
|
|
if (nasize > oldasize) /* should grow array part? */ |
|
|
|
if (nasize > oldasize) /* array part must grow? */ |
|
|
|
setarrayvector(L, t, nasize); |
|
|
|
/* create new hash part with appropriate size */ |
|
|
|
setnodevector(L, t, nhsize); |
|
|
@ -261,12 +262,11 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) { |
|
|
|
if (ttype(&t->array[i]) != LUA_TNIL) |
|
|
|
luaH_setnum(L, t, i+1, &t->array[i]); |
|
|
|
} |
|
|
|
/* shink array */ |
|
|
|
/* shrink array */ |
|
|
|
luaM_reallocvector(L, t->array, oldasize, nasize, TObject); |
|
|
|
} |
|
|
|
/* re-insert elements in hash part */ |
|
|
|
i = twoto(oldhsize); |
|
|
|
while (i--) { |
|
|
|
for (i = twoto(oldhsize) - 1; i >= 0; i--) { |
|
|
|
Node *old = nold+i; |
|
|
|
if (ttype(val(old)) != LUA_TNIL) |
|
|
|
luaH_set(L, t, key(old), val(old)); |
|
|
@ -279,7 +279,6 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) { |
|
|
|
static void rehash (lua_State *L, Table *t) { |
|
|
|
int nasize, nhsize; |
|
|
|
numuse(t, &nasize, &nhsize); /* compute new sizes for array and hash parts */ |
|
|
|
nhsize += nhsize/4; /* allow some extra for growing nhsize */ |
|
|
|
resize(L, t, nasize, luaO_log2(nhsize)+1); |
|
|
|
} |
|
|
|
|
|
|
|