Lua Stack溢出

时间:2011-01-10 23:03:51

标签: java lua

我正在开发一个使用Kahlua进行嵌入式Lua脚本编写的Java应用程序。在调用了很多函数之后,它总是会因堆栈溢出而崩溃...我是否需要做些什么来从堆栈中删除未使用的调用帧?

4 个答案:

答案 0 :(得分:2)

在标准Lua中,您可以使用lua_pop函数从Lua堆栈中删除项目。有关此用法的提示,请参阅this answer

如果您反复调用代码,最简单的方法是在处理之前存储堆栈的高度,然后将其恢复:

int top = lua_gettop(L);
... /* some processing involving the stack*/
lua_settop(L, top);

现在,我不知道如何在Kahlua实现这一目标。但在源代码中,我看到LuaCallFrame.getTop()LuaCallFrame.setTop(),因此代码应该类似。

答案 1 :(得分:2)

如果您正确使用Kahlua框架,则从函数返回时应自动清理堆栈。如果不是这样,你发现了一个错误,我非常想要一个错误报告:)

最好的(接近)最小的测试用例会暴露问题。

答案 2 :(得分:1)

您必须确保退出每个方法调用。例如:

...main(...){
    displayMenu();
}

void displayMenu(){
    System.out.println("1.Do A. \n2.Do B");
    int q = readInt;
    if (q==1){
      doA();
    }else{
      doB();
    }
}

void doA(){
  .....
  displayMenu()
}

void doB(){
  ....
  displayMenu();
}

使堆栈不被炸毁的方法是做这样的事情:

...main(...){
  while(true){displayMenu()};
}

void displayMenu(){
  System.out.println("1.Do A. \n2.Do B");
  int q = readInt;
  if (q==1){
    doA();
  }else{
    doB();
  }
}

void doA(){
  .....
}

void doB(){
  ....
}

这样所有的调用都会返回基级。

答案 3 :(得分:0)

尽可能尝试使用尾调用,它们不占用堆栈槽:

function foo ( )
    return bar()
end