我有一个嵌入Lua的程序,并实现了一种惰性函数查找。
它在Lua5.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);我现在正在尝试将这段代码迁移到Lua5.2,但遇到了一个问题。
在Lua5.2中,不再定义LUA_GLOBALSINDEX值,因此不再编译此行代码。
//-- set global call back hook
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX);对LUA_GLOBALSINDEX的这一更改有一个reference,但不幸的是,它并没有帮助。
重写这一行代码的最佳方式是什么,以便解释器在发现未解析的符号时调用function_hook?
发布于 2012-04-10 19:38:05
现在,global environment存储在registry中的一个特殊索引中。尝试:
//-- 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);发布于 2020-07-05 00:46:51
这里是补丁: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);https://stackoverflow.com/questions/10087226
复制相似问题