mshtml: Store function buffer size in dispex_data_t.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2016-07-05 22:46:11 +02:00 committed by Alexandre Julliard
parent dba85f124b
commit 392a41060c
1 changed files with 12 additions and 9 deletions

View File

@ -62,6 +62,7 @@ typedef struct {
struct dispex_data_t { struct dispex_data_t {
DWORD func_cnt; DWORD func_cnt;
DWORD func_size;
func_info_t *funcs; func_info_t *funcs;
func_info_t **name_table; func_info_t **name_table;
DWORD func_disp_cnt; DWORD func_disp_cnt;
@ -225,7 +226,7 @@ static BOOL is_arg_type_supported(VARTYPE vt)
return FALSE; return FALSE;
} }
static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUNCDESC *desc, ITypeInfo *dti) static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc, ITypeInfo *dti)
{ {
func_info_t *info; func_info_t *info;
HRESULT hres; HRESULT hres;
@ -239,8 +240,8 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN
} }
if(info == data->funcs+data->func_cnt) { if(info == data->funcs+data->func_cnt) {
if(data->func_cnt == *size) if(data->func_cnt == data->func_size)
data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t)); data->funcs = heap_realloc_zero(data->funcs, (data->func_size <<= 1)*sizeof(func_info_t));
info = data->funcs+data->func_cnt; info = data->funcs+data->func_cnt;
hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL); hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL);
@ -315,7 +316,7 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN
} }
} }
static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo, DWORD *size) static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo)
{ {
unsigned i = 7; /* skip IDispatch functions */ unsigned i = 7; /* skip IDispatch functions */
ITypeInfo *typeinfo; ITypeInfo *typeinfo;
@ -333,7 +334,7 @@ static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp
TRACE("adding...\n"); TRACE("adding...\n");
add_func_info(data, size, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo); add_func_info(data, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo);
ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc); ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc);
} }
@ -354,7 +355,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
{ {
const tid_t *tid; const tid_t *tid;
dispex_data_t *data; dispex_data_t *data;
DWORD size = 16, i; DWORD i;
ITypeInfo *dti; ITypeInfo *dti;
HRESULT hres; HRESULT hres;
@ -375,7 +376,8 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
} }
data->func_cnt = 0; data->func_cnt = 0;
data->func_disp_cnt = 0; data->func_disp_cnt = 0;
data->funcs = heap_alloc_zero(size*sizeof(func_info_t)); data->func_size = 16;
data->funcs = heap_alloc_zero(data->func_size*sizeof(func_info_t));
if (!data->funcs) { if (!data->funcs) {
heap_free (data); heap_free (data);
ERR("Out of memory\n"); ERR("Out of memory\n");
@ -384,18 +386,19 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
list_add_tail(&dispex_data_list, &data->entry); list_add_tail(&dispex_data_list, &data->entry);
for(tid = This->data->iface_tids; *tid; tid++) { for(tid = This->data->iface_tids; *tid; tid++) {
hres = process_interface(data, *tid, dti, &size); hres = process_interface(data, *tid, dti);
if(FAILED(hres)) if(FAILED(hres))
break; break;
} }
if(This->data->additional_tid) if(This->data->additional_tid)
process_interface(data, This->data->additional_tid, NULL, &size); process_interface(data, This->data->additional_tid, NULL);
if(!data->func_cnt) { if(!data->func_cnt) {
heap_free(data->funcs); heap_free(data->funcs);
data->name_table = NULL; data->name_table = NULL;
data->funcs = NULL; data->funcs = NULL;
data->func_size = 0;
return data; return data;
} }