【Lua 5.3源码】虚拟机指令分析(二)

1. Proto函数原型

任何一个函数,一个 lua 文件, 经过编译之后都会对应变成Lua的一个LClosure(闭包)对象,一个闭包包含一个函数原型(Proto)和一个upvalues列表。

typedef struct LClosure {
   
  ClosureHeader;
  struct Proto *p;
  UpVal *upvals[1];  /* list of upvalues */
} LClosure;

比较重要的就是生成的 Proto 这个数据结构, 这个结构的定义在 lobject.h 中。

/*
** Function Prototypes
*/
typedef struct Proto {
   
  CommonHeader;
  lu_byte numparams;  /* 固定参数个数 */
  lu_byte is_vararg;  /* 是否是可变参数列表 */
  lu_byte maxstacksize;  /* 这个函数最多需要寄存器的数量(就是函数栈) */
  int sizeupvalues;  /* upvalues的个数 */
  int sizek;  /* 常量的个数 */
  int sizecode; /* 指令的个数 */
  int sizelineinfo;  /* 字段表示当前函数所有的行总数目 */
  int sizep;  /* 定义的函数(proto)的个数 */
  int sizelocvars; /* 局部变量的个数 */
  int linedefined;  /* 定义的首行(Debug信息)  */
  int lastlinedefined;  /* 定义的尾行(Debug信息)  */
  TValue *k;  /* 常量表 */
  Instruction *code;  /* 指令表 */
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值