I am trying to iterate through a lua table but I keep getting this error:
invalid key to 'next'
I know that index starts off as -8 and I know that there is a table there because it gets the first (and only) value in it. However, it tries to loop round again even though I know there is only one string in the table.
if (lua_istable(L, index))
{
lua_pushnil(L);
// This is needed for it to even get the first value
index--;
while (lua_next(L, index) != 0)
{
const char *item = luaL_checkstring(L, -1);
lua_pop(L, 1);
printf("%s\n", item);
}
}
else
{
luaL_typerror(L, index, "string table");
}
Any help would be appreciated.
This works fine when I use a positive index (as long as I don't remove 1 from it)
Edit: I've noticed that I don't get this error if I leave the value of item alone. Only when I start reading the value of item do I get this error. When I've got the value from the table, I call another Lua function, could this be disrupting lua_next?
Best Answer
There are 2 things you need to watch:
lua_next
.luaL_checkstring
will convert non-string keys to strings (as the resulting string is not in the table, it becomes an invalid key.) This is most easily done by passingluaL_checkstring
a copy of the key instead of the original.Your function will only work for negative values of
index
. You are correct thatindex--;
will ensure thatindex
still points to the table after pushing the key, but only ifindex
was negative (i.e. relative to the top of the stack.) Ifindex
is an absolute or pseudo index then it this will cause it to point to the wrong item. The easiest workaround is to push another reference to the table onto the top of the stack.Here's a minimal C program to demonstrate: