Почему я получаю поток вместо моих параметров?
Я использую 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"
поле, и сделать что-нибудь с этим.
Это работает довольно хорошо, и я делал много подобных вещей годами.
Теперь я хочу преобразовать вызов Луа в f
к сопрограмме, поэтому я делаю что-то подобное со стороны луа:
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, из обратного вызова я получаю только один параметр, и это поток.
По какой-то причине это происходит с некоторыми функциями, которые я экспортировал, но не со всеми. Я не вижу никакой разницы в том, как я экспортирую различные функции.
Есть ли причина, по которой lua переключал бы мои параметры в поток?
1 ответ
Я нашел ответ.
Оказывается, что lua_State
который передается вам на lua_CFunction
не гарантируется совпадение с тем, на котором вы впервые оказались lua_newstate()
Я полагаю, что каждая сопрограмма может получить свою собственную lua_State
, Если вы всегда делаете вещи на lua_State
ты получил на lua_newstate()
, у вас могут быть проблемы с сопрограммами, поэтому вы должны убедиться, что вы всегда используете lua_State
вы получили по вашему lua_CFunction
,