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:
@@ -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
|
||||
|
Reference in New Issue
Block a user