lua源码阅读(5)-lua_State
来源:互联网 发布:美国手机直播软件 编辑:程序博客网 时间:2024/05/16 05:57
在C语言中编写的脚本解释器运行lua是,首先是要创建lua_Stat结构体。lua_State中管理了一个数组,可以视为lua虚拟机的"寄存器"。在Lstat.h中
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 */ //函数调用前,记录上一个函数的pc位置 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) */};
typedef struct CallInfo { StkId base; /* base for this function */ StkId func; /* function index in the stack */ StkIdtop; /* top for this function */ const Instruction *savedpc; int nresults; /* expected number of results from this function */ int tailcalls; /* number of tail calls lost under this entry */} CallInfo;CallInfo描述了一个函数调用时使用寄存器的信息。因为许多函数调用都是共用同一个lua_State的,需要对位置进行记录。lua_State中,指针stack指向一个数组,就是所谓的寄存器。整个lua_State结构大概如下:
调用一个函数的时候,函数也是一个变量,存放在func位置,之后是参数,这些信息由一个调callinfo记录。在Lstate.h中,还有一个global_state的结构体
typedef struct global_State {//字符串hash表 stringtable strt; /* hash table for strings *///内存分配函数 lua_Alloc frealloc; /* function to reallocate memory */ void *ud; /* auxiliary data to `frealloc' */ lu_byte currentwhite; lu_byte gcstate; /* state of garbage collector */ int sweepstrgc; /* position of sweep in `strt' */ GCObject *rootgc; /* list of all collectable objects */ GCObject **sweepgc; /* position of sweep in `rootgc' */ GCObject *gray; /* list of gray objects */ GCObject *grayagain; /* list of objects to be traversed atomically */ GCObject *weak; /* list of weak tables (to be cleared) */ GCObject *tmudata; /* last element of list of userdata to be GC */ Mbuffer buff; /* temporary buffer for string concatentation */ lu_mem GCthreshold; lu_mem totalbytes; /* number of bytes currently allocated */ lu_mem estimate; /* an estimate of number of bytes actually in use */ lu_mem gcdept; /* how much GC is `behind schedule' */ int gcpause; /* size of pause between successive GCs */ int gcstepmul; /* GC `granularity' */ lua_CFunction panic; /* to be called in unprotected errors */ TValue l_registry; struct lua_State *mainthread; UpVal uvhead; /* head of double-linked list of all open upvalues */ struct Table *mt[NUM_TAGS]; /* metatables for basic types */ TString *tmname[TM_N]; /* array with tag-method names */} global_State;该结构体中有字符串hash表,内存分配函数,还有许多与gc有关的部分,暂不研究。每一个lua_State中都有一个指向blobal_State的指针。在创建lua_State的时候,也会创建global_State,在创建协程的时候,只会创建lua_State,所以,如果加入协程的话,lua_State的结构如下
lua_State提供了执行lua代码的环境,global_State管理内存。
阅读全文
0 0
- lua源码阅读(5)-lua_State
- lua 源码分析之线程对象lua_State
- Lua 5.3 源码分析(四)线程 lua_State
- 阅读Lua源码
- 阅读lua源码顺序
- lua_state
- Lua数据结构 — lua_State(六)
- Lua数据结构 — lua_State(六)
- lua源码阅读(2)---数据类型
- lua源码阅读(3)----字符串
- lua源码阅读(4)---表
- lua源码阅读(6)-函数
- lua源码阅读(7)-指令
- lua源码阅读(8)-虚拟机
- [Lua源码阅读] 理解Lua的object
- LUA源码阅读之词法分析
- LUA 源码阅读笔记(一)
- lua源码阅读(1)----概览
- 【MAC】 curl : (1) Protocol https not supported or disabled in libcurl
- Uva 1339 Ancient Cipher 简单解读
- 递归的几种应用
- 微信隐藏代码整理
- Codeforces 864D Make a Permutation!
- lua源码阅读(5)-lua_State
- bzoj 4184: shallot 分治+线性基
- Android textview 代码中设置粗体效果
- 简约而不简单的Django新手图文教程
- java-nio之zero copy深入分析
- gradle buildTypes
- REST和RESTFUL的相关概念理解
- datagrid怎么使用
- MyBatis 配置2