как мне очистить мой стек состояния lua? - PullRequest
5 голосов
/ 19 февраля 2010

Я использую lua C-API для чтения данных конфигурации, которые хранятся в файле lua.

У меня есть хорошая маленькая таблица в файле, и я написал C-функцию запроса, которая анализирует определенное поле в таблице. (ура это работает!)

Он работает, вызывая несколько таких функций снова и снова:

... 
lua_getglobal (...); 
lua_pushinteger (...); 
lua_gettable (...); 
lua_pushstring (...); 
lua_gettable (...); 
lua_lua_getfield (...);
...

Вы поняли.

После того, как я закончу запрашивать мои данные, как это, я должен очистить стек?

Ответы [ 3 ]

6 голосов
/ 19 февраля 2010

Пока ваш стек не растет без ограничений, все будет в порядке. Когда вы возвращаете целое число N из C API в Lua, происходят две вещи:

  • Движок Lua берет верхние значения N из стека и рассматривает их как результаты вызова.

  • Движок Lua освобождает (и повторно использует) все остальное в стеке.

Дэвид Сейлер упоминает о возможности вызова вашего кода C из другого кода C, а не из движка Lua. Это продвинутый метод, и если вы задаете этот вопрос, вам вряд ли придется беспокоиться об этой конкретной проблеме. (Но то, как это происходит с точки зрения Lua, остается тем же самым - когда all код C завершает свою работу, он должен возвращать целое число, и Lua снимает столько значений со стека, а затем освобождает остальные.)

Если вы используете слишком много стековых слотов, ваша программа остановится с нормальным и разумным сообщением об ошибке (насколько я знаю из опыта).

1 голос
/ 27 февраля 2010

дополнительно, вместо использования pushstring или pushinteger, за которым следует gettable, используйте lua_getfield и lua_rawgeti соответственно (хотя raw не будет вызывать метаметоды, если вы этого хотели ...)

1 голос
/ 19 февраля 2010

Это зависит.

Если ваша функция C вызывается из Lua, оставленные вами значения будут значениями, которые ваша функция C возвращает Lua. Если ваша функция C вызывается другой функцией C, которая использует стек Lua, то эти значения все еще будут в стеке, и вы можете делать с ними что угодно или ничего.

Но если после того, как вы вызвали свою функцию C, вы полностью закончили с Lua, и из вашего вопроса это звучит так, как если бы вы были, тогда вам не нужно очищать свой стек Lua. Просто закройте контекст Lua, и он очистит ваш стек для вас.

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