0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.1.1575: callbacks may be garbage collected

Problem:    Callbacks may be garbage collected.
Solution:   Set reference in callbacks. (Ozaki Kiichi, closes #4564)
This commit is contained in:
Bram Moolenaar
2019-06-20 03:45:36 +02:00
parent a3fce62c91
commit 75a1a9415b
13 changed files with 164 additions and 7 deletions

View File

@@ -2140,4 +2140,50 @@ update_popups(void (*win_update)(win_T *wp))
}
}
/*
* Mark references in callbacks of one popup window.
*/
static int
set_ref_in_one_popup(win_T *wp, int copyID)
{
int abort = FALSE;
typval_T tv;
if (wp->w_close_cb.cb_partial != NULL)
{
tv.v_type = VAR_PARTIAL;
tv.vval.v_partial = wp->w_close_cb.cb_partial;
abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
}
if (wp->w_filter_cb.cb_partial != NULL)
{
tv.v_type = VAR_PARTIAL;
tv.vval.v_partial = wp->w_filter_cb.cb_partial;
abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
}
return abort;
}
/*
* Set reference in callbacks of popup windows.
*/
int
set_ref_in_popups(int copyID)
{
int abort = FALSE;
win_T *wp;
tabpage_T *tp;
for (wp = first_popupwin; !abort && wp != NULL; wp = wp->w_next)
abort = abort || set_ref_in_one_popup(wp, copyID);
FOR_ALL_TABPAGES(tp)
{
for (wp = tp->tp_first_popupwin; !abort && wp != NULL; wp = wp->w_next)
abort = abort || set_ref_in_one_popup(wp, copyID);
if (abort)
break;
}
return abort;
}
#endif // FEAT_TEXT_PROP