当C 函数被创建出来,我们有可能会把一些值关联在一起,也就是创建一个 C closure ;这些被关联起来的值被叫做 upvalue ,它们可以在函数被调用的时候访问的到。(参见 lua_pushcclosure)。 无论何时去调用 C 函数,函数的 upvalue 都被放在指定的伪索引处。我们可以用 lua_upvalueindex 这个宏来生
4. 建议传递:int float double 5.频繁调用的函数,参数的数量要控制,无论是lua的pushint/checkint,还是c到c#的参数传递,参数转换都是最主要的消耗,而且是逐个参数进行的,因此,lua调用c#的性能,除了跟参数类型相关外,也跟参数个数有很大关系。 6.优先使用static函数导出,减少使用成员方法导出 7.合理利用out关键字...
tolua源码分析(三) LuaTable.ToArray 类似地,该方法的实现,就是在C#层,调用lua的lua_objlen函数,得到当前table的长度,然后在C#层对该table进行遍历,把结果塞到C#的数组中: public object[] ToArray() { int oldTop = luaState.LuaGetTop(); try { luaState.Push(this); int len = luaState.LuaObjLen(...
Stack: cl, "__tostring", cls_p -> +1lua_pushcclosure(L,ClassContentTableToString,1);// Stack: cl, "__tostring", l_class_content_table_tostringlua_rawset(L,-3);// Stack: cl// Bind class table to registry tablelua_pushvalue(L,-1);// Stack: cl, cllua_rawsetp(L,LUA_REGISTRYIN...
通过luaF_newCclosure生成一个新的C闭包,实际应用中一般用lua_pushcclosure向栈顶压入一个新的C闭包,同时栈顶要装备好upvalue。函数实现如下:// 生成一个C闭包并压入栈顶, n表示当前栈顶有多少个upvalue要与闭包关联LUA_APIvoidlua_pushcclosure(lua_State*L,lua_CFunction fn,int n){lua_lock(L);if(n...
Rect g_rc;/*** 测试代码 ***/lua_settop(L,0);//把栈上所有元素移除lua_pushnil(L);//把nil压栈lua_pushboolean(L,1);//把布尔值true压栈lua_pushinteger(L,35);//把整型数35压栈lua_pushnumber(L,12.8);//把浮点数12.8压栈lua_pushcfunction(L,Square);//把c函数Square压栈lua_pushlight...
luaL_pushcfunction(L, &add_op); // 将要被调用的函数add_op入栈 luaL_pushinteger(L, 1); // 参数入栈 luaL_pushinteger(L, 1); luaL_pcall(L, 2, 1); // 调用add_op函数,并将结果push到栈中 int result = luaL_tointeger(L, -1); // 完成函数调用,栈顶就是add_op放入的结果 ...
3.3 Array(数组)对象 js: 方法 描述 concat() 连接两个或更多的数组,并返回结果。 join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 pop() 删除并返回数组的最后一个元素 push() 向数组的末尾添加一个或更多元素,并返回新的长度 ...
29 char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); 30 s++; /* skip '%' */ 31 s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */ 32 reslen = strftime(buff, SIZETIMEFMT, cc, stm); 33 luaL_addsize(&b, reslen); 34 } 35 } 36 luaL_pushresult...
tolua_pushusertype(m_pLua,scriptValue.data.ptr,"CPlayer"); } else { lua_pushnil(m_pLua);//压入空指针 } } if(!results)//不需要返回值 { int err = lua_pcall(m_pLua,args_count,0,0);//调用lua函数 if(err) { const char* result = lua_tostring(m_pLua, -1); ...