vim-patch:8.2.4791: events triggered in different order when reusing buffer

Problem:    Autocmd events triggered in different order when reusing an empty
            buffer.
Solution:   Call buff_freeall() earlier. (Charlie Groves, closes vim/vim#10198)
fef4485ef5

Test failure becomes very strange.
This commit is contained in:
zeertzjq 2022-04-20 11:11:39 +08:00
parent 69fc23ed98
commit f531fb97ff
2 changed files with 24 additions and 20 deletions

View File

@ -1748,21 +1748,14 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl
buf = curbuf;
// It's like this buffer is deleted. Watch out for autocommands that
// change curbuf! If that happens, allocate a new buffer anyway.
if (curbuf->b_p_bl) {
apply_autocmds(EVENT_BUFDELETE, NULL, NULL, false, curbuf);
}
if (buf == curbuf) {
apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, false, curbuf);
buf_freeall(buf, BFA_WIPE | BFA_DEL);
if (buf != curbuf) { // autocommands deleted the buffer!
return NULL;
}
if (aborting()) { // autocmds may abort script processing
xfree(ffname);
return NULL;
}
if (buf == curbuf) {
// Make sure 'bufhidden' and 'buftype' are empty
clear_string_option(&buf->b_p_bh);
clear_string_option(&buf->b_p_bt);
}
}
if (buf != curbuf || curbuf == NULL) {
buf = xcalloc(1, sizeof(buf_T));
@ -1782,14 +1775,6 @@ buf_T *buflist_new(char_u *ffname_arg, char_u *sfname_arg, linenr_T lnum, int fl
buf->b_wininfo = xcalloc(1, sizeof(wininfo_T));
if (buf == curbuf) {
// free all things allocated for this buffer
buf_freeall(buf, 0);
if (buf != curbuf) { // autocommands deleted the buffer!
return NULL;
}
if (aborting()) { // autocmds may abort script processing
return NULL;
}
free_buffer_stuff(buf, kBffInitChangedtick); // delete local vars et al.
// Init the options.

View File

@ -2748,9 +2748,10 @@ func Test_autocmd_closing_cmdwin()
endfunc
func Test_autocmd_vimgrep()
%bwipe!
augroup aucmd_vimgrep
au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * sb
au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * q9
au QuickfixCmdPre,BufNew,BufReadCmd * sb
au QuickfixCmdPre,BufNew,BufReadCmd * q9
augroup END
%bwipe!
call assert_fails('lv ?a? foo', 'E926:')
@ -2795,4 +2796,22 @@ func Test_v_event_readonly()
endfunc
func Test_noname_autocmd()
augroup test_noname_autocmd_group
autocmd!
autocmd BufEnter * call add(s:li, ["BufEnter", expand("<afile>")])
autocmd BufDelete * call add(s:li, ["BufDelete", expand("<afile>")])
autocmd BufLeave * call add(s:li, ["BufLeave", expand("<afile>")])
autocmd BufUnload * call add(s:li, ["BufUnload", expand("<afile>")])
autocmd BufWipeout * call add(s:li, ["BufWipeout", expand("<afile>")])
augroup END
let s:li = []
edit foo
call assert_equal([['BufUnload', ''], ['BufDelete', ''], ['BufWipeout', ''], ['BufEnter', 'foo']], s:li)
au! test_noname_autocmd_group
augroup! test_noname_autocmd_group
endfunc
" vim: shiftwidth=2 sts=2 expandtab