patch 8.2.2614: Vim9: function is deleted while executing
Problem: Vim9: function is deleted while executing.
Solution: increment the call count, when more than zero do not delete the
function but mark it as dead. (closes #7977)
diff --git a/src/vim9execute.c b/src/vim9execute.c
index c0a4874..6b8cd07 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -323,6 +323,8 @@
else
ectx->ec_outer = NULL;
+ ++ufunc->uf_calls;
+
// Set execution state to the start of the called function.
ectx->ec_dfunc_idx = cdf_idx;
ectx->ec_instr = INSTRUCTIONS(dfunc);
@@ -556,6 +558,9 @@
}
}
#endif
+ // TODO: when is it safe to delete the function when it is no longer used?
+ --dfunc->df_ufunc->uf_calls;
+
// execution context goes one level up
entry = estack_pop();
if (entry != NULL)
@@ -1334,7 +1339,7 @@
++ectx.ec_stack.ga_len;
}
if (ufunc->uf_va_name != NULL)
- ++ectx.ec_stack.ga_len;
+ ++ectx.ec_stack.ga_len;
// Frame pointer points to just after arguments.
ectx.ec_frame_idx = ectx.ec_stack.ga_len;
@@ -1407,6 +1412,9 @@
// Do turn errors into exceptions.
suppress_errthrow = FALSE;
+ // Do not delete the function while executing it.
+ ++ufunc->uf_calls;
+
// 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;
@@ -3838,6 +3846,9 @@
estack_pop();
current_sctx = save_current_sctx;
+ // TODO: when is it safe to delete the function if it is no longer used?
+ --ufunc->uf_calls;
+
if (*msg_list != NULL && saved_msg_list != NULL)
{
msglist_T **plist = saved_msg_list;