У меня есть C код, который выглядит примерно так:Как вы вызываете функции с помощью указателей функций в Lua с привязкой SWIG?
typedef int (*SIMPLEFUNC)(int);
SIMPLEFUNC foo = NULL;
void setup_foo(void) {
foo = ...;
}
я обернуть это с SWIG с минималистичным .i файлом, а затем использовать его в Lua. Я могу позвонить setup_foo()
из Lua. Я вижу переменную foo
. Но я не могу назвать foo
функцией от Lua. Он отображается как userdata.
local mylib = require('mylib')
mylib.setup_foo()
print(mylib.foo)
print(mylib.foo(3))
Я получаю вывод так:
setup_foo() has been called
userdata: 0x1b441c8
PANIC: [string "bootstrap0"]:86: attempt to call a userdata value (field 'foo')
stack traceback:
[string "bootstrap0"]:86: in main chunk
Вопрос
Есть ли способ вызова функции, такие как указатели foo
из моего Lua кода при использовании SWIG?
Есть ли какая-то конфигурация SWIG, которая может помочь?
Если нет, то какой способ изменить свой код на C, чтобы заставить его работать?
Редактировать
На более высоком уровне, я решил эту проблему путем перехода на Селене вместо SWIG. Selene позволяет легко перезаписывать функции в состоянии Lua во время выполнения. https://github.com/jeremyong/Selene