From db51a9071af9587cf152937cb900e663b424a7e7 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 4 May 2016 15:46:25 +0100 Subject: [Feature] Print userdata using tostring if possible --- src/lua/lua_logger.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c index 66c472a27..125f0ff80 100644 --- a/src/lua/lua_logger.c +++ b/src/lua/lua_logger.c @@ -283,6 +283,7 @@ static gsize lua_logger_out_userdata (lua_State *L, gint pos, gchar *outbuf, gsize len) { gint r; + const gchar *str = NULL; if (!lua_getmetatable (L, pos)) { return 0; @@ -296,16 +297,32 @@ lua_logger_out_userdata (lua_State *L, gint pos, gchar *outbuf, gsize len) return 0; } - lua_pushstring (L, "class"); + lua_pushstring (L, "__tostring"); lua_gettable (L, -2); - if (!lua_isstring (L, -1)) { - lua_pop (L, 3); - return 0; + if (lua_isfunction (L, -1)) { + lua_pushvalue (L, pos); + + if (lua_pcall (L, 1, 1, 0) != 0) { + lua_pop (L, 3); + return 0; + } + + str = lua_tostring (L, -1); + } + else { + lua_pushstring (L, "class"); + lua_gettable (L, -2); + + if (!lua_isstring (L, -1)) { + lua_pop (L, 3); + return 0; + } + + str = lua_tostring (L, -1); } - r = rspamd_snprintf (outbuf, len + 1, "%s(%p)", lua_tostring (L, -1), - lua_touserdata (L, pos)); + r = rspamd_snprintf (outbuf, len + 1, "%s(%p)", str, lua_touserdata (L, pos)); lua_pop (L, 3); return r; -- cgit v1.2.3