luaa: only handle tables in loop check

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2009-04-03 11:44:08 +02:00
parent c036c8d234
commit 16606c6744
1 changed files with 22 additions and 19 deletions

41
luaa.c
View File

@ -561,28 +561,31 @@ luaA_hasitem(lua_State *L, const void *item)
static bool static bool
luaA_isloop_check(lua_State *L, void_array_t *elems) luaA_isloop_check(lua_State *L, void_array_t *elems)
{ {
const void *object = lua_topointer(L, -1); if(lua_istable(L, -1))
/* Check that the object table is not already in the list */
for(int i = 0; i < elems->len; i++)
if(elems->tab[i] == object)
return false;
/* push the table in the elements list */
void_array_append(elems, object);
/* look every object in the "table" */
lua_pushnil(L);
while(luaA_next(L, -2))
{ {
if(!luaA_isloop_check(L, elems)) const void *object = lua_topointer(L, -1);
/* Check that the object table is not already in the list */
for(int i = 0; i < elems->len; i++)
if(elems->tab[i] == object)
return false;
/* push the table in the elements list */
void_array_append(elems, object);
/* look every object in the "table" */
lua_pushnil(L);
while(luaA_next(L, -2))
{ {
/* remove key and value */ if(!luaA_isloop_check(L, elems))
lua_pop(L, 2); {
return false; /* remove key and value */
lua_pop(L, 2);
return false;
}
/* remove value, keep key for next iteration */
lua_pop(L, 1);
} }
/* remove value, keep key for next iteration */
lua_pop(L, 1);
} }
return true; return true;
} }