lua-users home
lua-l archive

Re: [ANN] Lua 5.2.0 (alpha) now available

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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 */
}

AltStyle によって変換されたページ (->オリジナル) /