Я использую lua 5.3 из моей игры на C / C ++, чтобы позволить сценариям определенных частей его поведения.
Из программы на C ++ каждый кадр, который я вызываю функцией lua main
следующим образом:
lua_getfield(VMState, LUA_GLOBALSINDEX, "main");
int result = lua_pcall(VMState, 0, 0, 0);
Я ожидаю, что скрипт определит функцию с именем main
, которая выполняет кучу всего. Например, у меня может быть скрипт, который делает что-то вроде этого:
local f = function()
draw_something({visible = true, x = 0, y = 0})
end
main = function()
f()
end
draw_something()
- это обратный вызов кода C, который делает что-то интересное с переданными параметрами:
lua_getfield(VMState, 1, "visible");
bool visible = (bool)lua_toboolean(VMState, 2); lua_pop(VMState, 1);
if (!visible)
return;
// Do some other stuff
Интересно, что к тому времени, когда вызывается этот обратный вызов, анонимная таблица, которую я передал в качестве параметра do_something
на стороне lua, теперь находится в позиции стека 1, поэтому я могу вызывать lua_getfield()
из C сторона, чтобы получить доступ к полю "visible"
и что-то с ним сделать.
Это работает довольно хорошо, и я много лет делал такие вещи.
Теперь я хочу преобразовать вызов lua в f
в сопрограмму, поэтому я делаю что-то подобное со стороны lua:
local f = function()
draw_something({visible = true, x = 0, y = 0})
end
local g = coroutine.create(function()
while true do
f()
coroutine.yield()
end
end
main = function()
coroutine.resume(g)
end
Результат должен быть таким же. Однако теперь получается, что, переместив вызов в draw_something()
внутри сопрограммы, параметр, который я передал функции, которая должна была быть таблицей, теперь является потоком? (lua_istable()
возвращает 0, а lua_isthread()
возвращает 1).
Интересно, что не имеет значения, сколько параметров я передаю своей функции: 0, 1, 4, 50, изнутри обратного вызова я получаю только один параметр, и это поток.
По какой-то причине это происходит с некоторыми функциями, которые я экспортировал, но не со всеми. Я не вижу никакой разницы в способе экспорта различных функций.
Есть ли причина, по которой Луа переключил бы мои параметры в поток?