这是从lua-5.1.1中分离出来的lua_State实现代码。
Last active
May 29, 2021 01:46
-
-
Save losophy/08c1650be112a687df424d7e6eea0451 to your computer and use it in GitHub Desktop.
lua-5.1.1中的lua_State的实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void stack_init (lua_State *L1, lua_State *L) { | |
/* initialize CallInfo array */ | |
L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); | |
L1->ci = L1->base_ci; | |
L1->size_ci = BASIC_CI_SIZE; | |
L1->end_ci = L1->base_ci + L1->size_ci - 1; | |
/* initialize stack array */ | |
L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); | |
L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; | |
L1->top = L1->stack; | |
L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; | |
/* initialize first ci */ | |
L1->ci->func = L1->top; | |
setnilvalue(L1->top++); /* `function' entry for this `ci' */ | |
L1->base = L1->ci->base = L1->top; | |
L1->ci->top = L1->top + LUA_MINSTACK; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
** `per thread' state | |
*/ | |
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 */ | |
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) */ | |
}; | |
/* | |
** informations about a call | |
*/ | |
typedef struct CallInfo { | |
StkId base; /* base for this function */ | |
StkId func; /* function index in the stack */ | |
StkId top; /* 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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment