Jacek Caban : mshtml: Make node object' s dynamic IDispatchEx-based properties cycle collectable.
Alexandre Julliard
julliard at winehq.org
Thu Jul 19 13:23:44 CDT 2012
Module: wine
Branch: master
Commit: e9cc7676fa239264598570f1cd800475d61bca36
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e9cc7676fa239264598570f1cd800475d61bca36
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 19 11:28:54 2012 +0200
mshtml: Make node object's dynamic IDispatchEx-based properties cycle collectable.
---
dlls/mshtml/dispex.c | 32 ++++++++++++++++++++++++++++++++
dlls/mshtml/htmlnode.c | 3 +++
dlls/mshtml/mshtml_private.h | 2 ++
3 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index bbe6098..b2024d4 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -1377,6 +1377,38 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
return TRUE;
}
+void dispex_traverse(DispatchEx *This, nsCycleCollectionTraversalCallback *cb)
+{
+ dynamic_prop_t *prop;
+
+ if(!This->dynamic_data)
+ return;
+
+ for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) {
+ if(V_VT(&prop->var) == VT_DISPATCH)
+ note_cc_edge((nsISupports*)V_DISPATCH(&prop->var), "dispex_data", cb);
+ }
+
+ /* FIXME: Traverse func_disps */
+}
+
+void dispex_unlink(DispatchEx *This)
+{
+ dynamic_prop_t *prop;
+
+ if(!This->dynamic_data)
+ return;
+
+ for(prop = This->dynamic_data->props; prop < This->dynamic_data->props + This->dynamic_data->prop_cnt; prop++) {
+ if(V_VT(&prop->var) == VT_DISPATCH) {
+ V_VT(&prop->var) = VT_EMPTY;
+ IDispatch_Release(V_DISPATCH(&prop->var));
+ }else {
+ VariantClear(&prop->var);
+ }
+ }
+}
+
void release_dispex(DispatchEx *This)
{
dynamic_prop_t *prop;
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index f33df64..2afcb23 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -1123,6 +1123,7 @@ static nsresult NSAPI HTMLDOMNode_traverse(void *ccp, void *p, nsCycleCollection
if(This->nsnode)
note_cc_edge((nsISupports*)This->nsnode, "This->nsnode", cb);
+ dispex_traverse(&This->dispex, cb);
return NS_OK;
}
@@ -1133,6 +1134,8 @@ static nsresult NSAPI HTMLDOMNode_unlink(void *p)
TRACE("%p\n", This);
+ dispex_unlink(&This->dispex);
+
if(This->nsnode) {
nsIDOMNode *nsnode = This->nsnode;
This->nsnode = NULL;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index efa6f52..803d214 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -258,6 +258,8 @@ HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**) DECLSPEC_H
HRESULT get_dispids(tid_t,DWORD*,DISPID**) DECLSPEC_HIDDEN;
HRESULT remove_prop(DispatchEx*,BSTR,VARIANT_BOOL*) DECLSPEC_HIDDEN;
HRESULT dispex_get_dynid(DispatchEx*,const WCHAR*,DISPID*) DECLSPEC_HIDDEN;
+void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
+void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
void release_typelib(void) DECLSPEC_HIDDEN;
HRESULT get_htmldoc_classinfo(ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list