patch 8.2.2097: Vim9: using :silent! when calling a function prevents abort
Problem: Vim9: using :silent! when calling a function prevents abortng that
function.
Solution: Add emsg_silent_def and did_emsg_def.
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 980ebb5..7e8b336 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -851,6 +851,8 @@
msglist_T *private_msg_list = NULL;
cmdmod_T save_cmdmod;
int restore_cmdmod = FALSE;
+ int save_emsg_silent_def = emsg_silent_def;
+ int save_did_emsg_def = did_emsg_def;
int trylevel_at_start = trylevel;
int orig_funcdepth;
@@ -1021,6 +1023,11 @@
// Do turn errors into exceptions.
suppress_errthrow = FALSE;
+ // When ":silent!" was used before calling then we still abort the
+ // function. If ":silent!" is used in the function then we don't.
+ emsg_silent_def = emsg_silent;
+ did_emsg_def = 0;
+
// Decide where to start execution, handles optional arguments.
init_instr_idx(ufunc, argc, &ectx);
@@ -3008,8 +3015,10 @@
on_error:
// Jump here for an error that does not require aborting execution.
- // If "emsg_silent" is set then ignore the error.
- if (did_emsg_cumul + did_emsg == did_emsg_before && emsg_silent)
+ // If "emsg_silent" is set then ignore the error, unless it was set
+ // when calling the function.
+ if (did_emsg_cumul + did_emsg == did_emsg_before
+ && emsg_silent && did_emsg_def == 0)
continue;
on_fatal_error:
// Jump here for an error that messes up the stack.
@@ -3056,6 +3065,8 @@
undo_cmdmod(&cmdmod);
cmdmod = save_cmdmod;
}
+ emsg_silent_def = save_emsg_silent_def;
+ did_emsg_def += save_did_emsg_def;
failed_early:
// Free all local variables, but not arguments.