Jacek Caban : mshtml: Resolve duplicated IDispatch entries as soon as they are processed.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 15 15:32:05 CST 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Dec 14 17:54:00 2014 +0100

mshtml: Resolve duplicated IDispatch entries as soon as they are processed.

---

 dlls/mshtml/dispex.c     | 28 +++++++++-------------------
 dlls/mshtml/htmlobject.c |  4 ++--
 dlls/mshtml/htmlstyle.c  | 10 +++++-----
 3 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 707fe7f..7f6d5c5 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -230,9 +230,15 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN
     func_info_t *info;
     HRESULT hres;
 
-    if(data->func_cnt && data->funcs[data->func_cnt-1].id == desc->memid) {
-        info = data->funcs+data->func_cnt-1;
-    }else {
+    for(info = data->funcs; info < data->funcs+data->func_cnt; info++) {
+        if(info->id == desc->memid) {
+            if(info->tid != tid)
+                return; /* Duplicated in other interface */
+            break;
+        }
+    }
+
+    if(info == data->funcs+data->func_cnt) {
         if(data->func_cnt == *size)
             data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t));
 
@@ -373,22 +379,6 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
     data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t));
     qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp);
 
-    for(i = 1; i < data->func_cnt && data->funcs[i-1].id != data->funcs[i].id; i++);
-    if(i < data->func_cnt) {
-        unsigned j = i--;
-
-        /* We have at least one duplicated property. This may happen if more than one
-         * interface implements the same property. We have to remove these duplicated
-         * entries. */
-
-        while(j < data->func_cnt) {
-            while(j+1 < data->func_cnt && data->funcs[j+1].id == data->funcs[j].id)
-                j++;
-            data->funcs[i++] = data->funcs[j++];
-        }
-        data->func_cnt = i;
-    }
-
     data->name_table = heap_alloc(data->func_cnt * sizeof(func_info_t*));
     for(i=0; i < data->func_cnt; i++)
         data->name_table[i] = data->funcs+i;
diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c
index a12384f..d2f6c95 100644
--- a/dlls/mshtml/htmlobject.c
+++ b/dlls/mshtml/htmlobject.c
@@ -766,9 +766,9 @@ static const NodeImplVtbl HTMLObjectElementImplVtbl = {
 };
 
 static const tid_t HTMLObjectElement_iface_tids[] = {
-    HTMLELEMENT_TIDS,
-    IHTMLObjectElement_tid,
     IHTMLObjectElement2_tid,
+    IHTMLObjectElement_tid,
+    HTMLELEMENT_TIDS,
     0
 };
 static dispex_static_data_t HTMLObjectElement_dispex = {
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 0e74899..730ae2d 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -3154,12 +3154,12 @@ static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = {
 };
 
 static const tid_t HTMLStyle_iface_tids[] = {
-    IHTMLStyle_tid,
-    IHTMLStyle2_tid,
-    IHTMLStyle3_tid,
-    IHTMLStyle4_tid,
-    IHTMLStyle5_tid,
     IHTMLStyle6_tid,
+    IHTMLStyle5_tid,
+    IHTMLStyle4_tid,
+    IHTMLStyle3_tid,
+    IHTMLStyle2_tid,
+    IHTMLStyle_tid,
     0
 };
 static dispex_static_data_t HTMLStyle_dispex = {




More information about the wine-cvs mailing list