Lua5.3源码浅读

Feb 5, 2016


Lua5.3源码浅读

目录


阅读方式

  • Lua大神们推荐的阅读次序列表
  • 这次阅读目标是看下lua解析流程。具体的指令、状态等留待下次阅读。

从main开始


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指针,CallInfoGCObject信息。

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_Stateglobal_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型数据。