2015-05-18 10 views
7

Sto usando Lua come linguaggio di scripting nel mio gioco (C++). In una chiamata (da lua a C++) verifico che tipo è in cima alla pila:In C++ chiamato da Lua, lua_type (L, 0) restituisce 9 che non è documentato

if(lua_type(L, (0)) == LUA_TSTRING) 

Ma a volte lua_type (L, (0)) restituisce 9.

non posso sembra trovare alcun riferimento a questo (i valori restituiti devono essere compresi tra -1 e 8 oppure LUA_TNONE, LUA_TNIL, ... LUA_TTHREAD).

Cosa sta succedendo?

+0

Ive ha trovato quanto segue in lobject.h: '/ * ** tag aggiuntivo per i non-valori */# define LUA_TPROTO \t LUA_NUMTAGS #define LUA_TUPVAL \t (LUA_NUMTAGS + 1) #define LUA_TDEADKEY \t (LUA_NUMTAGS + 2) ' Dove' LUA_NUMTAGS' è 9 –

risposta

5

La sommità della pila è a index -1, non 0.

0 può mai essere usato come indice per accedere stack:

(Si noti che 0 è mai un indice accettabile .)

in §4.3 – Valid and Acceptable Indices nel manuale di riferimento.

L'API C in Lua non tenere la mano del programmatore:

Come nella maggior parte delle librerie C, le funzioni API Lua non controllano i loro argomenti per la validità o la coerenza. Tuttavia, è possibile modificare questo comportamento compilando Lua con la macro definita LUA_USE_APICHECK. [§4]

+1

Tuttavia, la documentazione dice che 'LUA_TNONE' quindi dovrebbe essere il risultato, tuttavia' LUA_TNONE' è -1, non 9. Potrebbe essere che considera questo scenario (non esistente piuttosto che semplicemente "non valido") per non essere nemmeno coperto da quella e caso rror, e come tale diventa UB. Sembra una codifica scadente se è vero, però. –

+2

Anche se sono d'accordo sul fatto che questo non spiega il valore esatto di ritorno una volta che hai raggiunto un comportamento indefinito, tutto è accettabile e 'lua_type' è esplicitamente documentato come definito per" accettabile ind [ices] "o (" valido "o" non " -valid (ma accettabile) ind [ices] ". –

+0

@LightnessRacesinOrbit Ci si rende conto che l'insieme di persone che comprendono" loro "in termini di lua è un insieme che contiene lhf, giusto? =) –

Problemi correlati