Multiple errors in '__toclose' report the first one

When there are multiple errors when closing objects, the error
reported by the protected call is the first one, for two reasons:
First, other errors may be caused by this one;
second, the first error is handled in the original execution context,
and therefore has the full traceback.
This commit is contained in:
Roberto Ierusalimschy
2019-06-05 13:16:25 -03:00
parent 14edd364c3
commit b4d5dff8ec
5 changed files with 56 additions and 28 deletions

View File

@@ -163,15 +163,23 @@ do
assert(not X and coroutine.status(co) == "dead")
-- error closing a coroutine
local x = 0
co = coroutine.create(function()
local <toclose> y = func2close(function (self,err)
if (err ~= 111) then os.exit(false) end -- should not happen
x = 200
error(200)
end)
local <toclose> x = func2close(function (self, err)
assert(err == nil); error(111)
end)
coroutine.yield()
end)
coroutine.resume(co)
assert(x == 0)
local st, msg = coroutine.close(co)
assert(not st and coroutine.status(co) == "dead" and msg == 111)
assert(st == false and coroutine.status(co) == "dead" and msg == 111)
assert(x == 200)
end