From 0bfe8b441a2b862f6df5f6b5c4841240f43dde3e Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sun, 14 Dec 2014 17:54:00 +0100 Subject: [PATCH] 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 707fe7f0200..7f6d5c59aa2 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 a12384ff50b..d2f6c95ebb8 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 0e7489902b7..730ae2daf7e 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 = {