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);