To: vim_dev@googlegroups.com Subject: Patch 9.0.1470 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@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 ///