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