diff --git a/ltable.c b/ltable.c index 02b14943..a8abe5f6 100644 --- a/ltable.c +++ b/ltable.c @@ -1,5 +1,5 @@ /* -** $Id: ltable.c,v 1.125 2002/12/02 12:06:10 roberto Exp roberto $ +** $Id: ltable.c,v 1.126 2002/12/04 17:38:31 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -178,21 +178,24 @@ static void computesizes (int nums[], int ntotal, int *narray, int *nhash) { static void numuse (const Table *t, int *narray, int *nhash) { int nums[MAXBITS+1]; - int i; + int i, lg; int totaluse = 0; - for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* init `nums' */ /* count elements in array part */ - i = luaO_log2(t->sizearray) + 1; /* number of `slices' */ - while (i--) { /* for each slice [2^(i-1) to 2^i) */ - int to = twoto(i); - int from = to/2; - if (to > t->sizearray) to = t->sizearray; - for (; from < to; from++) - if (!ttisnil(&t->array[from])) { - nums[i]++; + for (i=0, lg=0; lg<=MAXBITS; lg++) { /* for each slice [2^(lg-1) to 2^lg) */ + int ttlg = twoto(lg); /* 2^lg */ + if (ttlg > t->sizearray) { + ttlg = t->sizearray; + if (i >= ttlg) break; + } + nums[lg] = 0; + for (; iarray[i])) { + nums[lg]++; totaluse++; } + } } + for (; lg<=MAXBITS; lg++) nums[lg] = 0; /* reset other counts */ *narray = totaluse; /* all previous uses were in array part */ /* count elements in hash part */ i = sizenode(t);