Привет. Я пытаюсь обернуть следующую функцию с помощью SWIG.
static void readTable(int argc, t_atom *argv) { //accepts table in Lua e.g. readTable({"ab",3});
for (int i=0; i<argc; ++i) {
if (argv[i].a_type == A_FLOAT)
printf("FLOAT : %g\n", argv[i].a_w.w_float);
else if (argv[i].a_type == A_SYMBOL)
printf("SYMBOL : %s\n", argv[i].a_w.w_symbol->s_name);
}
}
Вот созданная мной карта типов.
%include "exception.i"
%typemap(in) (int argc, t_atom *argv)
{
if (!lua_istable(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected");
}
lua_len(L, 1);
$1 = lua_tointeger(L, -1);
$2 = (t_atom *)getbytes($1 * sizeof(t_atom)); //internally calls calloc()
for (int i=0; i<$1; ++i) {
lua_pushinteger(L, i+1);
lua_gettable(L, 1);
if(lua_isnumber(L, -1)) {
$2[i].a_type = A_FLOAT;
$2[i].a_w.w_float = lua_tonumber(L, -1);
}
else if(lua_isstring(L, -1)) {
$2[i].a_type = A_SYMBOL;
$2[i].a_w.w_symbol = gensym(lua_tostring(L, -1));
}
}
freebytes($2, $1 * sizeof(t_atom)); //internally calls free()
}
Как видите, я выделяю память длямассив, использующий getbytes()
, который внутренне вызывает calloc()
и освобождающий память, используя freebytes()
, который внутренне вызывает free()
.
Удивительно, но когда я вызываю readTable()
функцию в Lua, она работает без сбоев.
например, вызов test.readTable({3, "abc"})
в Lua выводит следующий результат.
FLOAT : 3
SYMBOL : abc
Мои вопросы
a) Как readTable()
печатать результаты без сбоев, когдаЯ освободил память в интерфейсе SWIG?Может быть, память не освобождается должным образом?
b) Если а) не имеет смысла или небезопасно для использования, вы бы порекомендовали вместо этого вызывать freebytes()
внутри функции readTable()
, чтобы ее можно былокак следующее?
static void readTable(int argc, t_atom *argv) {
for (int i=0; i<argc; ++i) {
if (argv[i].a_type == A_FLOAT)
post("FLOAT : %g", argv[i].a_w.w_float);
else if (argv[i].a_type == A_SYMBOL)
post("SYMBOL : %s", argv[i].a_w.w_symbol->s_name);
}
freebytes(argv, argc * sizeof(t_atom));
}