fix(lua): close vim.defer_fn() timer if vim.schedule() failed (#37647)

Problem:
Using vim.defer_fn() just before Nvim exit leaks luv handles.

Solution:
Make vim.schedule() return an error message if scheduling failed.
Make vim.defer_fn() close timer if vim.schedule() failed.
This commit is contained in:
zeertzjq
2026-02-01 21:29:19 +08:00
committed by GitHub
parent 0501c5fd09
commit 1906da52db
6 changed files with 41 additions and 11 deletions

View File

@@ -1786,6 +1786,24 @@ describe('lua stdlib', function()
eq(true, exec_lua [[return vim.g.test]])
end)
it('nested vim.defer_fn does not leak handles on exit #19727', function()
n.expect_exit(exec_lua, function()
vim.defer_fn(function()
vim.defer_fn(function()
vim.defer_fn(function() end, 0)
end, 0)
end, 0)
vim.cmd('qall')
end)
end)
it('vim.defer_fn with timeout does not leak handles on exit', function()
n.expect_exit(exec_lua, function()
vim.defer_fn(function() end, 50)
vim.cmd('qall')
end)
end)
describe('vim.region', function()
it('charwise', function()
insert(dedent([[