EN为什么lua_pushcclosure不能工作?企业架构是个有30多年历史的技术领域,一贯给人“高深莫测”、“口...
C中通过lua_pushclosure创建闭包函数,在将闭包函数推到堆栈之前需要先把n个上值推到lua_state上。取用的时使用lua_upvalueindex(n)取的特定索引上的上值,更改的话可以使用lua_replace更改上值。例子中每次将上值+5,因此在lua中每次调用upvalue_test函数都会获得正确的上值。lua中的closure想在C中进行upvalue的更改...
void lua_pushdirectclosure(Func fn, lua_State *L, int nUpvalue) { //伪代码,向L存储函数指针 save_pointer(L); //向lua提供我们的register_proxy函数 lua_pushcclosure(L, register_proxy, nUpvalue + 1); } 再定义相关的注册宏: #define lua_register_directclosure(L, func) \ lua_pushstring(L...
向lua中注册c函数的过程是通过lua_pushcclosure(L, f, n)函数实现的 流程: 1. 创建一个 sizeof(CClosure) + (n - 1) * sizeof(TValue)大小的内存, 这段内存是 CClosure + TValue[n], 并做gc簿记[这点太重要了, 为什么lua要控制自己世界中的所有变量, 就是因为它要做gc簿记来管理内存], isC= ...
把Lua调用C相关的Lua API通过DllImport到C#,比如lua_pushcfunction [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)] public static extern void lua_pushcclosure(IntPtr l, IntPtr f, int nup); public static void lua_pushcclosure(IntPtr l, LuaCSFunction f, int nup) { IntPtr fn =...
lua_pushcclosure函数会先创建一个CClosure结构,然后把提前push到栈顶的n个元素作为upvalue,将其引用存储在CClosure的upvalue数组中。 可见在堆栈调用这一方面来看,CClosure和LClosure没有什么区别。二者的最大区别,在于LClosure是需要去解析lua文件来得到upvalue以及字节码等信息,在执行时需要去根据opcode来执行;而CClos...
向lua中注册c函数的过程是通过lua_pushcclosure(L, f, n)函数实现的 流程: 1. 创建一个 sizeof(CClosure) + (n - 1) * sizeof(TValue)大小的内存, 这段内存是 CClosure + TValue[n], 并做gc簿记[这点太重要了, 为什么lua要控制自己世界中的所有变量, 就是因为它要做gc簿记来管理内存], isC=...
你所做的就是:创建一个包含所有你想要的lua_*调用的c函数,例如loadfile和dofile。你使用lua_cpcall或lua_pushcclosure和lua_pcall调用这个函数。这使你能够检测是否在你传递给cpcall的函数中出现错误。 示例: ``` function hello() { string hello_ = "Hello Lua!"; struct C { static int call(lua_Stat...
lua_pushstring(L,l->name); for(i=0;i<nup;i++)/* copy upvalues to the top */ lua_pushvalue(L,-(nup+1)); lua_pushcclosure(L,l->func,nup);/* closure with those upvalues */ lua_settable(L,-(nup+3)); } lua_pop(L,nup);/* remove upvalues */ ...
lua_pushstring 压入string,长度信息自己算。 lua_pushvfstring 压入格式化变参的string。 lua_pushfstring 压入格式化变参的string,与上面的并没什么区别,只不过上面的是为了兼用上层调用的变参(详情请搜索va_list)。 lua_pushcclosure 压入c方法,并根据栈上的参数创建闭包。