[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Size of a non numerical indexed table
- From: Rici Lake <lua@...>
- Date: Thu, 1 Sep 2005 12:50:34 -0500
On 1-Sep-05, at 12:19 PM, Mark Hamburg wrote:
That implementation is unfriendly toward nil's in ... isn't it?
True. For the simple case, rather than use a sentinel,
we could just put the count in the otherwise unused argument:
// insert at line 248
static int ieachaux (lua_State *L) {
int n = luaL_checkint(L, 1); /* added */
int i = luaL_checkint(L, 2);
if (i <= n) {
i++;
lua_pushinteger(L, i);
lua_pushvalue(lua_upvalueindex(i));
return 2;
}
else
return 0;
}
// But for the table case, we need to use a sentinel, which might as
well
// be the table itself.
static int ieachaux_table (lua_State *L) {
int i = luaL_checkint(L, 2);
luaL_checktype(L, 1, LUA_TABLE);
i++;
lua_pushinteger(L, i);
lua_rawgeti(L, 1, i);
if (lua_rawequal(L, 1, -1)) {
lua_pop(L, 1);
return 1;
}
else return lua_isnil(L, -1) ? 0 : 2;
}
static int luaB_ieach (lua_State *L) {
int n = lua_gettop(L);
if (n <= LUAI_MAXUPVALUES) {
lua_pushcclosure(L, ieachaux, n);
lua_pushinteger(L, n); /* Changed */
}
else {
lua_pushvalue(L, lua_upvalueindex(1));
lua_createtable(L, n, 0);
do {
if (lua_isnil(L, n) /* added */
lua_pushvalue(L, -1);
else
lua_pushvalue(L, n); /* corrected */
lua_rawseti(L, -2, n); /* corrected */
} while (--n);
}
lua_pushinteger(L, 0);
return 3;
}
// insert in base_open, line 623:
auxopen(L, "ieach", luaB_ieach, ieachaux_table); /* Changed */
Moral: more eyes, fewer bugs.
Also: Don't type C into an email message :)
Hope I got it closer to right this time.