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

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就更新。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值