(SWIG / Lua) Come accedere alla lista delle classi base / genitore in swig_lua_class
-
06-09-2019 - |
Domanda
Ho notato che negli involucri SWIG generati per un determinato insieme di classi, SWIG mantiene una lista di rappresentazioni C-stringa di tutte le classi genitore da cui quella classe eredita. (Char ** base_names). So che c'è una funzione
swig_type(some_variable)
che restituirà una rappresentazione di stringa del tipo di dati di un dato variabile. C'è anche una funzione che restituisce una tabella delle classi genitore come stringhe? In caso contrario, c'è un modo semplice di scrivere questa funzione? Io non sono affatto familiarità con il funzionamento interno di SWIG.
Grazie!
Soluzione
Qualcosa del genere dovrebbe funzionare (non testato, dal momento che io non uso SWIG con Lua):
// insert into runtime section
// this is the C function that iterates over the base_names array
// (I'm assuming that the array is terminated with a NULL)
%runtime %{
/* lua callable function to get the userdata's type */
SWIGRUNTIME int SWIG_Lua_basenames(lua_State* L)
{
swig_lua_userdata* usr;
swig_lua_class* clss = NULL;
int i = 0;
if (lua_isuserdata(L,1))
{
usr=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */
if (usr && usr->type && usr->type->clientdata) {
// fetch the swig_lua_class struct, it contains the base_names
clss = (swig_lua_class*)usr->type->clientdata;
}
}
/* create a new table with all class base names in it
note that I create it even if clss is NULL, that way
an empty table -should- be returned
*/
lua_newtable(L);
while(clss && clss->base_names[i]) {
lua_pushnumber(L, i+1); /* lua tables are 1-indexed */
lua_pushstring(L, clss->base_names[i]);
lua_rawset(L, -3);
i++;
}
return 1;
}
%}
%init %{
/* this goes into the user init function, register our new function with
Lua runtime
*/
SWIG_Lua_add_function(L,"swig_base_names",SWIG_Lua_basenames);
%}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow