способ напрямую читать и модифицировать память нод таблиц Lua со стороны С? Решаемая задача: приложение, в которое встроен интерпретатор Lua, снаружи получает пользовательский скрипт, являющийся плотной числодробилкой, и этот скрипт зависит от кучи переменных "среды" (контекста), выставляемых приложением. Хочется минимизировать количество копий и C-API вызовов, при этом сохранив человеческий синтаксис для пользовательского скрипта, например:
-- env = {...} заполняется внешним приложением
function user_tick()
return math.sin(env.enemy.hits + env.my.y)
end
При этом можно считать, что gc отключен и layout среды заморожен (т.е. новые таблицы не создаются, существующие не расширяются и т.д.). Сейчас используется довольно быстрая комбинация с кэшированием luaL_ref + lua_settable для установки контекста env, но, возможно, есть более производительное zero copy решение?
Если env это сишная структура, то вам нужно завернуть ее в луашную userdata и прикрепить к этой userdata метатаблицу с метаметодом __index, это будет наиболее производительный вариант.
Нашел вот такой пример https://github.com/hertogp/lua-capi-examples/blob/d7d782406b132e67ad837ba9c71cef5d0d70e399/src/ex04.c из него можно узнать как создать метатаблицу и прикрепить к юзердате
Отлично, большое спасибо, изучу. Выглядит немного вывернуто на изнанку (Lua лезет читать наружу), но логично. Интересно ещё, как уживётся с LuaJIT, даже текущее решение в ней работает крайне достойно.
Обсуждают сегодня