Lua和C的交互说明(函数)
来源:互联网 发布:淘宝folk老王是正品吗 编辑:程序博客网 时间:2024/05/16 15:14
创建一个空table,并将之压入堆栈。void lua_newtable(lua_State *L); --等价于lua_createtable(L,0,0);
返回栈顶元素的索引。因为索引是从1开始编号的,所以这个结果等于堆栈上的元素编号(因此返回0表示堆栈为空)。int lua_gettop(lua_State *L);
如果注册表中已经有key为tname的数据则返回0。否则创建一个新表作为userdata的metatable,并在注册表中注册它然后返回1。不过两种情况都会把注册表中tname相关的值压入堆栈。int luaL_newmetatable(lua_State *L,const char *tname);
查询堆栈上某个数据是否相关类型void *luaL_checkudata(lua_State *L,int narg,const char* tname);
把指针s指向的以零结尾的字符串压栈。Lua对这个字符串做一次内存拷贝(或是复用一个拷贝),因此s处的内存在函数返回后,可以释放掉或是重用于其它用途。字符串中不能包含有零字符;第一个碰到的零字符会认为是字符串的结束。void lua_pushstring(lua_State* L,const char *s);
同上,只是多了一个长度限制。void lua_pushlstring(lua_State *L,const char *s,size_t len);
把堆栈上给定有效处索引处的元素作为一个拷贝压栈。void lua_pushvalue(lua_State *L,int index);
作一个等价于t[k]=v的操作,这里t是一个给定有效索引index处的值,v指栈顶的值,而k是栈顶之下的那个值。这个函数会把键和值都从堆栈弹出。和在lua中一样,这个函数可能触发“newindex”事件的元方法。void lua_settable(lua_State *L,int index);
将一个C函数压入堆栈。这个函数接收一个C函数指针,并将一个类型为function的lua值压入堆栈。当这个栈定的值被调用时,将触发对应的C函数。lua_pushcfunction(lua_State *L,lua_CFunction f);
#define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
把一个table弹出堆栈,并将其设为给定索引处的值的metatable。int lua_setmetatable(lua_State *L,int index);
把一个新的C closure压入堆栈。void lua_pushcclosure(lua_State *L,lua_CFunction fn,int n)
这个函数分配一块指定大小的内存块,把内存块地址作为一个完整的userdata压入堆栈,并返回这个地址。void *lua_newuserdata(lua_State *L,size_t size);
如果给定索引处的值是一个完整的userdata,函数返回内存块的地址。如果是一个light userdata,那么就返回它表示的指针。否则,返回NULL。void *lua_touserdata(lua_State *L,int index);
2.注册一个key为T::className的metatable,并制定其中的一些成员,用于之后生成的userdata。lua_newtable();
int methods = lua_gettop(L);
lua_pushstring(L,T::className);
lua_pushvalue(L,methods);
lua_settable(L,LUA_GLOBALSINDEX);
3.为此表指定成员,每个成员的key为类的成员函数名,value为一个带有闭包的统一函数。比如tbClass[FunName]=thunk,之后可以根据闭包得到具体是调用到哪个函数。闭包中有函数名和相应函数的组合结构(以lightuserdata的形式赋给闭包)。这些类成员函数参数必须包括lua_State,因为它需要的参数都会在lua堆栈中。//这个表用于userdata(T的对象)的metatable
luaL_newmetatable(L,T::className);
int metatable=lua_gettop(L);
//metatable["__index"] = tbClass
lua_pushliteral(L,"__index"); //1
lua_pushvalue(L,methods); //2
lua_settable(L,metatable); //3
lua_pushliteral(L,"__tostring"); ///1
lua_puchcfunction(L,tostring_T); ///2
lua_settable(L,metatable); ///3
lua_pushliteral(L,"__gc"); ////1
lua_pushcfunction(L,gc_T); ////2
lua_settable(L,metatable); ////3
4.创建C对象给脚本使用b=Account.new(Account,30);new 是tbClass下的一个函数(另外指定的,不会掉到thunk,这一句会调用到C的一个函数,里面会生成一个C对象,然后创建一个userdata用于关联到这个新生成的C对象。最后为这个userdata绑定上我们上面注册为T::classname的metatable。因为定制了metatable的__index成员,所以当userdata找不到的成员会去调用__index,因为之前我们把__index绑定到tbClass,所以也会调用到tbClass的相应成员。//为tbClass填充成员函数
for(RegType *l=T::methods;l->name;l++)
{
lua_pushstring(L,l->name);
//把(函数名,函数地址)pair以lightuserdata的形式作为C closure的upvalue入栈
lua_pushlightuserdata(L,(void*)l);
//把一个新的C closure压入堆栈。为upvalue的个数,并指定回调函数统一为thunk lua_pushcclosure(L,thunk,1);
//tbClass[FunName]=Function
lua_settable(L,methods);
}
5.当脚本中个指定函数被调用的时候,比如b:deposit(50.30)的时候,b是userdata,它的metatable的__index和tbClass绑定,所以会调用到tbClass的相应成员,就是之前关联的thunk:这个时候L的堆栈里面有这个函数的两个参数,一个是b本身,一个是50.30 。b是userdata,可以根据它取出对象的指针。另外函数被调用的时候,它相关的upvalue也可以取得到,有了对象指针和相应的函数,调用也不为难了,记住参数50.30是保存在堆栈中传给类的成员函数来取得//创建一个新的T对象,并创建一个基于userdataType的userdata,其中保护了指向T对象的指针
static int new_T(lua_State *L)
{
lua_remove(L,1); //use classname:new(),instead of classname.new()
T *obj = new T(L); //call constructor for T objects
userdataType *ud= static_cast<userdataType*>(lua_newuserdata(L,sizeof(userdataType)));
ud->pT=obj; //store pointer to object in userdata
luaL_getmetatable(L,T::className); //lookup metatable in Lua registry
lua_setmetatable(L,-2);
return 1; //userdata containing pointer to T object
}
static int thunk(lua_State *L)
{
//stack has userdata , followed by method args
T *obj=check(L,1); //the object pointer from the table at index 0
lua_remove(L,1); //remove self so member function args start at index 1
//get member function from upvalue
RegType *l=static_cast<RegType*>(lua_touserdata(L,lua_upvalueindex(1)));
return (obj->*(l->mfunc))(L); //call member function
}
- Lua和C的交互说明(函数)
- Lua和C的交互说明(函数)
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua和c的交互
- lua 与 c/c++ 交互(6) lua调用C++(使用数组 和字符串函数)
- lua于c的交互函数
- C和lua交互
- lua和C交互
- Lua和C语言的交互(一)
- UVA 10815
- 第二周项目3—体验复杂度
- Agile基础:Scrum的5个会议
- 读论文《relation classification via convolutional deep neural network》
- 修改启动logo,禁止光标
- Lua和C的交互说明(函数)
- Hdu 2546 饭卡(01背包)
- 简单博弈论—— URAL1087 取石子问题升级版
- Glide 方法介绍
- PYTHON自学笔记4之列表生成器
- Java字符串大小写转换
- 谈谈对Canal(增量数据订阅与消费)的理解
- 面向对象
- [309] Best Time to Buy and Sell Stock with Cooldown