[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: [ANN] Lua 5.2.0 (alpha) now available
- From: Petite Abeille <petite_abeille@...>
- Date: Mon, 13 Dec 2010 21:06:47 +0100
On Dec 13, 2010, at 4:05 AM, Javier Guerra Giraldez wrote:
> next() does a linear scan of the array part before starting with the
> hash part. if you have a big but empty array part it can take a
> significant time.
Hmmm... damn, you are right! :)
In ltable.luaH_next, that first loop probes the array part sequentially until it find a non-nil value... oh, well...
int luaH_next (lua_State *L, Table *t, StkId key) {
int i = findindex(L, t, key); /* find original element */
for (i++; i < t->sizearray; i++) { /* try first array part */
if (!ttisnil(&t->array[i])) { /* a non-nil value? */
setnvalue(key, cast_num(i+1));
setobj2s(L, key+1, &t->array[i]);
return 1;
}
}
for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */
if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */
setobj2s(L, key, gkey(gnode(t, i)));
setobj2s(L, key+1, gval(gnode(t, i)));
return 1;
}
}
return 0; /* no more elements */
}