Java Lua堆栈溢出

Java Lua堆栈溢出,java,lua,Java,Lua,我正在开发一个Java应用程序,它使用Kahlua来编写嵌入式Lua脚本。在调用了很多函数之后,它总是会崩溃,导致堆栈溢出。。。是否需要执行一些操作来从堆栈中删除未使用的调用帧?您必须确保从每个方法调用中返回。例如: ...main(...){ displayMenu(); } void displayMenu(){ System.out.println("1.Do A. \n2.Do B"); int q = readInt; if (q==1){

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

您必须确保从每个方法调用中返回。例如:

...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(){
  ....
}

这样,所有调用都返回到基本级别。

您必须确保从每个方法调用中返回。例如:

...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(){
  ....
}

这样,所有调用都会返回到基本级别。

尽可能使用尾部调用,它们不会占用堆栈插槽:

function foo ( )
    return bar()
end

尽量使用尾部调用,它们不会占用堆栈插槽:

function foo ( )
    return bar()
end

在标准Lua中,可以使用
Lua\u pop
函数从Lua堆栈中删除项。有关此用法的提示,请参阅

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

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

现在,我不知道如何在卡鲁亚实现这一点。但是在源代码中,我看到了
LuaCallFrame.getTop()
LuaCallFrame.setTop()
,因此代码应该类似。

在标准Lua中,可以使用
Lua\u pop
函数从Lua堆栈中删除项。有关此用法的提示,请参阅

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

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

现在,我不知道如何在卡鲁亚实现这一点。但是在源代码中,我看到了
LuaCallFrame.getTop()
LuaCallFrame.setTop()
,因此代码应该是类似的。

如果您正确使用了Kahlua框架,那么从函数返回时堆栈应该自动清理。如果不是这样,您已经发现了一个bug,我非常希望有一个关于它的bug报告:)


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

如果您正确使用Kahlua框架,则从函数返回时堆栈应自动清理。如果不是这样,您已经发现了一个bug,我非常希望有一个关于它的bug报告:)


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

请提供更多信息,我们无法回答此问题。很抱歉,您在理解上有困难。我使用自己的活动系统;脚本可以使用link()全局函数添加钩子。当需要调用某个事件时,程序将遍历链接到它的所有Lua函数,并使用适当的参数调用它们。但是,在调用太多事件后,Lua库(不是Java)抱怨堆栈溢出。如果是关于Kahlua的问题,为什么这个问题被标记为luaj?请提供更多信息,我们无法回答。很抱歉,您在理解上有困难。我使用自己的活动系统;脚本可以使用link()全局函数添加钩子。当需要调用某个事件时,程序将遍历链接到它的所有Lua函数,并使用适当的参数调用它们。但是,在调用太多事件后,Lua库(不是Java)抱怨堆栈溢出。如果是关于Kahlua,为什么这个问题被标记为luaj?我说的是Lua堆栈溢出,不是Java堆栈溢出。我说的是Lua堆栈溢出,不是Java堆栈溢出。我的问题不是脚本使用了太多堆栈槽,但如果重复运行,相同的代码会填满堆栈。我所需要知道的只是如何在完成调用后从堆栈中删除它们。我的问题不是脚本使用了太多的堆栈插槽,而是如果重复运行,相同的代码会填满堆栈。我所需要知道的就是如何在完成调用后从堆栈中删除它们。