C/C++ yığınınızı kontrol eden bir dış C kapanışı içinde çağrılacak C işlevlerini sarabilirsiniz. kapatma çağrılacak fiili C- işleve başvuran bir upvalue içerecektir: çağrılacak
CFunctionThunk(lua_state* l)
{
Check available stack space.
if(available stack space < minimum stack space required)
{
panic(...);
}
else
{
actualFunction = retrieve upvalue;
actualFunction(l);
}
}
Bu aslında işlev tarafından gerekli yığın alanı için gerekli thunk ait yığın boşluk eklemek, ancak bu küçük olmalı ve sabiti. Ayrıca, Lua'yı en baştan çağırmadan önce, kalan C-yığını alanının, Lua VM'nizi ve C-işlevi yığın çerçevelerinden ikisini (thunk + gerçek) içerecek kadar büyük olduğundan emin olmalısınız. Bir hata ayıklayıcısındaki yığın işaretçisini, (az ya da çok) sabit olması gereken thunk ve Lua VM için gerekli alan miktarını bulmak için araştırabilirsiniz. Yığın alanı kontrolü ayrıca, thunk'ın başlangıcında artan ve sonunda azaltılmış bir iş parçacığı yerel sayaca da indirgenebilir.
Başka bir olasılık, bir Lua hata ayıklama kancasını işlev çağrıları üzerinde etkinleştirmek, orada C-işlevlerini kontrol etmek ve gerekirse C yığını kontrolünü yapmak olabilir. Ancak bu, çalışma zamanı performansını bozar çünkü çengel, betiğinizdeki Lua tanımlı işlevler için de çağrılır.
Lua'yı 'LUAI_MAXCCALLS' ve 'MAXCCALLS' değerleri ile yeniden yapılandırabilir misiniz? – lhf
Maalesef yapamıyorum. Bayt cinsinden tanımlanmış yığın boyutuna sahibim ve değiştiremiyorum. Ve yığın boyutundan LUAI_MAXCCALLS ve MAXCCALLS için doğrudan eşleme yoktur. – dlask
www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) sizin için bir çözüm olabilir mi? – llogiq