diff src/vim9execute.c @ 33601:28605af12602 v9.0.2044

patch 9.0.2044: Vim9: exceptions confuse defered functions Commit: https://github.com/vim/vim/commit/0672595fd50e9ae668676a40e28ebf66d7f52392 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Wed Oct 18 11:47:37 2023 +0200 patch 9.0.2044: Vim9: exceptions confuse defered functions Problem: Vim9: exceptions confuse defered functions Solution: save and restore exception state when calling defered functions closes: #13364 closes: #13372 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author Christian Brabandt <cb@256bit.org>
date Wed, 18 Oct 2023 12:00:05 +0200
parents c470d4fd5eba
children 31fb1a760ad6
line wrap: on
line diff
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1140,8 +1140,23 @@ invoke_defer_funcs(ectx_T *ectx)
 	char_u *name = functv->vval.v_string;
 	functv->vval.v_string = NULL;
 
+	// If the deferred function is called after an exception, then only the
+	// first statement in the function will be executed.  Save and restore
+	// the try/catch/throw exception state.
+	int save_trylevel = trylevel;
+	int save_did_throw = did_throw;
+	int save_need_rethrow = need_rethrow;
+
+	trylevel = 0;
+	did_throw = FALSE;
+	need_rethrow = FALSE;
+
 	(void)call_func(name, -1, &rettv, argcount, argvars, &funcexe);
 
+	trylevel = save_trylevel;
+	did_throw = save_did_throw;
+	need_rethrow = save_need_rethrow;
+
 	clear_tv(&rettv);
 	vim_free(name);
     }