2011-01-10 4 views
1

Je suis en train de développer une application Java qui utilise Kahlua pour les scripts Lua intégrés. Après avoir appelé beaucoup de fonctions, il se bloque toujours avec un débordement de pile ... y a-t-il quelque chose que je dois faire pour supprimer les trames d'appel inutilisées de la pile?Lua Stack Overflow

+3

S'il vous plaît donner plus d'informations, nous ne pouvons pas répondre à cela. – orlp

+0

Je suis désolé que vous ayez eu du mal à comprendre. J'utilise mon propre système d'événements. Les scripts peuvent utiliser la fonction globale link() pour ajouter un hook. Lorsqu'un événement doit être appelé, le programme passe par toutes les fonctions Lua qui lui sont liées et les appelle en utilisant les arguments appropriés. Cependant, après avoir appelé trop d'événements, la bibliothèque Lua (pas Java) se plaint du débordement de la pile. – phpscriptcoder

+1

Pourquoi cette question est-elle étiquetée luaj s'il s'agit de Kahlua? – PhiLho

Répondre

2

Dans Lua standard, vous pouvez utiliser la fonction lua_pop pour supprimer des éléments de la pile Lua. Voir this answer pour des conseils sur cette utilisation.

Si vous appelez votre code à plusieurs reprises, la meilleure chose à faire est de stocker la hauteur de la pile avant le traitement et la restaurer après:

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

Maintenant, je ne suis pas sûr de savoir comment y parvenir à Kahlua. Mais dans la source, je vois LuaCallFrame.getTop() et LuaCallFrame.setTop() donc le code devrait être similaire.

1

Vous devez vous assurer que vous revenez de chaque appel de méthode. Par exemple:

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

Une façon de rendre la pile ne sauter est de faire quelque chose comme ceci:

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

De cette façon, tous les appels de retour en arrière au niveau de base.

+0

Je parle d'un dépassement de pile Lua, pas d'un Java. – phpscriptcoder

+0

même s'applique à Lua de toute façon. – daurnimator

0

Essayez d'utiliser la queue des appels où vous pouvez, ils ne prennent pas une fente de la pile:

function foo () 
    return bar() 
end 
+0

Mon problème n'est pas qu'un script utilise trop d'emplacements de pile, mais que le même code remplit la pile s'il est répété. Tout ce que j'ai besoin de savoir, c'est comment supprimer les appels de la pile après que j'en ai fini avec eux. – phpscriptcoder

2

Si vous utilisez correctement le framework Kahlua, la pile doit automatiquement être nettoyée lors du retour d'une fonction. Si ce n'est pas le cas, vous avez trouvé un bug, et j'aimerais beaucoup avoir un rapport de bogue dessus :)

Le mieux serait un (presque) testcase minimal qui expose le problème.

Questions connexes