Można zawijać funkcje C, które będą wywoływane w zewnętrznym zamknięciu C, sprawdzając stos C/C++. Zamknięcie będzie zawierać upvalue przedstawieniu rzeczywistej C-funkcja do wywołania:
CFunctionThunk(lua_state* l)
{
Check available stack space.
if(available stack space < minimum stack space required)
{
panic(...);
}
else
{
actualFunction = retrieve upvalue;
actualFunction(l);
}
}
To doda przestrzeń stos Thunk wymagane do przestrzeni stosu wymaganej przez funkcję faktycznie się powoływać, ale to powinno być małe i stały. Ponadto, przed wywołaniem Lua od samego początku, powinieneś upewnić się, że pozostała przestrzeń stosu C jest wystarczająco duża, aby pomieścić twoją Lua VM i dwie ramki stosów funkcji C (thunk + actual). Możesz zbadać wskaźnik stosu w debugerze, aby znaleźć ilość miejsca potrzebnego na thunk i Lua VM, która powinna być (mniej więcej) stała. Sprawdzanie przestrzeni stosu może również zostać zredukowane do licznika lokalnego wątku, który jest zwiększany na początku thunk i zmniejszany na końcu.
Inną możliwością jest włączenie haka debugowania Lua przy wywołaniach funkcji, sprawdzenie funkcji C w tym miejscu i sprawdzenie stosu C w razie potrzeby. Ale to najprawdopodobniej obniży wydajność środowiska wykonawczego, ponieważ hak będzie wywoływany także dla funkcji zdefiniowanych przez Lua w twoim skrypcie.
Czy możesz odbudować Lua z odpowiednimi wartościami "LUAI_MAXCCALLS" i "MAXCCALLS"? – lhf
Niestety nie mogę. Mam rozmiar stosu zdefiniowany w bajtach i nie mogę go zmienić. I nie ma bezpośredniego mapowania z rozmiaru stosu na LUAI_MAXCCALLS i MAXCCALLS. – dlask
Czy www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) może być rozwiązaniem dla Ciebie? – llogiq