From d6826dbc80f9ce4611a26032274231d46556fe94 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 13 Feb 2003 14:08:32 -0200 Subject: simpler way to count uses --- ltable.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) 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); -- cgit v1.2.3-55-g6feb