C ++和Lua - 不受保护的错误(错误的回调)?这怎么可能

时间:2014-09-19 01:00:45

标签: c++ c lua ffi luajit

我正在使用LuaJIT的FFI,我的结果非常奇怪。这会返回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

另一个非常奇怪的解决方案是在main函数中使用myDLL.myDLL_idle()。这怎么可能呢?如果我把调用放在一个函数中,那么我就可以做任何任意函数了,唯一可以保证工作的是打印和休眠。

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)

它正在做同样的事情,但只是在另一个功能。如果我尝试将它放在一个函数方法中,那么修复它就会增加它的完整怪异性。这是一个很大的问题。

1 个答案:

答案 0 :(得分:2)

根据the documentation,如果FFI代码调用通过存储的回调调回Lua的C函数,则LuaJIT不允许FFI调用进行JIT编译。在大多数情况下,LuaJIT会检测这些调用并避免编译,但是如果它没有,则它会以"错误的回调"中止。错误信息。额外的print有帮助,因为它阻止了JIT编译(printnot compiled atm。)。

建议的解决方案(而不是调用print)是使用jit.off函数显式停止FFI调用。