思路:
目录:
1、虚拟机对象
(1)执行状态机
(2)全局状态机
2、执行状态机的数据栈和调用栈
(1) 数据栈
(2)调用栈
本文内容:
1、lua_state线程对象
(1)lua_state的上下文数据
从 C 层面看待 lua ,lua 的虚拟机对象就是一个lua_state 。 但实际上,真正的 lua虚拟机对象被隐藏起来了。那就是 lstate.h 中定义的结构体 global_State。同一 lua 虚拟机中的所有执行线程,共享了一块全局数据 global_state 。
lua_state 是暴露给用户的数据类型,既表示一个 lua 程序的执行状态,也指代 lua 的一个线程(在官方文档中)。每个线程拥有独立的数据栈以及函数调用栈,还有独立的调试钩子和错误处理设置。所以我们不应当简单的把lua_state 看成一个静态的数据集,它是一个lua 线程的执行状态。所有的lua C API 都是围绕这个状态机:
或把数据压入堆栈,或取出,或执行栈顶的函数,或继续上次被中断的执行过程。
源代码lua5.14版 lstate.h(100行)
lua_State是围绕程序如何执行来设计的,数据栈和调用栈都在其中。
其中:
lua_State 中放的是 lua 虚拟机中的环境表、注册表、运行堆栈、虚拟机的上下文等数据。
从一个主线程(特指 lua 虚拟机中的线程,即 coroutine)中创建出来的新的 lua_State 会共享大部分数据,但会拥有一个独立的运行堆栈。所以一个线程对象拥有一个lua_State。
(ps:lua 的coroutine的使用参考: http://blog.csdn.net/wusheng520/article/details/7954666)
lua_State共享的数据部分是全局状态机(包含GC的数据).lua_State 的运行堆栈为调用栈,lua_State 的数据栈包含当前调用栈信息。
目录:
1、虚拟机对象
(1)执行状态机
(2)全局状态机
2、执行状态机的数据栈和调用栈
(1) 数据栈
(2)调用栈
本文内容:
1、lua_state线程对象
(1)lua_state的上下文数据
从 C 层面看待 lua ,lua 的虚拟机对象就是一个lua_state 。 但实际上,真正的 lua虚拟机对象被隐藏起来了。那就是 lstate.h 中定义的结构体 global_State。同一 lua 虚拟机中的所有执行线程,共享了一块全局数据 global_state 。
lua_state 是暴露给用户的数据类型,既表示一个 lua 程序的执行状态,也指代 lua 的一个线程(在官方文档中)。每个线程拥有独立的数据栈以及函数调用栈,还有独立的调试钩子和错误处理设置。所以我们不应当简单的把lua_state 看成一个静态的数据集,它是一个lua 线程的执行状态。所有的lua C API 都是围绕这个状态机:
或把数据压入堆栈,或取出,或执行栈顶的函数,或继续上次被中断的执行过程。
源代码lua5.14版 lstate.h(100行)
struct lua_State {
CommonHeader;
lu_byte status;
StkId top; /* first free slot in the stack */
StkId base; /* base of current function */
global_State *l_G;
CallInfo *ci; /* call info for current function */
const Instruction *savedpc; /* `savedpc' of current function */
StkId stack_last; /* last free slot in the stack */
StkId stack; /* stack base */
CallInfo *end_ci; /* points after end of ci array*/
CallInfo *base_ci; /* array of CallInfo's */
int stacksize;
int size_ci; /* size of array `base_ci' */
unsigned short nCcalls; /* number of nested C calls */
unsigned short baseCcalls; /* nested C calls when resuming coroutine */
lu_byte hookmask;
lu_byte allowhook;
int basehookcount;
int hookcount;
lua_Hook hook;
TValue l_gt; /* table of globals */
TValue env; /* temporary place for environments */
GCObject *openupval; /* list of open upvalues in this stack */
GCObject *gclist;
struct lua_longjmp *errorJmp; /* current error recover point */
ptrdiff_t errfunc; /* current error handling function (stack index) */
};
lua_State是围绕程序如何执行来设计的,数据栈和调用栈都在其中。
其中:
/*
** Common Header for all collectable objects (in macro form, to be
** included in other objects)
*/
#