From f05e8649eddd2180e39ebe9482fee29bf7652c97 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Fri, 26 Oct 2018 19:29:08 +0100 Subject: util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1 --- util-src/GNUmakefile | 3 ++- util-src/compat.c | 29 +++++++++++++++++++++++++++++ util/xpcall.lua | 9 +++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 util-src/compat.c create mode 100644 util/xpcall.lua diff --git a/util-src/GNUmakefile b/util-src/GNUmakefile index f2f9b1bc..054c9201 100644 --- a/util-src/GNUmakefile +++ b/util-src/GNUmakefile @@ -6,7 +6,8 @@ CFLAGS+=-I$(LUA_INCDIR) INSTALL_DATA=install -m644 TARGET?=../util/ -ALL=encodings.so hashes.so net.so pposix.so signal.so table.so ringbuffer.so time.so poll.so +ALL=encodings.so hashes.so net.so pposix.so signal.so table.so \ + ringbuffer.so time.so poll.so compat.so ifdef RANDOM ALL+=crand.so diff --git a/util-src/compat.c b/util-src/compat.c new file mode 100644 index 00000000..34b35c35 --- /dev/null +++ b/util-src/compat.c @@ -0,0 +1,29 @@ + +#include +#include + + +static int lc_xpcall (lua_State *L) { + int ret; + int n_arg = lua_gettop(L); + /* f, msgh, p1, p2... */ + luaL_argcheck(L, n_arg >= 2, 2, "value expected"); + lua_pushvalue(L, 1); /* f to top */ + lua_pushvalue(L, 2); /* msgh to top */ + lua_replace(L, 1); /* msgh to 1 */ + lua_replace(L, 2); /* f to 2 */ + /* msgh, f, p1, p2... */ + ret = lua_pcall(L, n_arg - 2, LUA_MULTRET, 1); + lua_pushboolean(L, ret == 0); + lua_replace(L, 1); + return lua_gettop(L); +} + +int luaopen_util_compat(lua_State *L) { + lua_createtable(L, 0, 2); + { + lua_pushcfunction(L, lc_xpcall); + lua_setfield(L, -2, "xpcall"); + } + return 1; +} diff --git a/util/xpcall.lua b/util/xpcall.lua new file mode 100644 index 00000000..d2fc5011 --- /dev/null +++ b/util/xpcall.lua @@ -0,0 +1,9 @@ +local xpcall = xpcall; + +if select(2, xpcall(function (x) return x end, function () end, "test")) ~= "test" then + xpcall = require"util.compat".xpcall; +end + +return { + xpcall = xpcall; +}; -- cgit v1.2.3