Я немного запутался в том, как предполагается использовать 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
?