C语言 Lua 5.2 LUA_GLOBALSINDEX 备选方案



我有一个嵌入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);

有提到此更改LUA_GLOBALSINDEX但不幸的是它没有帮助。

重写这一行代码以使解释器在发现未解析的符号时调用function_hook的最佳方法是什么?

全局环境现在存储在注册表中的特殊索引中。尝试:

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

这里是补丁:http://lua-users.org/lists/lua-l/2013-01/msg00352.html

lua_pushvalue(L,LUA_GLOBALSINDEX);
=>
lua_pushglobaltable(L);
len = luaL_getn(L, -1);
=>
len = lua_rawlen(L, -1);
lua_getfenv(L, lo);
=>
lua_getuservalue(L, lo);
lua_setfenv(L, lo);
=>
lua_setuservalue(L, lo);

最新更新