接下来调用 lua_pushcclosure 来创建出 closure 并把这个 C 函数压到堆栈上。参数 n 告之函数有多少个值需要关联到函数上。 lua_pushcclosure 也会把这些值从栈上弹出。 eg. #define lua_register(l,n,f) (lua_pushcfunction(l,f), lua_setglobal(l,n)) #lua_pushcfunction(l,f) lua_pushcclosur...
lua_pushcclosure函数会先创建一个CClosure结构,然后把提前push到栈顶的n个元素作为upvalue,将其引用存储在CClosure的upvalue数组中。 可见在堆栈调用这一方面来看,CClosure和LClosure没有什么区别。二者的最大区别,在于LClosure是需要去解析lua文件来得到upvalue以及字节码等信息,在执行时需要去根据opcode来执行;而CClos...
C中通过lua_pushclosure创建闭包函数,在将闭包函数推到堆栈之前需要先把n个上值推到lua_state上。取用的时使用lua_upvalueindex(n)取的特定索引上的上值,更改的话可以使用lua_replace更改上值。例子中每次将上值+5,因此在lua中每次调用upvalue_test函数都会获得正确的上值。lua中的closure想在C中进行upvalue的更改...
原型:void lua_pushboolean (lua_State *L, int b); 解释:把 b 作为一个 boolean 值压入堆栈。 lua_pushcclosure## 原型:void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); 解释:把一个新的 C closure 压入堆栈。 lua_pushcfunction## 原型:void lua_pushcfunction (lua_State ...
TValue stack[max_stack_len] // 欲知内情可以查 lstate.c 的stack_init函数 存入栈的数据类型包括数值, 字符串, 指针, talbe, 闭包等, 下面是一个栈的例子: 执行下面的代码就可以让你的lua栈上呈现图中的情况 lua_pushcclosure(L, func, 0) // 创建并压入一个闭包 ...
void lua_pushnumber(lua_State *L, lua_Number n) lua_State *L:Lua状态对象,表示Lua虚拟机的运行实例。 lua_Number n:要压入栈的数字。 执行流程: 1、加载script脚本加载到lua虚拟机中 2、将脚本中的my_pow函数,压入到栈顶 3、压入my_pow需要的两个参数 4、执行脚本 5、获取脚本中的返回值 ...
向lua中注册c函数的过程是通过lua_pushcclosure(L, f, n)函数实现的 流程: 1. 创建一个 sizeof(CClosure) + (n - 1) * sizeof(TValue)大小的内存, 这段内存是 CClosure + TValue[n], 并做gc簿记[这点太重要了, 为什么lua要控制自己世界中的所有变量, 就是因为它要做gc簿记来管理内存], isC=...
lua_pushstring(l, "c_hello"); // 将函数地址压入LuaVM栈 lua_pushcclosure(l, &c_Hello, 0) // 把LuaVM栈上的这个表放入全局表中 lua_settable(l, LUA_GLOBALSINDEX) 1. 2. 3. 4. 此后在Lua中就可以这样调用: c_hello() 注:C函数的实现如果有参数的话最好为每一个参数进行类型检查 ...
在noita游戏目录\tools_modding\lua_api_documentation.txt文件中写有所有(应该)由cpp声明给lua的函数。 因为是在cpp中定义的,这导致一般来讲我们无法获得其实现。 但是可以通过对游戏文件Noita.exe进行逆向分析(这里使用的是ida),查找可能的实现代码。 在lua与cpp交互中,Nolla选择了使用lua_pushcclosure和lua_setfie...
lua_pushcclosure# [-n, +1, e] void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); 把一个新的 C 闭包压栈。 当创建了一个 C 函数后, 你可以给它关联一些值, 这就是在创建一个 C 闭包(参见 §4.4); 接下来无论函数何时被调用,这些值都可以被这个函数访问到。 为了将一些值...