Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Lua 5.2 Lua_全球索引替代方案_C_Lua - Fatal编程技术网

C Lua 5.2 Lua_全球索引替代方案

C Lua 5.2 Lua_全球索引替代方案,c,lua,C,Lua,我有一个嵌入Lua的程序,它实现了一种形式的惰性函数查找 它在Lua5.1中的工作方式是,每当一个符号未定义时,解释器就会调用一个全局函数钩子,然后解析该符号 这是实现此惰性函数查找的C代码的一小部分: int function_hook(lua_State *pLuaState) { // do the function lookup here .... return 1; } ...... //-- create table containing the hook detai

我有一个嵌入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的这一更改有很大的影响,但不幸的是,它没有起到任何作用

重新编写这一行代码的最佳方法是什么,以便解释器在发现未解析符号时调用函数\u hook?

现在存储在中的特殊索引中。尝试:

以下是补丁:


您还可以使用
lua\u pushglobaltable(pLuaState)
而不是
lua\u rawgeti(pLuaState、lua\u RIDX\u GLOBALS、lua\u registeryindex)
来保护您的代码不受未来更改的影响。您还可以将lua 5.1的
lua\u pushglobaltable
定义为
lua\u pushvalue(L,lua\u globalIndex)
//-- 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);
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);