Commit 0bfe8b44 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

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

parent a9c00c66
......@@ -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;
......
......@@ -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 = {
......
......@@ -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 = {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment