2010-02-18 5 views
5

Sto usando la Lua C-API per leggere nei dati di configurazione che sono memorizzati in un file lua.come pulisco il mio stack di stato lua?

Ho una piccola tabella nel file e ho scritto una query C-function che analizza un campo specifico nella tabella. (Yay funziona!)

Funziona chiamando alcuni di questi tipi di funzioni più e più volte:

... 
lua_getglobal (...); 
lua_pushinteger (...); 
lua_gettable (...); 
lua_pushstring (...); 
lua_gettable (...); 
lua_lua_getfield (...); 
... 

si ottiene l'idea.

Dopo aver eseguito query sui miei dati in questo modo, devo pulire lo stack?

risposta

6

Fintanto che il tuo stack non cresce senza vincoli, starai bene. Quando ritorni intero N dall'API C in Lua, due cose:

  • Il motore Lua prende le prime N valori dalla pila e li considera come i risultati della chiamata.

  • Il motore Lua rilascia (e riutilizza) tutto il resto dello stack.

David Seiler menziona la possibilità che il tuo codice C venga chiamato da un altro codice C e non dal motore Lua. Questa è una tecnica avanzata, e se stai facendo questa domanda, è improbabile che tu debba preoccuparti di quel particolare problema. (Ma il modo in cui accade dal punto di vista Lua è la stessa — quando tutto il codice C termina l'esecuzione, deve restituire un numero intero, e Lua bucce che molti valori dallo stack e quindi rilascia il resto.)

Se si utilizzano troppi slot di stack, il programma si fermerà con un messaggio di errore sensato e sensato (come noto per esperienza).

1

Dipende.

Se la funzione C viene chiamata da Lua, i valori che lascerai saranno i valori che la funzione C restituisce a Lua. Se la tua funzione C viene chiamata da un'altra funzione C che usa lo stack Lua, allora quei valori saranno ancora in pila e tu puoi fare qualsiasi cosa o niente con loro.

Ma se dopo aver chiamato la tua funzione C hai finito con Lua del tutto, e dalla tua domanda sembra che tu sia, quindi non devi ripulire il tuo stack Lua. Chiudi il contesto Lua e pulirà il tuo stack per te.

1

Inoltre, invece di utilizzare pushstring o pushinteger seguito da un gettable, utilizzare lua_getfield e lua_rawgeti respectivly (la prima non richiamerà metamethods però, in caso si voleva che ...)

Problemi correlati