From: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/dispex.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 1d00012572b..5b72f712b92 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2003,7 +2003,17 @@ void dispex_traverse(DispatchEx *This, nsCycleCollectionTraversalCallback *cb) note_cc_edge((nsISupports*)V_DISPATCH(&prop->var), "dispex_data", cb); } - /* FIXME: Traverse func_disps */ + if(This->dynamic_data->func_disps) { + func_obj_entry_t *iter = This->dynamic_data->func_disps, *end = iter + This->info->func_disp_cnt; + + for(iter = This->dynamic_data->func_disps; iter < end; iter++) { + if(!iter->func_obj) + continue; + note_cc_edge((nsISupports*)&iter->func_obj->dispex.IDispatchEx_iface, "func_obj", cb); + if(V_VT(&iter->val) == VT_DISPATCH) + note_cc_edge((nsISupports*)V_DISPATCH(&iter->val), "func_val", cb); + } + } } void dispex_unlink(DispatchEx *This) @@ -2021,6 +2031,21 @@ void dispex_unlink(DispatchEx *This) VariantClear(&prop->var); } } + + if(This->dynamic_data->func_disps) { + func_obj_entry_t *iter = This->dynamic_data->func_disps, *end = iter + This->info->func_disp_cnt; + + for(iter = This->dynamic_data->func_disps; iter < end; iter++) { + if(!iter->func_obj) + continue; + iter->func_obj->obj = NULL; + IDispatchEx_Release(&iter->func_obj->dispex.IDispatchEx_iface); + VariantClear(&iter->val); + } + + free(This->dynamic_data->func_disps); + This->dynamic_data->func_disps = NULL; + } } const void *dispex_get_vtbl(DispatchEx *dispex) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2069