aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/coxpcall.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/coxpcall.lua')
-rw-r--r--runtime/lua/coxpcall.lua19
1 files changed, 13 insertions, 6 deletions
diff --git a/runtime/lua/coxpcall.lua b/runtime/lua/coxpcall.lua
index 6b179f1ef0..43e321eac3 100644
--- a/runtime/lua/coxpcall.lua
+++ b/runtime/lua/coxpcall.lua
@@ -1,6 +1,10 @@
-------------------------------------------------------------------------------
+-- (Not needed for LuaJIT or Lua 5.2+)
+--
-- Coroutine safe xpcall and pcall versions
--
+-- https://keplerproject.github.io/coxpcall/
+--
-- Encapsulates the protected calls with a coroutine based loop, so errors can
-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
-- yielding inside the call to pcall or xpcall.
@@ -27,22 +31,23 @@ end
-- No need to do anything if pcall and xpcall are already safe.
if isCoroutineSafe(pcall) and isCoroutineSafe(xpcall) then
- copcall = pcall
- coxpcall = xpcall
+ _G.copcall = pcall
+ _G.coxpcall = xpcall
return { pcall = pcall, xpcall = xpcall, running = coroutine.running }
end
-------------------------------------------------------------------------------
-- Implements xpcall with coroutines
-------------------------------------------------------------------------------
-local performResume, handleReturnValue
+local performResume
local oldpcall, oldxpcall = pcall, xpcall
local pack = table.pack or function(...) return {n = select("#", ...), ...} end
local unpack = table.unpack or unpack
local running = coroutine.running
+--- @type table<thread,thread>
local coromap = setmetatable({}, { __mode = "k" })
-function handleReturnValue(err, co, status, ...)
+local function handleReturnValue(err, co, status, ...)
if not status then
return false, err(debug.traceback(co, (...)), ...)
end
@@ -57,11 +62,12 @@ function performResume(err, co, ...)
return handleReturnValue(err, co, coroutine.resume(co, ...))
end
+--- @diagnostic disable-next-line: unused-vararg
local function id(trace, ...)
return trace
end
-function coxpcall(f, err, ...)
+function _G.coxpcall(f, err, ...)
local current = running()
if not current then
if err == id then
@@ -84,6 +90,7 @@ function coxpcall(f, err, ...)
end
end
+--- @param coro? thread
local function corunning(coro)
if coro ~= nil then
assert(type(coro)=="thread", "Bad argument; expected thread, got: "..type(coro))
@@ -101,7 +108,7 @@ end
-- Implements pcall with coroutines
-------------------------------------------------------------------------------
-function copcall(f, ...)
+function _G.copcall(f, ...)
return coxpcall(f, id, ...)
end