Lua:来讲一下包装类在虚拟机内部的调用逻辑和userdata的存储对象

首先,感谢蒙哥让我能用上这么方便的一个lua框架-tolua

我想大家在使用tolua的时候,在做c#包装类(即wrap文件的时候),都会不由的感叹,原来lua和c#交互竟然那么简单,那么请问有谁真正的了解过这些wrap文件的原理,这些文件又是如何在虚拟机之中运行的呢,intptr这个类的作用又是什么,里面的topointer方法有没有想过之间隐藏的含义,那么我接下来会慢慢bb的。


阅读一下部分,请了解lua寄存器虚拟机的基础知识,不明白可以看我上一篇文章最前面部分关于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表里取得读取设置函数并调用。


传入c#对象的tolua函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c#对象push到lua堆 栈上时,才会新建userdata。tolua会以c#对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同 样的c#对象时,从这个表里取出userdata推入堆栈即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值