Вопрос по c – Lua 5.2 LUA_GLOBALSINDEX Альтернатива

15

У меня есть программа, которая встраивает Lua и реализует форму поиска ленивых функций.

Как это работает в Lua 5.1, когда символ не определен, интерпретатор вызывает глобальную функцию-ловушку, которая затем разрешает символ.

Это небольшая часть кода C, которая реализовала этот ленивый поиск функций:

int function_hook(lua_State *pLuaState)
{
  // do the function lookup here
  ....
  return 1;
}

......

//-- create table containing the hook details
lua_newtable(pLuaState);
lua_pushstring(pLuaState, "__index");
lua_pushcfunction(pLuaState, function_hook);
lua_settable(pLuaState, -3);

//-- set global index callback hook
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX);

Я сейчас пытаюсь переместить этот код в Lua 5.2 и столкнулся с проблемой.

В Lua 5.2 значение LUA_GLOBALSINDEX больше не определяется, поэтому эта строка кода больше не компилируется.

//-- set global call back hook
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX);

Eстьссылка к этому изменению на LUA_GLOBALSINDEX, но, к сожалению, это не помогло.

Каков был бы лучший способ переписать эту одну строку кода, чтобы интерпретатор вызывал function_hook всякий раз, когда он находит неразрешенный символ?

Ваш Ответ

1   ответ
14

глобальная среда теперь хранится по специальному индексу вреестр, Пытаться:

lua_rawgeti(pLuaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);

//-- create table containing the hook details
lua_newtable(pLuaState);
lua_pushstring(pLuaState, "__index");
lua_pushcfunction(pLuaState, function_hook);
lua_settable(pLuaState, -3);

//-- set global index callback hook
lua_setmetatable(pLuaState, -2);

//-- remove the global environment table from the stack
lua_pop(pLuaState, 1);
+1 Это решение работает отлично. Большое спасибо. jussij
Вы также можете использоватьlua_pushglobaltable(pLuaState) вместоlua_rawgeti(pLuaState, LUA_RIDX_GLOBALS, LUA_REGISTRYINDEX) чтобы защитить ваш код от будущих изменений. Вы также можете определитьlua_pushglobaltable для Lua 5.1 aslua_pushvalue(L, LUA_GLOBALSINDEX).

Похожие вопросы