Gabriel Ivăncescu : mshtml: Unlink variants using a helper function.
Module: wine Branch: master Commit: 392a15cdc9b6797c64c54126acb72ea932b6d41e URL: https://gitlab.winehq.org/wine/wine/-/commit/392a15cdc9b6797c64c54126acb72ea... Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Thu Aug 3 15:56:12 2023 +0300 mshtml: Unlink variants using a helper function. And move the clear to the destructor. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/mshtml/dispex.c | 2 +- dlls/mshtml/htmlevent.c | 18 ++++++++++++++++-- dlls/mshtml/htmlwindow.c | 4 +++- dlls/mshtml/mshtml_private.h | 6 ++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 09782fb83c9..6bd2c9cf6cb 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2030,8 +2030,8 @@ void dispex_unlink(DispatchEx *This) return; for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) { - VariantClear(&prop->var); prop->flags |= DYNPROP_DELETED; + unlink_variant(&prop->var); } if(This->dynamic_data->func_disps) { diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 2c518464246..6b5ea716a75 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2462,7 +2462,14 @@ static void DOMCustomEvent_unlink(DispatchEx *dispex) { DOMCustomEvent *custom_event = DOMCustomEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); DOMEvent_unlink(&custom_event->event.dispex); + unlink_variant(&custom_event->detail); +} + +static void DOMCustomEvent_destructor(DispatchEx *dispex) +{ + DOMCustomEvent *custom_event = DOMCustomEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); VariantClear(&custom_event->detail); + DOMEvent_destructor(dispex); } typedef struct { @@ -2607,7 +2614,14 @@ static void DOMMessageEvent_unlink(DispatchEx *dispex) { DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); DOMEvent_unlink(&message_event->event.dispex); + unlink_variant(&message_event->data); +} + +static void DOMMessageEvent_destructor(DispatchEx *dispex) +{ + DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(DOMEvent_from_DispatchEx(dispex)); VariantClear(&message_event->data); + DOMEvent_destructor(dispex); } static void DOMMessageEvent_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode) @@ -3038,7 +3052,7 @@ static dispex_static_data_t DOMPageTransitionEvent_dispex = { }; static const dispex_static_data_vtbl_t DOMCustomEvent_dispex_vtbl = { - DOMEvent_destructor, + DOMCustomEvent_destructor, DOMCustomEvent_unlink }; @@ -3056,7 +3070,7 @@ static dispex_static_data_t DOMCustomEvent_dispex = { }; static const dispex_static_data_vtbl_t DOMMessageEvent_dispex_vtbl = { - DOMEvent_destructor, + DOMMessageEvent_destructor, DOMMessageEvent_unlink }; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 9ebea7f8b57..a90a0da2dde 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3777,7 +3777,7 @@ static void HTMLWindow_unlink(DispatchEx *dispex) IHTMLStorage_Release(local_storage); } IHTMLPerformanceTiming_Release(&This->performance_timing->IHTMLPerformanceTiming_iface); - VariantClear(&This->performance); + unlink_variant(&This->performance); } static void HTMLWindow_destructor(DispatchEx *dispex) @@ -3785,6 +3785,8 @@ static void HTMLWindow_destructor(DispatchEx *dispex) HTMLInnerWindow *This = impl_from_DispatchEx(dispex); unsigned i; + VariantClear(&This->performance); + for(i = 0; i < This->global_prop_cnt; i++) free(This->global_props[i].name); free(This->global_props); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index ff6294749cd..6d57a314870 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1497,6 +1497,12 @@ static inline void unlink_ref(void *p) } } +static inline void unlink_variant(VARIANT *v) +{ + if(V_VT(v) == VT_DISPATCH || V_VT(v) == VT_UNKNOWN) + unlink_ref(&V_UNKNOWN(v)); +} + #ifdef __i386__ extern void *call_thiscall_func; #endif
participants (1)
-
Alexandre Julliard