Lua5.3源码浅读
目录
阅读方式
- Lua大神们推荐的阅读次序列表
- 这次阅读目标是看下lua解析流程。具体的指令、状态等留待下次阅读。
从main开始
- 用lual_newstate定义了一个lua_State变量。
- 调用lua_pushcfunction将解析脚本主函数压入栈中。详见pmain解析脚本。
- 将命令行参数个数lua_pushinteger及参数lua_pushlightuserdata压入栈中,作为之前函数的参数。
- 执行压入的函数lua_pcall。
- 获取执行结果lua_toboolean及错误相信信息。
- lua_close关闭lua_State。
- 总结:其实main函数就是一个执行C函数的流程。
pmain解析脚本
- 解析命令行选项参数collectargs。
- 对于控制台交互式解析方式用doREPL函数来循环,对于文本lua源码,用handle_script来读取。
- 最终调用luaV_execute来解析执行。
- 返回结果。
内置类型别名
lu_byte
unsigned char
内部类型
CallInfo
lstate.h 函数调用信息,链表结构,包含了函数基地址,当前PC地址,函数返回值个数,函数参数栈信息。
GCObject
lobject.h 垃圾收集对象,是一个自嵌套的结构。lua中所有可被垃圾回收的结构均包含它。
TValuefields
lobject.h lua各种值的实际表现,由一个union+一个tag表示。
外部类型
lua_CFunction
lua.h lua可以调用的C函数形式。
typedef int (*lua_CFunction) (lua_State *L);
lua_Integer
lua.h 整数,32位机器为4字节,64位机器为8字节
lua_Number
lua.h 浮点数,32位机器为4字节,64位机器为8字节
lua_State
lstate.h lua堆栈,每个线程一个,主要包含了一个堆栈及其类型标志(整形、线程等)。还包含global_State指针,CallInfo,GCObject信息。
global_State
lstate.h 全局堆栈,所有线程共用一个
内部方法
index2addr
static TValue *index2addr (lua_State *L, int idx)
lapi.c 这个函数使用很频繁,主要是从CallInfo中的内获取参数。idx > 0,此栈底开始算;LUA_REGISTRYINDEX < idx < 0,从栈顶开始算;idx == LUA_REGISTRYINDEX 和 idx < LUA_REGISTRYINDEX 涉及到c方法,还没有看懂。
API
lua_close
lua.h 仅主线程调用。关闭主线程的lua_State,释放内存。
luaL_newstate
lauxlib.h 仅主线程调用。分配lua_State和global_State的内存。
lua_pcall
lua.h 执行lua_State中的C函数。
lua_pushcfunction
lua.h 将要执行的C函数压入栈中。
lua_pushinteger
lua.h 将int型数据压入栈中。
lua_pushlightuserdata
lua.h 将复杂类型数据压入栈中。
lua_toboolean
lua.h 从lua_State数据栈中取出bool型数据。