diff options
author | Matthew Wild <mwild1@gmail.com> | 2018-10-26 19:29:08 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2018-10-26 19:29:08 +0100 |
commit | 3bc2c02797799a0e71c4a04dc810d2d683271c42 (patch) | |
tree | 20620497ffafc592a84e2c9069ee6daa246a8f42 /util-src/compat.c | |
parent | 5e7e48d99bb791cb8320ea57a494973f7e34e4bf (diff) | |
download | prosody-3bc2c02797799a0e71c4a04dc810d2d683271c42.tar.gz prosody-3bc2c02797799a0e71c4a04dc810d2d683271c42.zip |
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Diffstat (limited to 'util-src/compat.c')
-rw-r--r-- | util-src/compat.c | 29 |
1 files changed, 29 insertions, 0 deletions
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 <lua.h> +#include <lauxlib.h> + + +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; +} |