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