2011-01-10 6 views
1

私はKahluaを組み込みのLuaスクリプトに使用するJavaアプリケーションを開発しています。多くの関数を呼び出した後、スタックオーバーフローで常にクラッシュします...スタックから未使用のコールフレームを削除するために必要なことはありますか?Luaのスタックオーバーフロー

+3

詳細については、私たちはこれに答えることはできません。 – orlp

+0

ご理解にご迷惑をおかけして申し訳ありません。私は自分のイベントシステムを使用しています。スクリプトはlink()グローバル関数を使用してフックを追加できます。イベントを呼び出す必要がある場合、プログラムはそれにリンクされているすべてのLua関数を調べ、適切な引数を使用して呼び出します。しかし、あまりにも多くのイベントを呼び出した後、Luaライブラリ(Javaではなく)はスタックのオーバーフローについて不平を言っています。 – phpscriptcoder

+1

Kahluaについてのこの質問にはなぜluajが付いていますか? – PhiLho

答えて

2

を、あなたはLuaのスタックから項目を削除するlua_pop機能を使用することができます。この使用に関するヒントについては、this answerを参照してください。

あなたが繰り返しあなたのコードを呼び出している場合は、一番簡単な方法は、処理の前に、スタックの高さを保存し、後でそれを復元です:

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

今、私はこれを達成するかどうかはわかりませんカールーアでしかし、ソースで私はLuaCallFrame.getTop()LuaCallFrame.setTop()を参照するので、コードは似ているはずです。

1

すべてのメソッド呼び出しから必ず戻ります。たとえば:すべてのコールバックベースレベルに戻る

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

スタックが爆破ないようにする方法は、このような何かを行うことです。

+0

私は、Javaのものではなく、Luaスタックのオーバーフローについて話しています。 – phpscriptcoder

+0

とにかく同じことがluaに適用されます。 – daurnimator

0

試してみて、彼らはスタックスロットを占有していないあなたが、できる末尾再帰を使用:標準のLuaで

function foo () 
    return bar() 
end 
+0

私の問題は、スクリプトが多すぎるスタックスロットを使用するのではなく、繰り返し実行すると同じコードがスタックをいっぱいにすることです。私が知る必要があるのは、コールをスタックから削除する方法です。 – phpscriptcoder

2

Kahluaフレームワークを正しく使用している場合、関数から戻るとスタックは自動的にクリーンアップされます。これがそうでない場合は、バグを見つけました。バグレポートが非常に好きです:)

問題を明らかにする最小限のテストケースです。