diff --git a/src/luv.c b/src/luv.c index 105e4486..a55f917c 100644 --- a/src/luv.c +++ b/src/luv.c @@ -706,7 +706,8 @@ LUALIB_API int luv_cfpcall(lua_State* L, int nargs, int nresult, int flags) { break; case LUA_ERRMEM: if ((flags & LUVF_CALLBACK_NOERRMSG) == 0) - fprintf(stderr, "System Error: %s\n", lua_tostring(L, -1)); + fprintf(stderr, "System Error: %s\n", + luaL_tolstring(L, lua_absindex(L, -1), NULL)); if ((flags & LUVF_CALLBACK_NOEXIT) == 0) exit(-1); lua_pop(L, 1); @@ -716,7 +717,8 @@ LUALIB_API int luv_cfpcall(lua_State* L, int nargs, int nresult, int flags) { case LUA_ERRERR: default: if ((flags & LUVF_CALLBACK_NOERRMSG) == 0) - fprintf(stderr, "Uncaught Error: %s\n", lua_tostring(L, -1)); + fprintf(stderr, "Uncaught Error: %s\n", + luaL_tolstring(L, lua_absindex(L, -1), NULL)); if ((flags & LUVF_CALLBACK_NOEXIT) == 0) exit(-1); lua_pop(L, 1); diff --git a/tests/manual-test-cb-non-string-error.lua b/tests/manual-test-cb-non-string-error.lua new file mode 100644 index 00000000..d870eb3d --- /dev/null +++ b/tests/manual-test-cb-non-string-error.lua @@ -0,0 +1,24 @@ +return require('lib/tap')(function (test) + test("timer callback with errors", function(print, p, expect, uv) + local Error = {} + Error.__index = Error + + function Error.new(msg) + local o = setmetatable({}, Error) + o.msg = assert(msg) + return o + end + + function Error:__tostring() + return assert(tostring(self.msg)) + end + + local timer = uv.new_timer() + timer:start(10, 0, function() + timer:stop() + timer:close() + local e = Error.new('Error in timeout callback') + error(e) + end) + end) +end)