0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.3798: a :def callback function postpones an error message

Problem:    A :def callback function postpones an error message.
Solution:   Display the error after calling the function. (closes #9340)
This commit is contained in:
Bram Moolenaar
2021-12-13 18:19:55 +00:00
parent 1e78deb077
commit 3b309f11db
4 changed files with 65 additions and 10 deletions

View File

@@ -0,0 +1,6 @@
|~+0#4040ff13#ffffff0| @73
|~| @73
|E+0#ffffff16#e000002|r@1|o|r| |d|e|t|e|c|t|e|d| |w|h|i|l|e| |p|r|o|c|e|s@1|i|n|g| |f|u|n|c|t|i|o|n| |<|S|N|R|>|9|_|O|p|f|u|n|c|:| +0#0000000#ffffff0@19
|l+0#af5f00255&|i|n|e| @3|2|:| +0#0000000&@64
|E+0#ffffff16#e000002|6|8|4|:| |l|i|s|t| |i|n|d|e|x| |o|u|t| |o|f| |r|a|n|g|e|:| |0| +0#0000000#ffffff0@42
|P+0#00e0003&|r|e|s@1| |E|N|T|E|R| |o|r| |t|y|p|e| |c|o|m@1|a|n|d| |t|o| |c|o|n|t|i|n|u|e> +0#0000000&@35

View File

@@ -2763,25 +2763,28 @@ enddef
func Test_silent_echo() func Test_silent_echo()
CheckScreendump CheckScreendump
call Run_Test_silent_echo()
endfunc
let lines =<< trim END def Run_Test_silent_echo()
var lines =<< trim END
vim9script vim9script
def EchoNothing() def EchoNothing()
silent echo '' silent echo ''
enddef enddef
defcompile defcompile
END END
call writefile(lines, 'XTest_silent_echo') writefile(lines, 'XTest_silent_echo')
" Check that the balloon shows up after a mouse move # Check that the balloon shows up after a mouse move
let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6}) var buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
call term_sendkeys(buf, ":abc") term_sendkeys(buf, ":abc")
call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {}) VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
" clean up # clean up
call StopVimInTerminal(buf) StopVimInTerminal(buf)
call delete('XTest_silent_echo') delete('XTest_silent_echo')
endfunc enddef
def SilentlyError() def SilentlyError()
execute('silent! invalid') execute('silent! invalid')
@@ -3165,6 +3168,41 @@ def Test_opfunc()
nunmap <F3> nunmap <F3>
enddef enddef
func Test_opfunc_error()
CheckScreendump
call Run_Test_opfunc_error()
endfunc
def Run_Test_opfunc_error()
# test that the error from Opfunc() is displayed right away
var lines =<< trim END
vim9script
def Opfunc(type: string)
try
eval [][0]
catch /nothing/ # error not caught
endtry
enddef
&operatorfunc = Opfunc
nnoremap <expr> l <SID>L()
def L(): string
return 'l'
enddef
'x'->repeat(10)->setline(1)
feedkeys('g@l', 'n')
feedkeys('llll')
END
call writefile(lines, 'XTest_opfunc_error')
var buf = RunVimInTerminal('-S XTest_opfunc_error', {rows: 6, wait_for_ruler: 0})
VerifyScreenDump(buf, 'Test_opfunc_error', {})
# clean up
StopVimInTerminal(buf)
delete('XTest_opfunc_error')
enddef
" this was crashing on exit " this was crashing on exit
def Test_nested_lambda_in_closure() def Test_nested_lambda_in_closure()
var lines =<< trim END var lines =<< trim END

View File

@@ -3173,6 +3173,15 @@ call_callback(
++callback_depth; ++callback_depth;
ret = call_func(callback->cb_name, len, rettv, argcount, argvars, &funcexe); ret = call_func(callback->cb_name, len, rettv, argcount, argvars, &funcexe);
--callback_depth; --callback_depth;
// When a :def function was called that uses :try an error would be turned
// into an exception. Need to give the error here.
if (need_rethrow && current_exception != NULL)
{
need_rethrow = FALSE;
handle_did_throw();
}
return ret; return ret;
} }

View File

@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3798,
/**/ /**/
3797, 3797,
/**/ /**/