Lua Stack Overflow - PullRequest
       5

Lua Stack Overflow

1 голос
/ 11 января 2011

Я занимаюсь разработкой Java-приложения, которое использует Kahlua для встроенных сценариев Lua.После вызова большого количества функций всегда происходит сбой с переполнением стека ... Что мне нужно сделать, чтобы удалить неиспользуемые кадры вызова из стека?

Ответы [ 4 ]

2 голосов
/ 15 марта 2011

Если вы используете платформу Kahlua правильно, стек должен автоматически очищаться при возврате из функции.Если это не так, вы нашли ошибку, и мне очень хотелось бы сообщить об ошибке:)

Лучше всего (почти) минимальный тестовый сценарий, который выявляет проблему.

2 голосов
/ 11 января 2011

В стандартном Lua вы можете использовать функцию lua_pop для удаления предметов из стека Lua.См. этот ответ для подсказок по этому использованию.

Если вы вызываете свой код несколько раз, проще всего сохранить высоту стека перед обработкой и восстановить ее после:1006 *

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

Теперь я не уверен, как этого добиться в Калуа.Но в источнике я вижу LuaCallFrame.getTop() и LuaCallFrame.setTop(), поэтому код должен быть похожим.

1 голос
/ 11 января 2011

Вы должны убедиться, что вы возвращаетесь из каждого вызова метода. Например:

...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 голосов
/ 11 января 2011

Попробуйте использовать хвостовые вызовы там, где это возможно, они не занимают слот стека:

function foo ( )
    return bar()
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...