Patch 9.0.1470

2 views
Skip to first unread message

Bram Moolenaar

unread,
Apr 19, 2023, 9:22:33 AM4/19/23
to vim...@googlegroups.com

Patch 9.0.1470 (after 9.0.1469)
Problem: Deferred functions invoked in unexpected order when using :qa and
autocommands.
Solution: Call deferred functions for the current funccal before using the
stack. (closes #12278)
Files: src/userfunc.c, src/testdir/test_user_func.vim


*** ../vim-9.0.1469/src/userfunc.c 2023-04-18 21:52:49.840640915 +0100
--- src/userfunc.c 2023-04-19 14:16:40.861706339 +0100
***************
*** 6144,6155 ****
void
invoke_all_defer(void)
{
for (funccal_entry_T *fce = funccal_stack; fce != NULL; fce = fce->next)
for (funccall_T *fc = fce->top_funccal; fc != NULL; fc = fc->fc_caller)
invoke_funccall_defer(fc);
-
- for (funccall_T *fc = current_funccal; fc != NULL; fc = fc->fc_caller)
- invoke_funccall_defer(fc);
}

/*
--- 6144,6155 ----
void
invoke_all_defer(void)
{
+ for (funccall_T *fc = current_funccal; fc != NULL; fc = fc->fc_caller)
+ invoke_funccall_defer(fc);
+
for (funccal_entry_T *fce = funccal_stack; fce != NULL; fce = fce->next)
for (funccall_T *fc = fce->top_funccal; fc != NULL; fc = fc->fc_caller)
invoke_funccall_defer(fc);
}

/*
*** ../vim-9.0.1469/src/testdir/test_user_func.vim 2023-04-18 21:52:49.840640915 +0100
--- src/testdir/test_user_func.vim 2023-04-19 14:16:40.857706340 +0100
***************
*** 704,732 ****

func Test_defer_quitall_autocmd()
let lines =<< trim END
! autocmd User DeferAutocmdThree qa!

! func DeferLevelTwo()
! call writefile(['text'], 'XQuitallAutocmdTwo', 'D')
! doautocmd User DeferAutocmdThree
endfunc

! autocmd User DeferAutocmdTwo ++nested call DeferLevelTwo()

! def DeferLevelOne()
! call writefile(['text'], 'XQuitallAutocmdOne', 'D')
! doautocmd User DeferAutocmdTwo
enddef

autocmd User DeferAutocmdOne ++nested call DeferLevelOne()

doautocmd User DeferAutocmdOne
END
call writefile(lines, 'XdeferQuitallAutocmd', 'D')
! let res = system(GetVimCommand() .. ' -X -S XdeferQuitallAutocmd')
call assert_equal(0, v:shell_error)
! call assert_false(filereadable('XQuitallAutocmdOne'))
! call assert_false(filereadable('XQuitallAutocmdTwo'))
endfunc

func Test_defer_quitall_in_expr_func()
--- 704,748 ----

func Test_defer_quitall_autocmd()
let lines =<< trim END
! func DeferLevelFive()
! defer writefile(['5'], 'XQuitallAutocmd', 'a')
! qa!
! endfunc

! autocmd User DeferAutocmdFive call DeferLevelFive()
!
! def DeferLevelFour()
! defer writefile(['4'], 'XQuitallAutocmd', 'a')
! doautocmd User DeferAutocmdFive
! enddef
!
! func DeferLevelThree()
! defer writefile(['3'], 'XQuitallAutocmd', 'a')
! call DeferLevelFour()
endfunc

! autocmd User DeferAutocmdThree ++nested call DeferLevelThree()

! def DeferLevelTwo()
! defer writefile(['2'], 'XQuitallAutocmd', 'a')
! doautocmd User DeferAutocmdThree
enddef

+ func DeferLevelOne()
+ defer writefile(['1'], 'XQuitallAutocmd', 'a')
+ call DeferLevelTwo()
+ endfunc
+
autocmd User DeferAutocmdOne ++nested call DeferLevelOne()

doautocmd User DeferAutocmdOne
END
call writefile(lines, 'XdeferQuitallAutocmd', 'D')
! call system(GetVimCommand() .. ' -X -S XdeferQuitallAutocmd')
call assert_equal(0, v:shell_error)
! call assert_equal(['5', '4', '3', '2', '1'], readfile('XQuitallAutocmd'))
!
! call delete('XQuitallAutocmd')
endfunc

func Test_defer_quitall_in_expr_func()
*** ../vim-9.0.1469/src/version.c 2023-04-18 21:52:49.840640915 +0100
--- src/version.c 2023-04-19 14:18:45.969760513 +0100
***************
*** 697,698 ****
--- 697,700 ----
{ /* Add new patch number below this line */
+ /**/
+ 1470,
/**/

--
Females are strictly forbidden to appear unshaven in public.
[real standing law in New Mexico, United States of America]

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages