C ++ и Lua — незащищенная ошибка (неправильный обратный вызов)? Как это возможно

Я работаю с 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)

Он делает то же самое, но только в другой функции. И печать, исправляющая это, если я пытаюсь поместить это в метод функции, только добавляет к полной странности этого. Это огромная проблема.

2

Решение

В соответствии с документация, LuaJIT не позволяет FFI-вызову быть JIT-скомпилированным, если FFI-код вызывает функцию C, которая вызывает обратно в Lua через сохраненный обратный вызов. В большинстве случаев LuaJIT обнаружит эти вызовы и избежит компиляции, но если этого не произойдет, он прекратит работу с сообщением об ошибке «плохой обратный вызов». Экстра print помогло, потому что это помешало JIT-компиляции (print является не составлено банкомат.).

Предлагаемое решение (вместо вызова print), чтобы явно остановить FFI-вызов от JIT-компиляции с использованием jit.off функция.

2

Другие решения


По вопросам рекламы [email protected]