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

C++ and Lua - Unprotected Error (bad callback)? How is this possible

本文关键字:错误 怎么可能 回调 Lua- 保护 C++      更新时间:2023-10-16

我正在使用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

另一个非常奇怪的解决方案是在主函数中使用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)

它在做同样的事情,但只是在另一个功能中。如果我试着把它放在一个函数方法中,打印修复会增加它的怪异之处。这是一个巨大的问题。

根据文档,如果FFI代码调用通过存储回调回调回Lua的C函数,LuaJIT不允许对FFI调用进行JIT编译。在大多数情况下,LuaJIT会检测到这些调用并避免编译,但如果没有,则会中止并显示"错误回调"错误消息。额外的print起到了帮助作用,因为它阻止了JIT编译(print不是自动编译的)

所提出的解决方案(而不是调用print)是显式停止使用jit.off函数对FFI调用进行JIT编译。