Module: wine Branch: master Commit: 6a2ca11c654352dd169c331b4a140c30ae3e45b5 URL: https://gitlab.winehq.org/wine/wine/-/commit/6a2ca11c654352dd169c331b4a140c3...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Tue Aug 1 19:45:24 2023 +0300
mshtml: Use unlink and destructor in the vtbl for function disps.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/dispex.c | 23 ++++++++++++++++++----- dlls/mshtml/htmldoc.c | 2 ++ dlls/mshtml/htmlelem.c | 10 ++++++++++ dlls/mshtml/htmlelemcol.c | 2 ++ dlls/mshtml/htmlimg.c | 2 ++ dlls/mshtml/htmlnode.c | 2 ++ dlls/mshtml/htmlselect.c | 2 ++ dlls/mshtml/htmlstorage.c | 2 ++ dlls/mshtml/htmlstyle.c | 2 ++ dlls/mshtml/htmlstylesheet.c | 4 ++++ dlls/mshtml/htmlwindow.c | 2 ++ dlls/mshtml/mshtml_private.h | 4 ++++ dlls/mshtml/xmlhttprequest.c | 2 ++ 13 files changed, 54 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index fecc7f6690c..09782fb83c9 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -826,11 +826,8 @@ static ULONG WINAPI Function_Release(IUnknown *iface)
TRACE("(%p) ref=%ld\n", This, ref);
- if(!ref) { - assert(!This->obj); + if(!ref) release_dispex(&This->dispex); - free(This); - }
return ref; } @@ -846,6 +843,13 @@ static inline func_disp_t *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, func_disp_t, dispex); }
+static void function_destructor(DispatchEx *dispex) +{ + func_disp_t *This = impl_from_DispatchEx(dispex); + assert(!This->obj); + free(This); +} + static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { @@ -902,6 +906,8 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR }
static const dispex_static_data_vtbl_t function_dispex_vtbl = { + function_destructor, + NULL, function_value, NULL, NULL, @@ -2053,8 +2059,11 @@ void release_dispex(DispatchEx *This) { dynamic_prop_t *prop;
+ if(This->info->desc->vtbl && This->info->desc->vtbl->unlink) + This->info->desc->vtbl->unlink(This); + if(!This->dynamic_data) - return; + goto destructor;
for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) { VariantClear(&prop->var); @@ -2078,6 +2087,10 @@ void release_dispex(DispatchEx *This) }
free(This->dynamic_data); + +destructor: + if(This->info->desc->vtbl && This->info->desc->vtbl->destructor) + This->info->desc->vtbl->destructor(This); }
void init_dispatch(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data, compat_mode_t compat_mode) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 6777debecd0..23b0064c9a6 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -6086,6 +6086,8 @@ static HRESULT HTMLDocumentNode_location_hook(DispatchEx *dispex, WORD flags, DI
static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { { + NULL, + NULL, NULL, NULL, HTMLDocumentNode_get_name, diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 53c418ab333..f9ab44ce5fc 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1269,6 +1269,8 @@ static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lci }
static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLRectCollection_get_dispid, HTMLRectCollection_get_name, @@ -7328,6 +7330,8 @@ static const tid_t HTMLElement_iface_tids[] = {
const event_target_vtbl_t HTMLElement_event_target_vtbl = { { + NULL, + NULL, NULL, HTMLElement_get_dispid, HTMLElement_get_name, @@ -7795,6 +7799,8 @@ static HRESULT token_list_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD }
static const dispex_static_data_vtbl_t token_list_dispex_vtbl = { + NULL, + NULL, token_list_value, token_list_get_dispid, token_list_get_name, @@ -8211,6 +8217,8 @@ static HRESULT HTMLFiltersCollection_invoke(DispatchEx *dispex, DISPID id, LCID }
static const dispex_static_data_vtbl_t HTMLFiltersCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLFiltersCollection_get_dispid, HTMLFiltersCollection_get_name, @@ -8967,6 +8975,8 @@ static HRESULT HTMLAttributeCollection_invoke(DispatchEx *dispex, DISPID id, LCI }
static const dispex_static_data_vtbl_t HTMLAttributeCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLAttributeCollection_get_dispid, HTMLAttributeCollection_get_name, diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index 75ee079e3c7..afd7104c476 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -622,6 +622,8 @@ static HRESULT HTMLElementCollection_invoke(DispatchEx *dispex, DISPID id, LCID }
static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLElementCollection_get_dispid, HTMLElementCollection_get_name, diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index d624c0e9df6..e0ade235c01 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -975,6 +975,8 @@ static const tid_t HTMLImageElementFactory_iface_tids[] = { };
static const dispex_static_data_vtbl_t HTMLImageElementFactory_dispex_vtbl = { + NULL, + NULL, HTMLImageElementFactory_value, NULL, NULL, diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index b20c1decddb..0b509eca79a 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -433,6 +433,8 @@ static HRESULT HTMLDOMChildrenCollection_invoke(DispatchEx *dispex, DISPID id, L }
static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLDOMChildrenCollection_get_dispid, HTMLDOMChildrenCollection_get_name, diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 31410e9f0f0..cbbd9ebcc69 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -629,6 +629,8 @@ static const tid_t HTMLOptionElementFactory_iface_tids[] = { };
static const dispex_static_data_vtbl_t HTMLOptionElementFactory_dispex_vtbl = { + NULL, + NULL, HTMLOptionElementFactory_value, NULL, NULL, diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 24eec4ba078..da97809177b 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -1308,6 +1308,8 @@ static HRESULT HTMLStorage_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pi }
static const dispex_static_data_vtbl_t HTMLStorage_dispex_vtbl = { + NULL, + NULL, NULL, HTMLStorage_get_dispid, HTMLStorage_get_name, diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index c8dc69bb2af..766a9306b05 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -9997,6 +9997,8 @@ void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) }
const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl = { + NULL, + NULL, NULL, CSSStyle_get_dispid, NULL, diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index 59680d720e2..73d94d1f2c0 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -466,6 +466,8 @@ static HRESULT HTMLStyleSheetRulesCollection_invoke(DispatchEx *dispex, DISPID i }
static const dispex_static_data_vtbl_t HTMLStyleSheetRulesCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLStyleSheetRulesCollection_get_dispid, HTMLStyleSheetRulesCollection_get_name, @@ -893,6 +895,8 @@ static HRESULT HTMLStyleSheetsCollection_invoke(DispatchEx *dispex, DISPID id, L }
static const dispex_static_data_vtbl_t HTMLStyleSheetsCollection_dispex_vtbl = { + NULL, + NULL, NULL, HTMLStyleSheetsCollection_get_dispid, HTMLStyleSheetsCollection_get_name, diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 5abe13c96e6..f603a33016c 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4028,6 +4028,8 @@ static IHTMLEventObj *HTMLWindow_set_current_event(DispatchEx *dispex, IHTMLEven
static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { { + NULL, + NULL, NULL, NULL, HTMLWindow_get_name, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c0274bd8aac..ff6294749cd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -347,6 +347,10 @@ typedef struct DispatchEx DispatchEx; - dynamic props: These props are generally allocated by external code (e.g. 'document.wine = 42' creates 'wine' dynamic prop on document) */ typedef struct { + /* Unlike delete_cycle_collectable, unlink is called before the destructor (if available). */ + void (*destructor)(DispatchEx*); + void (*unlink)(DispatchEx*); + /* Called when the object wants to handle DISPID_VALUE invocations */ HRESULT (*value)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 17f29396b8f..4803b5c55a1 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -1790,6 +1790,8 @@ static HRESULT HTMLXMLHttpRequestFactory_value(DispatchEx *iface, LCID lcid, WOR }
static const dispex_static_data_vtbl_t HTMLXMLHttpRequestFactory_dispex_vtbl = { + NULL, + NULL, HTMLXMLHttpRequestFactory_value };