diff options
-rw-r--r-- | src/nvim/lua/executor.c | 2 | ||||
-rw-r--r-- | test/functional/lua/loop_spec.lua | 35 |
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) |