Lua 5.2 LUA_GLOBALSINDEX Альтернатива

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

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

Это небольшая часть кода 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);

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

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

Ответы

Ответ 1

Глобальная среда теперь сохраняется в специальном индексе в реестре . Попробуйте:

//-- get global environment table from registry
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);