patch 9.0.2050: Vim9: crash with deferred function call and exception

Problem:  Vim9: crash with deferred function call and exception
Solution: Save and restore exception state

Crash when a deferred function is called after an exception and another
exception is thrown

closes: #13376
closes: #13377

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
diff --git a/src/userfunc.c b/src/userfunc.c
index 092b392..5ef0f7d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -6252,21 +6252,16 @@
 	dr->dr_name = 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;
+	// first statement in the function will be executed (because of the
+	// exception).  So save and restore the try/catch/throw exception
+	// state.
+	exception_state_T estate;
+	exception_state_save(&estate);
+	exception_state_clear();
 
 	call_func(name, -1, &rettv, dr->dr_argcount, dr->dr_argvars, &funcexe);
 
-	trylevel = save_trylevel;
-	did_throw = save_did_throw;
-	need_rethrow = save_need_rethrow;
+	exception_state_restore(&estate);
 
 	clear_tv(&rettv);
 	vim_free(name);