void luaL_unref (lua_State *L, int t, int ref); 解引用,ref是luaL_ref 返回的值,t是表示要存放到的table在栈的位置,如果使用全局registey表来保存,那只需要填LUA_REGISTRYINDEX void (lua_rawgeti) (lua_State *L, int t, int n); 获取保存的lua值,调用完之后lua值就存放到栈顶了, t是表示要存...
索引:LUA_REGISTRYINDEX,官方解释: Lua provides a registry, a pre-defined table that can be used by any C code to store whatever Lua value it needs to store. This table is always located at pseudo-index LUA_REGISTRYINDEX. Any C library can store data into this table, but it should take ...
L传入luaState的指针,index传入LUA_REGISTRYINDEX,n传入上一个函数返回的整数key。作用是把注册表里的key对应的值压栈。 最后是释放该值: void luaL_unref (lua_State *L, int t, int ref) L传入luaState的指针,t传入LUA_REGISTRYINDEX,ref传入luaL_ref返回的整数key。 需要注意的是LUA_REGISTRYINDEX在c端和c#...
lua registry是一个全局的Table,它只能被C代码访问,通常可以用它来保存需要在几个模块中共享的数据.lua registry总是位于一个伪索引值LUA_REGISTRYINDEX之上. AI检测代码解析 int ref=luaL_ref(L,LUA_REGISTRYINDEX)//将栈顶元素存入lua registry中并返回在lua registry中的索引 lua_rawgeti(L,LUA_REGISTRYINDEX,ref...
注册表由伪索引 LUA_REGISTRYINDEX(-1001000)来定位,伪索引就像是栈中的一个索引,但它所关联的值不在栈中。在 lua 源码中,我们可以看到如何访问注册表的: staticTValue *index2addr(lua_State *L,intidx){ CallInfo *ci = L->ci; if(idx >0) {// 索引是正数,在栈上 ...
LUA_REGISTRYINDEX 是Lua 中一个特殊的伪索引,用于访问注册表。注册表是一个预定义的表,用于存储所有全局变量、元表、函数等。使用 luaL_ref 可以将栈顶元素存储到注册表中,并返回一个唯一的引用索引。使用 lua_rawgeti 可以根据引用索引从注册表中检索数据。使用 luaL_unref 可以释放不再需要的引用,以便避免内存泄...
by_lua等阶段中,openresty创建一个新的协程,通过lua_resume执行lua代码 二者的区别在于能否执行n ...
这个表可以用有效伪索引 LUA_REGISTRYINDEX 来定位。 任何 C 库都可以在这张表里保存数据, 为了防止冲突,你需要特别小心的选择键名。 一般的用法是,你可以用一个包含你的库名的字符串做为键名, 或者取你自己 C 对象的地址,以轻量用户数据的形式做键, 还可以用你的代码创建出来的任意 Lua 对象做键。 关于...
其实Registry本身就是一个table,只是这个table的访问方式比较特别,需要通过一个特殊的索引子 LUA_REGISTRYINDEX 来访问。其他的操作就和一个table没有两样,这是从C API的角度看过。如果是从lua的角度看的话,Registry是完全不可见的。也就是说lua代码无法访问到registry表中的任何内容。这样做的目的,是在于防止lua...
(L,LUA_REGISTRYINDEX,classMetaTableKey);// Stack: cl -> _R[classMetaTableKey] = cl// Namespace bind static class do not need "__call" methodif(needMetaCallMethod){lua_pushliteral(L,"__call");// Stack: cl, "__call"lua_pushlightuserdata(L,(void*)&cls);// Stack: cl, "__call...