From 1cb60405548e79f1ec63921540e1c3ebb3ddcc01 Mon Sep 17 00:00:00 2001 From: ii14 <59243201+ii14@users.noreply.github.com> Date: Thu, 27 Apr 2023 19:25:08 +0200 Subject: perf(events): store autocommands in flat vectors (#23256) Instead of nested linked lists, store autocommands in a flat, contiguous kvec_t, with one kvec_t per event type. Previously patterns were stored in each node of the outer linked list, so they can be matched only once on repeating patterns. They are now reference counted and referenced in each autocommand, and matching is skipped if the pattern repeats. Speeds up creation and deletion, execution is not affected. Co-authored-by: ii14 --- test/functional/autocmd/autocmd_spec.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'test/functional/autocmd/autocmd_spec.lua') diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index fb5bab445c..82c7f9502f 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -611,4 +611,22 @@ describe('autocmd', function() eq(4, #meths.get_autocmds { event = "BufReadCmd", group = "TestingPatterns" }) end) end) + + it('no use-after-free when adding autocommands from a callback', function() + exec_lua [[ + vim.cmd "autocmd! TabNew" + vim.g.count = 0 + vim.api.nvim_create_autocmd('TabNew', { + callback = function() + vim.g.count = vim.g.count + 1 + for _ = 1, 100 do + vim.cmd "autocmd TabNew * let g:count += 1" + end + return true + end, + }) + vim.cmd "tabnew" + ]] + eq(1, eval('g:count')) -- Added autocommands should not be executed + end) end) -- cgit From 774a32e5fe732a43b229ab25e24dffa36ac29aa4 Mon Sep 17 00:00:00 2001 From: ii14 Date: Thu, 27 Apr 2023 22:03:17 +0200 Subject: fix(events): null dereference in autocmd functions --- test/functional/autocmd/autocmd_spec.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'test/functional/autocmd/autocmd_spec.lua') diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index 82c7f9502f..da8c7b5ee0 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -629,4 +629,20 @@ describe('autocmd', function() ]] eq(1, eval('g:count')) -- Added autocommands should not be executed end) + + it('no crash when clearing a group inside a callback #23355', function() + exec_lua [[ + vim.cmd "autocmd! TabNew" + local group = vim.api.nvim_create_augroup('Test', {}) + local id + id = vim.api.nvim_create_autocmd('TabNew', { + group = group, + callback = function() + vim.api.nvim_del_autocmd(id) + vim.api.nvim_create_augroup('Test', { clear = true }) + end, + }) + vim.cmd "tabnew" + ]] + end) end) -- cgit From 1fe1bb084d0099fc4f9bfdc11189485d0f74b75a Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Mon, 19 Dec 2022 16:37:45 +0000 Subject: refactor(options): deprecate nvim[_buf|_win]_[gs]et_option Co-authored-by: zeertzjq Co-authored-by: famiu --- test/functional/autocmd/autocmd_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/functional/autocmd/autocmd_spec.lua') diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index da8c7b5ee0..63a487c8bc 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -141,7 +141,7 @@ describe('autocmd', function() describe('BufLeave autocommand', function() it('can wipe out the buffer created by :edit which triggered autocmd', function() - meths.set_option('hidden', true) + meths.set_option_value('hidden', true, {}) curbufmeths.set_lines(0, 1, false, { 'start of test file xx', 'end of test file xx'}) -- cgit