Module: wine Branch: master Commit: 392a15cdc9b6797c64c54126acb72ea932b6d41e URL: https://gitlab.winehq.org/wine/wine/-/commit/392a15cdc9b6797c64c54126acb72ea...
Author: Gabriel Ivăncescu gabrielopcode@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@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