diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 609a64d8bb1a0541aafc847ba7dacdd867bea1e1..f6460841ef019c2ee4d7bfa0700f879641a97420 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -58,7 +58,7 @@ static void elem_vector_add(elem_vector *buf, HTMLElement *elem) #define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface) -#define HTMLELEM_NODE_THIS(node) ((HTMLElement *) node) +#define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface) static HRESULT WINAPI HTMLElement_QueryInterface(IHTMLElement *iface, REFIID riid, void **ppv) @@ -1140,19 +1140,6 @@ static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p) return HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len, p); } -static void HTMLElement_destructor(IUnknown *iface) -{ - HTMLElement *This = HTMLELEM_THIS(iface); - - if(This->destructor) - This->destructor(This->impl); - - if(This->nselem) - nsIDOMHTMLElement_Release(This->nselem); - - mshtml_free(This); -} - #undef HTMLELEM_THIS static const IHTMLElementVtbl HTMLElementVtbl = { @@ -1278,6 +1265,19 @@ HRESULT HTMLElement_QI(HTMLElement *This, REFIID riid, void **ppv) return HTMLDOMNode_QI(&This->node, riid, ppv); } +static void HTMLElement_destructor(HTMLDOMNode *iface) +{ + HTMLElement *This = HTMLELEM_NODE_THIS(iface); + + if(This->destructor) + This->destructor(This->impl); + + if(This->nselem) + nsIDOMHTMLElement_Release(This->nselem); + + mshtml_free(This); +} + HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode) { nsIDOMHTMLElement *nselem; diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 51837ceb453fc674c9c574b0aec2b8866305c97d..0e2c127f792059ff44b61acd9cb25dd5d24bc1c6 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -395,7 +395,7 @@ void release_nodes(HTMLDocument *This) next = iter->next; nsIDOMNode_Release(iter->nsnode); if(iter->destructor) - iter->destructor(iter->impl.unk); + iter->destructor(iter); else mshtml_free(iter); } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 3db047fd25a63eb1e224ea1418e774c861bce473..2a6c15c1e216cf5eecf0f126afa4c38d397081d7 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -253,7 +253,7 @@ struct BSCallback { struct HTMLDOMNode { const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl; - void (*destructor)(IUnknown*); + void (*destructor)(HTMLDOMNode*); union { IUnknown *unk; @@ -335,7 +335,8 @@ typedef struct { #define HTMLTEXTCONT(x) ((IHTMLTextContainer*) &(x)->lpHTMLTextContainerVtbl) -#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl))) +#define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc))) +#define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface) HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**); HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**);