lua源码剖析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
lua源码剖析 先来看lua中值的表示方式。? Java代码?? #define?TValuefields?Value?value;?int?tt?? ?? typedef?struct?lua_TValue?{?? ??TValuefields;?? }?TValue;?? 其中tt表示类型,value也就是lua中对象的表示。? Java代码?? typedef?union?{?? ??GCObject?*gc;?? ??void?*p;?? ??lua_Number?n;?? ??int?b;?? }?Value;?? gc用于表示需要垃圾回收的一些值,比如string,table等等。? p用于表示 light userdata它是不会被gc的。? n表示double? b表示boolean? tvalue这样表示会有空间的浪费.可是由于要完全符合c99,因此只能这么做.否则我们为了效率可以这么做.由于在大多数机器上,指针都是严格对齐(4或者8字节对齐).因此后面的2,3位就是0,因此我们可以将类型存储在这几位,从而极大地压缩了Value的大小.? 更新:这里经的老朱同学的提醒,其实tvalue之所以不使用指针的后几位来存储类型,更重要的时候由于和c的交互.因为那样的话,我们就必须强制和lua交互的c模块也必须保持和我们一样的内存模型了.? lua_state表示一个lua虚拟机,它是per-thread的,也就是一个协程(多个和lua交互的c程序,那自然也会有多个lua-state)一个lua_state,然后来看它的几个比较重要的域。? StkId top这个域表示在这个栈上的第一个空闲的slot。? StkId base 这个域表示当前所在函数的base。这个base可以说就是栈底。只不过是当前函数的。? StkId stack_last 在栈上的最后一个空闲的slot? StkId stack? 栈的base,这个是整个栈的栈底。? StkId是一个Tvalue类型的指针。? 在 lstrlib中,基本上所有的str函数都是首先调用luaL_checklstring来得到所需要处理的字符串然后再进行处理。如果是需要改变字符串的话,那么都会首先生成一个luaL_Buffer对象(主要原因是在lua中,都会做一个传递进来的字符串的副本的),然后最终将处理的结果通过调用luaL_pushXXX放到栈中。? luaL_checklstring 函数,这个函数只是简单的对lua_tolstring进行了一层简单的封装。而luaL_tolstring也是对index2adr函数做了一层简单封装,然后判断所得到的值是否为字符串,是的话返回字符串,并修改len为字符串长度。? Java代码?? LUALIB_API?const?char?*luaL_checklstring?(lua_State?*L,?int?narg,?size_t?*len)?{?? ///通过luaL_tolstring得到字符串s?? ??const?char?*s?=?lua_tolstring(L,?narg,?len);?? ??if?(!s)?tag_error(L,?narg,?LUA_TSTRING);?? ??return?s;?? }?? 因此我们详细来看index2adr这个函数,这个函数目的很简单,就是通过索引得到对应的值的指针。第一个参数lua_state,第二个参数为索引值。? 我们首先要知道在lua中,索引值可以为负数也可以为正数,当为负数的话,top为-1,当为正数第一个压入栈的元素为1,依此类推.? 而且有些类型的对象当转换时还需要一些特殊处理,比如闭包中的变量。? 除去特殊的,一般的存取很简单,当index0则我们只需要用base+i -1来取得这个指针,为什么要用base而不是top呢,我们上面已经说过了,当index为正数,所取得的是第一个值,因此也就是栈的最下面那个值,而 base表示当前函数在栈里面的位置,因此我们加上i -1 就可以了。当index0则更简单,我们用top+index就可以了。? Java代码?? static?TValue?*index2adr?(lua_State?*L,?int?idx)?{?? ??if?(idx??0)?{?? ///索引为正值时,通过base取得value?? ????TValue?*o?=?L-base?+?(idx?-?1);?? ????api_check(L,?idx?=?L-ci-top?-?L-base);?? ///如果超过top,则返回nil,否则返回o。?? ????if?(o?=?L-top)?return?ca

文档评论(0)

tcpe + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档