lua — C ++ и Lua5.1-2 / LuaJIT

Поэтому я работаю над встраиванием 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 предотвращает сбой, но я все еще хотел бы знать, что вызывает проблему, чтобы я мог ее исправить.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]