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 -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20230419132228.11FE81C03FF%40moolenaar.net.