Jacek Caban : mshtml: Added a helper to get vtbl from DispatchEx and use it to access vtbl outside dispex.c.

Alexandre Julliard julliard at winehq.org
Wed Jul 6 09:57:30 CDT 2016


Module: wine
Branch: master
Commit: dba85f124b10c883b111231e891af9c510fac143
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dba85f124b10c883b111231e891af9c510fac143

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jul  5 22:46:01 2016 +0200

mshtml: Added a helper to get vtbl from DispatchEx and use it to access vtbl outside dispex.c.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/dispex.c         |  5 +++++
 dlls/mshtml/htmlelem.c       |  2 +-
 dlls/mshtml/htmlevent.c      | 10 ++++++----
 dlls/mshtml/htmlwindow.c     |  2 +-
 dlls/mshtml/mshtml_private.h |  1 +
 5 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 4ab2944..7c40d47 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -1736,6 +1736,11 @@ void dispex_unlink(DispatchEx *This)
     }
 }
 
+const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx *dispex)
+{
+    return dispex->data->vtbl;
+}
+
 void release_dispex(DispatchEx *This)
 {
     dynamic_prop_t *prop;
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 05ed66b..5fdbab0 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -5093,7 +5093,7 @@ static void HTMLElement_bind_event(DispatchEx *dispex, int eid)
         add_nsevent_listener(This->node.doc, This->node.nsnode, loadW);
         return;
     default:
-        This->node.doc->node.event_target.dispex.data->vtbl->bind_event(&This->node.doc->node.event_target.dispex, eid);
+        dispex_get_vtbl(&This->node.doc->node.event_target.dispex)->bind_event(&This->node.doc->node.event_target.dispex, eid);
     }
 }
 
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 4bf168f..c2eeb7d 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -901,10 +901,11 @@ HRESULT create_event_obj(IHTMLEventObj **ret)
 
 static inline event_target_t *get_event_target_data(EventTarget *event_target, BOOL alloc)
 {
+    const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex);
     event_target_t **ptr;
 
-    ptr = event_target->dispex.data->vtbl && event_target->dispex.data->vtbl->get_event_target_ptr
-        ? event_target->dispex.data->vtbl->get_event_target_ptr(&event_target->dispex)
+    ptr = vtbl && vtbl->get_event_target_ptr
+        ? vtbl->get_event_target_ptr(&event_target->dispex)
         : &event_target->ptr;
     if(*ptr || !alloc)
         return *ptr;
@@ -1394,8 +1395,9 @@ void detach_events(HTMLDocumentNode *doc)
 /* Caller should ensure that it's called only once for given event in the target. */
 static void bind_event(EventTarget *event_target, eventid_t eid)
 {
-    if(event_target->dispex.data->vtbl->bind_event)
-        event_target->dispex.data->vtbl->bind_event(&event_target->dispex, eid);
+    const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex);
+    if(vtbl->bind_event)
+        vtbl->bind_event(&event_target->dispex, eid);
     else
         FIXME("Unsupported event binding on target %p\n", event_target);
 }
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 7484681..b75c9ba 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -2933,7 +2933,7 @@ static event_target_t **HTMLWindow_get_event_target_ptr(DispatchEx *dispex)
 static void HTMLWindow_bind_event(DispatchEx *dispex, int eid)
 {
     HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
-    This->doc->node.event_target.dispex.data->vtbl->bind_event(&This->doc->node.event_target.dispex, eid);
+    dispex_get_vtbl(&This->doc->node.event_target.dispex)->bind_event(&This->doc->node.event_target.dispex, eid);
 }
 
 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f6cf1a0..0e75c2f 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -303,6 +303,7 @@ void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_H
 void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
 void release_typelib(void) DECLSPEC_HIDDEN;
 HRESULT get_htmldoc_classinfo(ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
+const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx*) DECLSPEC_HIDDEN;
 
 typedef enum {
     DISPEXPROP_CUSTOM,




More information about the wine-cvs mailing list