comparison 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
comparison
equal deleted inserted replaced
33600:b59496c2797b 33601:28605af12602
1138 } 1138 }
1139 1139
1140 char_u *name = functv->vval.v_string; 1140 char_u *name = functv->vval.v_string;
1141 functv->vval.v_string = NULL; 1141 functv->vval.v_string = NULL;
1142 1142
1143 // If the deferred function is called after an exception, then only the
1144 // first statement in the function will be executed. Save and restore
1145 // the try/catch/throw exception state.
1146 int save_trylevel = trylevel;
1147 int save_did_throw = did_throw;
1148 int save_need_rethrow = need_rethrow;
1149
1150 trylevel = 0;
1151 did_throw = FALSE;
1152 need_rethrow = FALSE;
1153
1143 (void)call_func(name, -1, &rettv, argcount, argvars, &funcexe); 1154 (void)call_func(name, -1, &rettv, argcount, argvars, &funcexe);
1155
1156 trylevel = save_trylevel;
1157 did_throw = save_did_throw;
1158 need_rethrow = save_need_rethrow;
1144 1159
1145 clear_tv(&rettv); 1160 clear_tv(&rettv);
1146 vim_free(name); 1161 vim_free(name);
1147 } 1162 }
1148 } 1163 }