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; /* 指令表 */