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函数?

原文链接 https://stackoverflow.com/questions/10087226

点赞
stackoverflow用户15996
stackoverflow用户15996

全局环境现在存储在注册表的一个特殊索引中。尝试使用以下代码:

//-- 从注册表中获取全局环境表
lua_rawgeti(pLuaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);

//-- 创建包含钩子细节的表
lua_newtable(pLuaState);
lua_pushstring(pLuaState, "__index");
lua_pushcfunction(pLuaState, function_hook);
lua_settable(pLuaState, -3);

//-- 设置全局索引回调钩子
lua_setmetatable(pLuaState, -2);

//-- 从堆栈中移除全局环境表
lua_pop(pLuaState, 1);
2012-04-10 11:38:04
stackoverflow用户2482283
stackoverflow用户2482283

以下是补丁: 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);
2020-07-04 16:46:51