Почему я получаю поток вместо моих параметров? - PullRequest
0 голосов
/ 12 января 2019

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

По какой-то причине это происходит с некоторыми функциями, которые я экспортировал, но не со всеми. Я не вижу никакой разницы в способе экспорта различных функций.

Есть ли причина, по которой Луа переключил бы мои параметры в поток?

1 Ответ

0 голосов
/ 12 января 2019

Я нашел ответ.

Оказывается, что lua_State, переданный вам по lua_CFunction, не обязательно будет таким же, как тот, который вы впервые получили по lua_newstate()

Полагаю, что у каждой сопрограммы может быть свой отдельный lua_State. Если вы всегда делаете что-то на lua_State, который вы получили на lua_newstate(), у вас могут быть проблемы с сопрограммами, поэтому вы должны всегда использовать lua_State, который вы получили на вашем lua_CFunction.

...