在最新的luajit 2.1.0-beta3上,递归xpcall可能吗?

时间:2018-01-11 08:04:42

标签: recursion lua luajit

我在luajit 2.1.0-beta3中建模Go的延迟/恐慌/恢复,能够递归使用xpcall会很好,因为Go的延迟函数本身可能会出现恐慌,并且延迟函数会定期调用其他函数与推迟。我正在尝试这个:

-- 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_ENABLE_LUA52COMPAT取消注释。所以它是在macOS上构建的,而不是C ++构建。

更新:适用于PUC Lua5.1.5和5.3.4,h2被调用。

0 个答案:

没有答案