项目正在使用cocos2dx的lua绑定,绑定的方式是tolua++。对大规模使用lua代码信心不是很足,花了一些时间阅读tolua++的代码,希望对绑定实现的了解,有助于项目对lua代码的把控。从阅读结果上来看,起码在内存管理上,帮助还是很大的。
1.tolua++如何将c++对象导入到lua里
tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是c++对象的地址。userdata的metatable,是一个tolua++建立的,记录了userdata对应c++类型信息的表格,包括导出的成员变量、成员函数等信息。
对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的__index和__newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
对于成员函数的调用,只需要以函数名为键,函数为值,存储在metatable里就好了。
传入c++对象的tolua++函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c++对象push到lua堆栈上时,才会新建userdata。tolua++会以c++对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同样的c++对象时,从这个表里取出userdata推