Jacek Caban : mshtml: Preprocess typelib data in init_dispex.
Alexandre Julliard
julliard at winehq.org
Wed Jul 6 09:57:30 CDT 2016
Module: wine
Branch: master
Commit: bb4227d6d5ffb9b9c7d6b73c91f5fec4d7af3353
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb4227d6d5ffb9b9c7d6b73c91f5fec4d7af3353
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Jul 5 22:46:23 2016 +0200
mshtml: Preprocess typelib data in init_dispex.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/dispex.c | 31 +++++++++++++------------------
1 file changed, 13 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 09f0250..7af2854 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -351,7 +351,7 @@ static int func_name_cmp(const void *p1, const void *p2)
return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name);
}
-static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
+static dispex_data_t *preprocess_dispex_data(const dispex_static_data_t *desc)
{
const tid_t *tid;
dispex_data_t *data;
@@ -359,10 +359,8 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
ITypeInfo *dti;
HRESULT hres;
- TRACE("(%p)\n", This);
-
- if(This->data->disp_tid) {
- hres = get_typeinfo(This->data->disp_tid, &dti);
+ if(desc->disp_tid) {
+ hres = get_typeinfo(desc->disp_tid, &dti);
if(FAILED(hres)) {
ERR("Could not get disp type info: %08x\n", hres);
return NULL;
@@ -385,14 +383,14 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
}
list_add_tail(&dispex_data_list, &data->entry);
- for(tid = This->data->iface_tids; *tid; tid++) {
+ for(tid = desc->iface_tids; *tid; tid++) {
hres = process_interface(data, *tid, dti);
if(FAILED(hres))
break;
}
- if(This->data->additional_tid)
- process_interface(data, This->data->additional_tid, NULL);
+ if(desc->additional_tid)
+ process_interface(data, desc->additional_tid, NULL);
if(!data->func_cnt) {
heap_free(data->funcs);
@@ -470,16 +468,6 @@ HRESULT get_dispids(tid_t tid, DWORD *ret_size, DISPID **ret)
static dispex_data_t *get_dispex_data(DispatchEx *This)
{
- if(This->data->data)
- return This->data->data;
-
- EnterCriticalSection(&cs_dispex_static_data);
-
- if(!This->data->data)
- This->data->data = preprocess_dispex_data(This);
-
- LeaveCriticalSection(&cs_dispex_static_data);
-
return This->data->data;
}
@@ -1777,6 +1765,13 @@ void release_dispex(DispatchEx *This)
void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data)
{
+ if(!data->data) {
+ EnterCriticalSection(&cs_dispex_static_data);
+ if(!data->data)
+ data->data = preprocess_dispex_data(data);
+ LeaveCriticalSection(&cs_dispex_static_data);
+ }
+
dispex->IDispatchEx_iface.lpVtbl = &DispatchExVtbl;
dispex->outer = outer;
dispex->data = data;
More information about the wine-cvs
mailing list