diff src/gui_xim.c @ 26518:13ba00ef7687 v8.2.3788

patch 8.2.3788: lambda for option that is a function may be freed Commit: https://github.com/vim/vim/commit/6ae8fae8696623b527c7fb22567f6a3705b2f0dd Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sun Dec 12 16:26:44 2021 +0000 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)
author Bram Moolenaar <Bram@vim.org>
date Sun, 12 Dec 2021 17:30:04 +0100
parents 8f17f8f327f3
children d02d40f0261c
line wrap: on
line diff
--- a/src/gui_xim.c
+++ b/src/gui_xim.c
@@ -117,7 +117,7 @@ call_imstatusfunc(void)
     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 @@ free_xim_stuff(void)
 }
 #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)