From: Vsevolod Stakhov Date: Wed, 4 May 2016 14:46:25 +0000 (+0100) Subject: [Feature] Print userdata using tostring if possible X-Git-Tag: 1.3.0~551 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=db51a9071af9587cf152937cb900e663b424a7e7;p=thirdparty%2Frspamd.git [Feature] Print userdata using tostring if possible --- diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c index 66c472a274..125f0ff80e 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;