Я работаю с FFI LuaJIT и получаю очень странные результаты. Это возвращает PANIC: Unprotected Error (bad callback)
:
function idle(ms)
myDLL.myDLL_idle(session, ms)
end
Но эта простая печать устранила проблему.
function idle(ms)
print("anything")
myDLL.myDLL_idle(session, ms)
end
Другое чрезвычайно странное решение — использовать myDLL.myDLL_idle()
внутри основной функции. Как это вообще возможно? Это не значит, что я могу просто выполнить любую произвольную функцию, если я помещу вызов в функцию, единственное, что гарантированно будет работать — это print и sleep.
function idle(ms)
myDLL.myDLL_idle(session, ms)
end
myDLL.myDLL_idle(session, ms) -- works
idle(ms) -- doesn't work (unless first line of idle() is a print statement)
Он делает то же самое, но только в другой функции. И печать, исправляющая это, если я пытаюсь поместить это в метод функции, только добавляет к полной странности этого. Это огромная проблема.
В соответствии с документация, LuaJIT не позволяет FFI-вызову быть JIT-скомпилированным, если FFI-код вызывает функцию C, которая вызывает обратно в Lua через сохраненный обратный вызов. В большинстве случаев LuaJIT обнаружит эти вызовы и избежит компиляции, но если этого не произойдет, он прекратит работу с сообщением об ошибке «плохой обратный вызов». Экстра print
помогло, потому что это помешало JIT-компиляции (print
является не составлено банкомат.).
Предлагаемое решение (вместо вызова print
), чтобы явно остановить FFI-вызов от JIT-компиляции с использованием jit.off
функция.