(SWIG / Lua) Как получить доступ к списку базовых / родительских классов в swig_lua_class

StackOverflow https://stackoverflow.com/questions/911632

Вопрос

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

swig_type(some_variable)

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

Спасибо!

Это было полезно?

Решение

Что-то вроде этого должно сработать (не тестировалось, так как я не использую 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);
%}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top