È possibile eseguire il wrap delle funzioni C da chiamare all'interno di una chiusura C esterna controllando lo stack C/C++. La chiusura conterrebbe un sopravvalutare riferimento alla C-funzione reale di essere chiamato:
CFunctionThunk(lua_state* l)
{
Check available stack space.
if(available stack space < minimum stack space required)
{
panic(...);
}
else
{
actualFunction = retrieve upvalue;
actualFunction(l);
}
}
Questo aggiungerà spazio dello stack del thunk necessario per lo spazio di stack richiesto dalla funzione di realtà ad essere invocate, ma questo dovrebbe essere piccolo e costante. Inoltre, prima di chiamare in Lua fin dall'inizio, dovresti assicurarti che lo spazio rimanente di C-stack sia almeno abbastanza grande da contenere il tuo Lua VM e due dei frame di stack di funzioni C (thunk + actual). È possibile esaminare il puntatore dello stack in un debugger per trovare la quantità di spazio richiesta per il thunk e il Lua VM, che dovrebbe essere (più o meno) costante. Il controllo dello spazio di stack potrebbe anche essere ridotto a un contatore locale del thread che viene incrementato all'inizio del thunk e decrementato alla fine.
Un'altra possibilità sarebbe quella di abilitare un hook di debug Lua sulle chiamate di funzione, controllare le funzioni C e fare il controllo C-stack se necessario. Ma questo probabilmente peggiorerà le prestazioni del runtime poiché l'hook verrà chiamato anche per le funzioni definite da Lua all'interno del tuo script.
fonte
2016-08-11 16:27:10
È possibile ricostruire Lua con valori appropriati di "LUAI_MAXCCALLS" e "MAXCCALLS"? – lhf
Purtroppo non posso. Ho la dimensione dello stack definita in byte e non posso cambiarla. E non esiste alcuna mappatura diretta dalla dimensione dello stack a LUAI_MAXCCALLS e MAXCCALLS. – dlask
Potrebbe www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) essere una soluzione per te? – llogiq