patch 8.2.3788: lambda for option that is a function may be freed
Problem: Lambda for option that is a function may be garbage collected.
Solution: Set a reference in the funcref. (Yegappan Lakshmanan,
closes #9330)
diff --git a/src/gui_xim.c b/src/gui_xim.c
index 6d72ef1..4bd1a2e 100644
--- a/src/gui_xim.c
+++ b/src/gui_xim.c
@@ -117,7 +117,7 @@
void
free_xim_stuff(void)
{
-#if defined(FEAT_EVAL) && \
+# if defined(FEAT_EVAL) && \
(defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))
free_callback(&imaf_cb);
free_callback(&imsf_cb);
@@ -125,6 +125,24 @@
}
#endif
+/*
+ * Mark the global 'imactivatefunc' and 'imstatusfunc' callbacks with 'copyID'
+ * so that they are not garbage collected.
+ */
+ int
+set_ref_in_im_funcs(int copyID UNUSED)
+{
+ int abort = FALSE;
+
+#if defined(FEAT_EVAL) && \
+ (defined(FEAT_XIM) || defined(IME_WITHOUT_XIM) || defined(VIMDLL))
+ abort = set_ref_in_callback(&imaf_cb, copyID);
+ abort = abort || set_ref_in_callback(&imsf_cb, copyID);
+#endif
+
+ return abort;
+}
+
#if defined(FEAT_XIM) || defined(PROTO)