Поэтому я работаю над встраиванием Lua5.1-2 с использованием LuaJIT в приложение C ++ и включил возможность сценариев lua «подписаться» на события, возникающие в коде C ++, и успешно сохранил ссылку на функцию, используя luaL_ref, и успешно вызвал функцию, используя lua_rawgeti и lua_pcall.
Проблема в том, что после ~ 1500 вызовов функции происходит сбой приложения без исключения. Из любопытства я решил проконтролировать стек до и после вызовов функции lua и заметил, что lua_gettop начинает возвращать убывающие отрицательные значения: (‘it’ — это итератор для итерации по текущим «подписчикам», который был только один для тестирования)
gameClient->appendToLog("Stack size before: " + std::to_string(lua_gettop(L));
lua_rawgeti(L, LUA_REGISTRYINDEX, it->second);
gameClient->appendToLog("Stack size [rawgeti]: " + std::to_string(lua_gettop(L));
int res = lua_pcall(L, 0, 0, 0);
gameClient->appendToLog("Stack size after: " + std::to_string(lua_gettop(L));
Функция lua состоит только из вызова регистрации для тестирования:
function update()
log("Lua tick")
end
Вот вывод:
Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: 0
Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: 0
... repeats a few hundred times, then ..
Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: -1
Stack size before: -1
Stack size [rawgeti]: 0
Lua tick
Stack size after: -1
... also repeats anywhere from 50-300 times before decreasing yet again
Stack size before: -1
Stack size [rawgeti] 0
Lua tick
Stack size after: -2
Stack size before: -2
Stack size [rawgeti]: -1
Lua tick
Stack size after: -2
Это в конечном итоге приводит к сбою приложения. Для функции lua нет возвращаемого значения или параметров, поэтому у меня нет идей.
Примечание: это происходит без вызова log () в функции lua, я уже проверял это.
Изменить: вызов lua_settop (L, 0) после lua_pcall предотвращает сбой, но я все еще хотел бы знать, что вызывает проблему, чтобы я мог ее исправить.
Задача ещё не решена.