2011-01-10 687 views
1

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

+3

请提供更多信息,我们无法回答。 – orlp 2011-01-10 23:12:24

+0

我很抱歉,您无法理解。我正在使用我自己的事件系统;脚本可以使用link()全局函数来添加一个钩子。当需要调用事件时,程序会遍历所有链接到它的Lua函数,并使用适当的参数调用它们。但是,在调用太多事件之后,Lua库(不是Java)抱怨堆栈溢出。 – phpscriptcoder 2011-01-11 00:10:31

+1

为什么这个问题标签luaj如果它是关于卡鲁阿? – PhiLho 2012-10-23 11:42:36

回答

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

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

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

这样,所有的呼叫返回到基准水平。

0

尝试使用尾调用,你可以,他们不占用一个栈槽:

function foo () 
    return bar() 
end 
2

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

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