lua函数栈的base和top会冲突吗?

来源:互联网 发布:加内特数据统计 编辑:程序博客网 时间:2024/05/17 08:58

lua虚拟机在运行指令的使用会使用诸如RA, RB, RC等宏来找变量的位置, 这三个宏分别以base为底,加上指令中的A,B, C操作数。 而我们平时用到的

void  (lua_pushnumber) (lua_State *L, lua_Number n); 这类函数是基于top的, 那么在push我们的数据时,会不会覆盖了一些正在使用的数据呢, base和top都指示栈上的位置,他们是如何避免冲突的呢?

在一个lua函数被调用时luaD_precall被调用到了, luaD_precall把函数的L->base指向了函数在栈上后一个的位置, 而L->top 赋值了ci->top, ci->top为L->base + p->maxstacksize; 可以看出只要p->maxstacksize足够大, 不小于变量的个数,就不会冲突了。 搜索lua的代码,改动maxstacksize的函数luaK_checkstack就在为变量预定位置的函数luaK_reserveregs中被调用,

void luaK_checkstack (FuncState *fs, int n) {  int newstack = fs->freereg + n;  if (newstack > fs->f->maxstacksize) {    if (newstack >= MAXSTACK)      luaX_syntaxerror(fs->ls, "function or expression too complex");    fs->f->maxstacksize = cast_byte(newstack);  }}

在变量个数超过上次时,maxstacksize就更新。