aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/lua/executor.c2
-rw-r--r--test/functional/lua/loop_spec.lua35
2 files changed, 36 insertions, 1 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 71c5cd4585..17009446e4 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -221,7 +221,7 @@ static int nlua_fast_cfpcall(lua_State *lstate, int nargs, int nresult, int flag
const char *error = lua_tostring(lstate, -1);
multiqueue_put(main_loop.events, nlua_luv_error_event,
- xstrdup(error), (void *)(intptr_t)kCallback);
+ error != NULL ? xstrdup(error) : NULL, (void *)(intptr_t)kCallback);
lua_pop(lstate, 1); // error message
retval = -status;
} else { // LUA_OK
diff --git a/test/functional/lua/loop_spec.lua b/test/functional/lua/loop_spec.lua
index 52a8fec0bf..8df2900368 100644
--- a/test/functional/lua/loop_spec.lua
+++ b/test/functional/lua/loop_spec.lua
@@ -159,4 +159,39 @@ describe('vim.uv', function()
it("is equal to require('luv')", function()
eq(true, exec_lua("return vim.uv == require('luv')"))
end)
+
+ it('non-string error() #32595', function()
+ local screen = Screen.new(50, 10)
+ exec_lua(function()
+ local timer = assert(vim.uv.new_timer())
+ timer:start(0, 0, function()
+ timer:close()
+ error(nil)
+ end)
+ end)
+ local s = [[
+ |
+ {1:~ }|*5
+ {3: }|
+ {9:Error executing callback:} |
+ {9:[NULL]} |
+ {6:Press ENTER or type command to continue}^ |
+ ]]
+ screen:expect(s)
+ feed('<cr>')
+ n.assert_alive()
+ screen:expect([[
+ ^ |
+ {1:~ }|*8
+ |
+ ]])
+ exec_lua(function()
+ vim.uv.fs_stat('non-existent-file', function()
+ error(nil)
+ end)
+ end)
+ screen:expect(s)
+ feed('<cr>')
+ n.assert_alive()
+ end)
end)