Используете lua_checkstack? - PullRequest
       42

Используете lua_checkstack?

1 голос
/ 05 августа 2020

Я немного запутался в том, как предполагается использовать lua_checkstack.

Документы говорят:

int lua_checkstack (lua_State *L, int extra);

Гарантирует наличие хотя бы лишнего свободного стека слоты в стеке. Он возвращает false, если не может увеличить стек до этого размера. Эта функция никогда не сжимает стек; если стек уже больше нового размера, он остается без изменений.

В 3.2 Stack Size говорится:

Когда вы взаимодействуете с Lua API, вы несете ответственность за обеспечение согласованности. В частности, вы отвечаете за контроль переполнения стека. Вы можете использовать функцию lua_checkstack для увеличения размера стека.

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

Единственный способ использовать дополнительные слоты в стеке - это вызывая определенные функции из C API (например, lua_pushnumber, lua_pushstring) - правильно?

И эти функции увеличивают стек по мере необходимости:

Например, вот lua_pushnumber определение:

LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
{
  setnumV(L->top, n);
  if (LJ_UNLIKELY(tvisnan(L->top)))
    setnanV(L->top);  /* Canonicalize injected NaNs. */
  incr_top(L); // <---- HERE
}

, и это определение incr_top:

#define incr_top(L) \
  (++L->top >= tvref(L->maxstack) && (lj_state_growstack1(L), 0))

Я думаю, это означает, что если вы sh за пределами размера стека, он все равно будет увеличивать его по мере необходимости. в любом случае на LUA_MAXSTACK, а затем корректно завершится с переполнением стека. lj_state_growstack - это то, что вызывает lua_checkstack. Так зачем мне звонить lua_checkstack?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Путаница была вызвана:

  1. LuaJIT автоматически увеличивает стек по мере необходимости (до LUA_MAXSTACK).
  2. Эталонная реализация (vanilla) Lua не (сбои или неопределенное поведение в LUA_MINSTACK без вызова lua_checkstack)

, а в руководстве описывалось 2.

0 голосов
/ 06 августа 2020

В документации для Lua 5.1 это предельно ясно:

Когда вы взаимодействуете с Lua API, вы несете ответственность за обеспечение согласованности. В частности, вы отвечаете за управление переполнением стека .

Акцент не добавлен.

LuaJIT - альтернативная реализация 5.1 с некоторые изменения. Если он хочет убедиться, что вам не нужно изменять стек вручную, он может. Но это вопрос документации и реализации LuaJIT.

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