Почему я получаю поток вместо моих параметров?

Я использую 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,

Другие вопросы по тегам