Mercurial > vim
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)