2009-05-26 4 views
1

Я заметил, что в сгенерированных оболочках SWIG для заданного набора классов SWIG хранит список представлений C-строк всех родительских классов из который этот класс наследует. (char ** base_names). Я знаю, что есть функция(SWIG/Lua) Как получить доступ к списку базовых/родительских классов в swig_lua_class

swig_type(some_variable) 

, которая вернет строковое представление типа данных данной переменной. Есть ли функция, которая вернет таблицу родительских классов в виде строк? Если нет, есть ли простой способ написать эту функцию? Я не совсем знаком с внутренней работой SWIG.

Спасибо!

ответ

3

Нечто подобное должно работать (не тестировался, так как я не использую SWIG с 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); 
%} 
+0

Первоначальное тестирование показывает, что ваш код работает как чавканье! Большое спасибо, это отличная помощь! – zslayton