18

我有一个嵌入 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 的最佳方法是什么?

4

2 回答 2

17

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

//-- 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);
于 2012-04-10T11:38:04.510 回答
0

这是补丁: 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-04T16:46:51.490 回答