Lua虚拟机中的数据结构与栈

来源 https://blog.csdn.net/zry112233/article/details/80828327

由上一篇文章可知解释器分析Lua文件之后生成Proto结构体,最后到luaV_execute函数中依次取出指令来执行。

每个lua虚拟机对应一个lua_State结构体,它使用TValue数组来模拟栈,主要包括与栈相关的成员:

  • stack:栈数组的起始位置
  • base:当前函数栈的基地址
  • top:当前栈的下一个可用位置

这些成员的初始化操作在stack_init函数中完成。

lua_State里面存放的是一个Lua虚拟机的全局状态,当执行到一个函数时,需要有对应的数据结构来表示函数相关的信息,这个数据结构就是CallInfo,这个结构中同样有top、base这两个与栈相关的成员。

在lua_State 中,有一个base_ci的CallInfo数组,存储的就是CallInfo的信息。而另一个ci成员指向的就是当前函数的CallInfo指针。

在函数调用前会先调用luaD_precall函数,主要完成如下操作:

  1. 保存当前虚拟机执行的指令savedpc到当前CallInfo的savedpc中。用于后面调用完毕之后恢复执行
  2. 分别计算出待调用函数的base、top值,这些值的计算依赖于函数的参数数量
  3. 从lua_State的base_ci数组中分配一个新的CallInfo指针,存储前面两步计算出来的信息,切换到这个函数中准备调用

========== End

最新文章

  1. 【转】WiFi基础知识
  2. Java和C++的虚函数的异同
  3. 查找SQL SERVER被锁的表和解决方法
  4. 深入入门系列--Data Structure--04树
  5. GoLang之网络
  6. Data Mover Script Templates
  7. MAC终端配色Solarized
  8. 微信小程序开发1
  9. 【ZZ】如何选择适合自己项目的编程语言
  10. mysql的join
  11. Spring 3.x企业实用开发实战(1)
  12. hdoj 3549 Flow Problem(最大网络流)
  13. PHPStorm 安装 SASS、SCSS + Compass
  14. awk学习笔记二:调用shell、文件执行(转)
  15. 结构化CSS设计思维
  16. [高级软件工程教学]团队Beta阶段成绩汇总
  17. Ubuntu 14 安装Skype 4.3
  18. genymotion中app不能安装问题
  19. python学习06
  20. [Swift]LeetCode476. 数字的补数 | Number Complement

热门文章

  1. [Oracle]察看一张表的约束 和 察看一张表的索引
  2. [java]借助java.io.File类,完成文件批量改名
  3. SQL-W3School-高级:SQL DEFAULT 约束
  4. LocalDB数据库修改排序规则,修复汉字变问号
  5. 从零搭建配置Cuckoo Sandbox
  6. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_16.RabbitMQ研究-与springboot整合-生产者代码
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_25-前后端请求响应流程小结
  8. spark入门备忘---1
  9. Cobbler安装报错--dhcpd -t failed Exception occured: <class 'cobbler.cexceptions.CX'>
  10. 深入浅出的分析 Set集合