Software /
code /
prosody
Annotate
util-src/compat.c @ 10380:18685a5e362e
mod_dialback: Fix potential traceback in case of missing addressing
Not tested. Assuming nothing good comes from continuing the program flow
after this. The connection should get closed and the event gets aborted
by a traceback anyways.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 02 Nov 2019 15:40:20 +0100 |
parent | 9561:cfc7b2f7251e |
child | 12976:a187600ec7d6 |
rev | line source |
---|---|
9561
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 #include <lua.h> |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 #include <lauxlib.h> |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 static int lc_xpcall (lua_State *L) { |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 int ret; |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 int n_arg = lua_gettop(L); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 /* f, msgh, p1, p2... */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 luaL_argcheck(L, n_arg >= 2, 2, "value expected"); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 lua_pushvalue(L, 1); /* f to top */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 lua_pushvalue(L, 2); /* msgh to top */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 lua_replace(L, 1); /* msgh to 1 */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 lua_replace(L, 2); /* f to 2 */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 /* msgh, f, p1, p2... */ |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 ret = lua_pcall(L, n_arg - 2, LUA_MULTRET, 1); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 lua_pushboolean(L, ret == 0); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 lua_replace(L, 1); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 return lua_gettop(L); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 } |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 int luaopen_util_compat(lua_State *L) { |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 lua_createtable(L, 0, 2); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 { |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 lua_pushcfunction(L, lc_xpcall); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 lua_setfield(L, -2, "xpcall"); |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 } |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 return 1; |
cfc7b2f7251e
util.xpcall, util.compat: Add non-hacky multi-argument xpcall() for Lua 5.1
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 } |