Я использую следующую функцию для просмотра таблицы Lua и чтения ее в `Json :: Value
Json::Value EncodeTable(lua_State* L, int index){
Json::Value node;
//The solution: change lua_pushvalue(L, -1) to lua_pushvalue(L, index)
lua_pushvalue(L, index);
lua_pushnil(L);
while(lua_next(L, -2)){
lua_pushvalue(L, -2);
if(lua_isnumber(L, -1)){
if(lua_isstring(L, -2)){
node[(int)lua_tonumber(L, -1)-1] = lua_tostring(L, -2);
}else if(lua_isnumber(L, -2)){
node[(int)lua_tonumber(L, -1)-1] = lua_tonumber(L, -2);
}else if(lua_isnil(L, -2)){
node[(int)lua_tonumber(L, -1)-1] = Json::Value();
}else if(lua_istable(L, -2)){
node[(int)lua_tonumber(L, -1)-1] = EncodeTable(L, -2);
}
}else{
if(lua_isstring(L, -2)){
node[lua_tostring(L, -1)] = lua_tostring(L, -2);
}else if(lua_isnumber(L, -2)){
node[lua_tostring(L, -1)] = lua_tonumber(L, -2);
}else if(lua_isnil(L, -2)){
node[lua_tostring(L, -1)] = Json::Value();
}else if(lua_istable(L, -2)){
node[lua_tostring(L, -1)] = EncodeTable(L, -2);
}
}
lua_pop(L, 2);
}
lua_pop(L, 1);
return node;
}
И все это прекрасно работает, пока не появится вложенная таблица, а затем она segfaults. Запуск LLDB просто дал мне несколько ошибок при сборке, так что это тоже не помогло. Кто-нибудь знает, что я делаю не так?
РЕДАКТИРОВАТЬ
LLDB дает мне это:
* thread #2: tid = 0x5a47, 0x00007f902f99f280 liblua5.2.so.0
frame #0: 0x00007f902f99f280 liblua5.2.so.0
-> 0x7f902f99f280: movzbl 11(%rdi), %ecx
0x7f902f99f284: movq (%rsi), %rdx
0x7f902f99f287: movl $1, %eax
0x7f902f99f28c: movq 32(%rdi), %r8
Задача ещё не решена.