Реестр Lua не виден из новых штатов - PullRequest
0 голосов
/ 06 апреля 2009

В функции C, вызванной из моего скрипта Lua, я использую luaL_ref для хранения ссылки на функцию. Однако если я затем попытаюсь использовать возвращенный целочисленный индекс для извлечения этой функции из другого потока, который не получен из того же состояния, все, что я получаю, это nil. Вот самый простой пример, который, кажется, демонстрирует это:

// Assumes a valid lua_State pL, with a function on top of the stack
int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX);

// Create a new state
lua_State* pL2 = luaL_newstate();
lua_rawgeti(pL2, LUA_REGISTRYINDEX, nFunctionRef);
const char* szType = luaL_typename(pL2, -1);

Я обнаружил, что szType содержит значение 'nil'.

Насколько я понимаю, реестр был распределен между всеми кодами C на глобальном уровне, поэтому кто-нибудь может объяснить, почему это не работает?

Если реестр таким образом не используется глобально, как я могу получить доступ к своим значениям, как мне нужно, из другого скрипта?

Ответы [ 3 ]

6 голосов
/ 06 апреля 2009

Реестр - это обычная таблица в состоянии Lua, поэтому два несвязанных состояния Lua не могут получить доступ к одному и тому же реестру.

Как говорит Ккнд, вам придется предоставить свой собственный механизм. Обычный трюк - создание дополнительного состояния, которое не выполняет никакого кода, оно используется только как хранилище. В вашем случае вы бы использовали реестр этого дополнительного состояния из своего кода C. к сожалению, нет доступного метода для копирования произвольных значений между двумя состояниями, поэтому вам придется развернуть любые таблицы.

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

2 голосов
/ 06 апреля 2009

Чтобы использовать несколько вселенных (состояний) Lua, вам может понадобиться Lua Lanes . Существует также грубое сравнение решений Lua с несколькими состояниями.

Лейнс действительно обеспечивает «скрытое состояние», которое упоминает Хавьер. Он также обрабатывает блокировки, необходимые для доступа к таким общим данным, и возможность ожидания изменения таких данных. И он копирует все, что можно копировать (включая функции и замыкания) между состояниями вашего приложения и скрытым состоянием.

2 голосов
/ 06 апреля 2009

luaL_newstate () создает другое разделенное состояние, как следует из названия. Реестр разделен только между «потоками», созданными с помощью lua_newthread (parent_state);

Изменить, чтобы соответствовать вопросу. Edit:

Вы можете запускать скрипты в одном и том же состоянии, или, если вы этого не хотите, вам нужно будет предоставить свои собственные механизм синхронизации данных между двумя состояниями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...