Recursion 在最新的luajit 2.1.0-beta3上,是否可以进行递归xpcall?
我正在luajit 2.1.0-beta3中对Go的defer/panic/recover进行建模,如果能够递归地使用xpcall,那就太好了,因为Go的延迟函数本身可能会出现恐慌,而具有延迟的函数会定期调用具有延迟的其他函数。我正在尝试这个:Recursion 在最新的luajit 2.1.0-beta3上,是否可以进行递归xpcall?,recursion,lua,luajit,Recursion,Lua,Luajit,我正在luajit 2.1.0-beta3中对Go的defer/panic/recover进行建模,如果能够递归地使用xpcall,那就太好了,因为Go的延迟函数本身可能会出现恐慌,而具有延迟的函数会定期调用具有延迟的其他函数。我正在尝试这个: -- recursive xpcalls, do they work? hmm... looks like we get "error in error handling" ouch=function() error("ouch") end ouch
-- recursive xpcalls, do they work? hmm... looks like we get "error in error handling"
ouch=function() error("ouch") end
ouch2=function() error("ouch2") end
ok=function() return "ok" end
h2 = function(err)
print("panicHandler2 running with err =", err) -- hmm, can't get this to call?
end
h = function(err)
print("panicHandler running with err =", err)
g = {xpcall(ouch2, h2)}
for k,v in pairs(g) do print("g result of recursive xpcall is k=",k," val=",v) end
-- g result of recursive xpcall is k= 1 val= false
-- g result of recursive xpcall is k= 2 val= error in error handling
end
r={xpcall(ouch, h)}
for k,v in pairs(r) do print("r result of top xpcall is k=",k," val=",v) end
-- output:
$ luajit
LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON SSE2 SSE3 SSE4.1 BMI2 fold cse dce fwd dse narrow loop abc sink fuse
> dofile 'rexp.lua'
panicHandler running with err = rexp.lua:3: ouch
g result of recursive xpcall is k= 1 val= false
g result of recursive xpcall is k= 2 val= error in error handling
r result of top xpcall is k= 1 val= false
>
因此,我看到的不是调用h2,而是“错误处理中的错误”
有没有一种方法可以让递归xpcalls工作
上面的代码是使用OSX上的clang构建的,使用默认的Makefile,未注释XCFLAGS+=-DLUAJIT\u ENABLE\u LUA52COMPAT
。所以它是一个C构建的,不是C++构建的,在MACOS上。< /P>
更新:适用于PUC Lua5.1.5和5.3.4,h2将被调用。值得一提的是,此问题已升级到LuaJIT的问题跟踪程序,Mike Pall将其标记为无法修复