vim-patch:9.0.1468: recursively calling :defer function if it does :qa

Problem:    Recursively calling :defer function if it does :qa in a compiled
            function.
Solution:   Clear the defer entry before calling the function. (closes vim/vim#12271)

a1f2b5ddc6
This commit is contained in:
zeertzjq 2023-04-19 07:55:27 +08:00
parent 8e0ad6e261
commit a11849abdf

View File

@ -609,33 +609,56 @@ func Test_defer_throw()
call assert_false(filereadable('XDeleteTwo'))
endfunc
func Test_defer_quitall()
func Test_defer_quitall_func()
let lines =<< trim END
" vim9script
func DeferLevelTwo()
call writefile(['text'], 'XQuitallTwo', 'D')
call writefile(['quit'], 'XQuitallThree', 'a')
call writefile(['text'], 'XQuitallFuncTwo', 'D')
call writefile(['quit'], 'XQuitallFuncThree', 'a')
qa!
endfunc
" def DeferLevelOne()
func DeferLevelOne()
call writefile(['text'], 'XQuitallOne', 'D')
call DeferLevelTwo()
" enddef
call writefile(['text'], 'XQuitalFunclOne', 'D')
defer DeferLevelTwo()
endfunc
" DeferLevelOne()
call DeferLevelOne()
END
call writefile(lines, 'XdeferQuitall', 'D')
let res = system(GetVimCommand() .. ' -X -S XdeferQuitall')
call writefile(lines, 'XdeferQuitallFunc', 'D')
call system(GetVimCommand() .. ' -X -S XdeferQuitallFunc')
call assert_equal(0, v:shell_error)
call assert_false(filereadable('XQuitallOne'))
call assert_false(filereadable('XQuitallTwo'))
call assert_equal(['quit'], readfile('XQuitallThree'))
call assert_false(filereadable('XQuitallFuncOne'))
call assert_false(filereadable('XQuitallFuncTwo'))
call assert_equal(['quit'], readfile('XQuitallFuncThree'))
call delete('XQuitallThree')
call delete('XQuitallFuncThree')
endfunc
func Test_defer_quitall_def()
throw 'Skipped: Vim9 script is N/A'
let lines =<< trim END
vim9script
def DeferLevelTwo()
call writefile(['text'], 'XQuitallDefTwo', 'D')
call writefile(['quit'], 'XQuitallDefThree', 'a')
qa!
enddef
def DeferLevelOne()
call writefile(['text'], 'XQuitallDefOne', 'D')
defer DeferLevelTwo()
enddef
DeferLevelOne()
END
call writefile(lines, 'XdeferQuitallDef', 'D')
call system(GetVimCommand() .. ' -X -S XdeferQuitallDef')
call assert_equal(0, v:shell_error)
call assert_false(filereadable('XQuitallDefOne'))
call assert_false(filereadable('XQuitallDefTwo'))
call assert_equal(['quit'], readfile('XQuitallDefThree'))
call delete('XQuitallDefThree')
endfunc
func Test_defer_quitall_in_expr_func()
@ -655,7 +678,7 @@ func Test_defer_quitall_in_expr_func()
call Test_defer_in_funcref()
END
call writefile(lines, 'XdeferQuitallExpr', 'D')
let res = system(GetVimCommand() .. ' -X -S XdeferQuitallExpr')
call system(GetVimCommand() .. ' -X -S XdeferQuitallExpr')
call assert_equal(0, v:shell_error)
call assert_false(filereadable('Xentry0'))
call assert_false(filereadable('Xentry1'))