首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua 5.2 LUA_GLOBALSINDEX替代方案

Lua 5.2 LUA_GLOBALSINDEX替代方案
EN

Stack Overflow用户
提问于 2012-04-10 18:42:47
回答 2查看 15.7K关注 0票数 17

我有一个嵌入Lua的程序,并实现了一种惰性函数查找。

它在Lua5.1中的工作方式是,当一个符号未定义时,解释器将调用一个全局函数钩子,然后该函数钩子将解析该符号。

这是实现这种惰性函数查找的一小部分C代码:

代码语言:javascript
复制
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值,因此不再编译此行代码。

代码语言:javascript
复制
//-- set global call back hook
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX);

对LUA_GLOBALSINDEX的这一更改有一个reference,但不幸的是,它并没有帮助。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-10 19:38:05

现在,global environment存储在registry中的一个特殊索引中。尝试:

代码语言:javascript
复制
//-- 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);
票数 16
EN

Stack Overflow用户

发布于 2020-07-05 00:46:51

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

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10087226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档