2013-09-08 4 views

risposta

14

Lua 5.1 annulla ufficialmente l'uso della tabella arg per vararg, preferendo .... Tuttavia, vi è un'opzione di compilazione per Lua stessa, LUA_COMPAT_VARARG, per consentire l'uso di arg in codice 5.1.

Se LUA_COMPAT_VARARG stata definita quando Lua è stato compilato, una tabella arg verrà creato in funzioni varargs, e popolato con gli argomenti - a meno che il compilatore rileva l'uso ... all'interno della funzione. In tal caso, si presuppone che si stiano utilizzando varargs stile 5.1 invece di 5.0 e non si crei la tabella. Lo fa, tuttavia, crea ancora il locale chiamato arg!

Il risultato di questo è che se LUA_COMPAT_VARARG è definito, funzioni vararg che non utilizzano ... nel corpo ottenere un local arg contenente la lista degli argomenti, e le funzioni di vararg che fanno ottenere un local arg contenente nil. Questo bug è presente in tutte le versioni di 5.1 e significa, in particolare, che non è possibile accedere a un valore globale o superiore denominato arg da qualsiasi funzione varargs se LUA_COMPAT_VARARG è stato definito in fase di compilazione.

Lua 5.2 gocce di supporto per varials stile arg completamente e quindi non ha questo problema indipendentemente da come è stato configurato in fase di compilazione.

(Fonte: le variazioni di movimentazione tra 5.0 e 5.1, e l'opzione LUA_COMPAT_VARARG varargs, sono menzionati in the Lua 5.1 reference manual, section 7.1 Il manuale si riferisce a luaconf.h Il comportamento esatto non è documentato da nessuna parte, per quanto ne sono a conoscenza.. ; può essere determinato sperimentalmente, leggendo lparser.c e ldo.c o dai post sulla mailing list che originariamente riportava questo problema)

+0

Ok, è interessante. L'ho provato con lua 5.2.0 e ho ottenuto questo: 'table: 00899618' come valore di' args' (conferma quello che hai detto). Con "tempo di compilazione", intendi quando compili l'interprete di lua o quando compili uno script di lua usando "luac.exe". Come si arriva a conoscere tali dettagli? – Segfault

+0

@Segfault indica quando l'interprete è compilato dall'origine e qualcosa come '-DLUA_COMPAT_VARARG' viene fornito al compilatore C. ecc. – greatwolf

+0

' -DLUA_COMPAT_ALL' si trova nel makefile. Immagino che '_ALL' significhi che' LUA_COMPAT_VARARG' sia incluso. Questa informazione è presente nella documentazione o qualcosa del genere? – Segfault

Problemi correlati