g
Size: a a a
g
S
S
_private_method
, и в них никто не лазает, потому что есть шанс сломать : )AZ
S
S
lua_getglobal(L, "require");Вот у тебя теперь ссылка на табличку-модуль. Когда нужно — вставляешь её в стек, извлекаешь нужную функцию и вызываешь.
lua_pushstring(L, "cjson"); // например, cjson
lua_call(L, 1, 1);
int ref = lua_ref(L, -1);
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
В сишке нет такого понятия как "локально", мы можем разве что не модифицируя глобалспейс луа-стейта вытащить ссылку.S
AZ
S
S
AZ
S
S
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_table);
lua_getfield(L, -1, "userfunc");
lua_call(L, 0, 0);Но там сама библиотека инициализирует и выдаёт юзеру в пользование табличку
callback_table
, и запоминает ссылку на неё. Пользователь заносит в неё функции, и дёргает сишную "вызвать колбеки", которая дёргает луёвые. Это конечно тоже не очень хорошо, и по хорошему надо бы выгружать в луа список колбеков, которые были вызваны с предыдущего дёрганья, но у меня не было желания делать сто тысяч миллиардов типов колбеков, там уже особенности самой steamworks. То есть, структура как бы не очень приятная, но хоть нет зависимостей от внешних модулей.S
AZ
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_table);
lua_getfield(L, -1, "userfunc");
lua_call(L, 0, 0);Но там сама библиотека инициализирует и выдаёт юзеру в пользование табличку
callback_table
, и запоминает ссылку на неё. Пользователь заносит в неё функции, и дёргает сишную "вызвать колбеки", которая дёргает луёвые. Это конечно тоже не очень хорошо, и по хорошему надо бы выгружать в луа список колбеков, которые были вызваны с предыдущего дёрганья, но у меня не было желания делать сто тысяч миллиардов типов колбеков, там уже особенности самой steamworks. То есть, структура как бы не очень приятная, но хоть нет зависимостей от внешних модулей.S
local steam = require'luasteam'
-- таблица steam.callback запомнена внутри сишной либы
function steam.callback.onFriendMessage(friend, msg)
print("Got " .. msg .. " from " .. friend:getName())
end
while true do
-- Эта штука вызовет функцию (если есть)
-- когда наступит событие
steam.eventPump()
end
Если ты пробовал ловку, то схема такая же, только без луёвого фронтенда (там луа сначала получает события, а потом дёргает луёвые же функции если есть).S
S
int ref = lua_ref(L, -1);
можно запоминать ссылки на функции, например. То есть, у тебя в сишном модуле функция "setJsonDecoder
", которая принимает из луа функцию, запоминает, а потом вызывает при нужде. Но тут всё равно проблемы обработки тех же ошибок типа "невалидный json". AZ
local steam = require'luasteam'
-- таблица steam.callback запомнена внутри сишной либы
function steam.callback.onFriendMessage(friend, msg)
print("Got " .. msg .. " from " .. friend:getName())
end
while true do
-- Эта штука вызовет функцию (если есть)
-- когда наступит событие
steam.eventPump()
end
Если ты пробовал ловку, то схема такая же, только без луёвого фронтенда (там луа сначала получает события, а потом дёргает луёвые же функции если есть).