Nikolay Sivov : oleaut32/typelib: Add a helper to update custom data lists on reallocation.
Alexandre Julliard
julliard at winehq.org
Fri Dec 6 16:06:38 CST 2019
Module: wine
Branch: master
Commit: 81908349d2e7f14ad43bb36e6ea000866139764d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=81908349d2e7f14ad43bb36e6ea000866139764d
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Dec 6 12:45:47 2019 +0300
oleaut32/typelib: Add a helper to update custom data lists on reallocation.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/oleaut32/typelib.c | 45 ++++++++++++++++++---------------------------
1 file changed, 18 insertions(+), 27 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 1971a41570..6d96cc5fbe 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1871,6 +1871,18 @@ static HRESULT TLB_set_custdata(struct list *custdata_list, TLBGuid *tlbguid, VA
return VariantCopy(&cust_data->data, var);
}
+/* Used to update list pointers after list itself was moved. */
+static void TLB_relink_custdata(struct list *custdata_list)
+{
+ if (custdata_list->prev == custdata_list->next)
+ list_init(custdata_list);
+ else
+ {
+ custdata_list->prev->next = custdata_list;
+ custdata_list->next->prev = custdata_list;
+ }
+}
+
static TLBString *TLB_append_str(struct list *string_list, BSTR new_str)
{
TLBString *str;
@@ -10806,15 +10818,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(ICreateTypeInfo2 *iface,
/* move custdata lists to the new memory location */
for(i = 0; i < This->typeattr.cFuncs + 1; ++i){
- if(index != i){
- TLBFuncDesc *fd = &This->funcdescs[i];
- if(fd->custdata_list.prev == fd->custdata_list.next)
- list_init(&fd->custdata_list);
- else{
- fd->custdata_list.prev->next = &fd->custdata_list;
- fd->custdata_list.next->prev = &fd->custdata_list;
- }
- }
+ if(index != i)
+ TLB_relink_custdata(&This->funcdescs[i].custdata_list);
}
} else
func_desc = This->funcdescs = heap_alloc(sizeof(TLBFuncDesc));
@@ -10875,15 +10880,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddImplType(ICreateTypeInfo2 *iface,
/* move custdata lists to the new memory location */
for(i = 0; i < This->typeattr.cImplTypes + 1; ++i){
- if(index != i){
- TLBImplType *it = &This->impltypes[i];
- if(it->custdata_list.prev == it->custdata_list.next)
- list_init(&it->custdata_list);
- else{
- it->custdata_list.prev->next = &it->custdata_list;
- it->custdata_list.next->prev = &it->custdata_list;
- }
- }
+ if(index != i)
+ TLB_relink_custdata(&This->impltypes[i].custdata_list);
}
} else
impl_type = This->impltypes = heap_alloc(sizeof(TLBImplType));
@@ -10975,15 +10973,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(ICreateTypeInfo2 *iface,
/* move custdata lists to the new memory location */
for(i = 0; i < This->typeattr.cVars + 1; ++i){
- if(index != i){
- TLBVarDesc *var = &This->vardescs[i];
- if(var->custdata_list.prev == var->custdata_list.next)
- list_init(&var->custdata_list);
- else{
- var->custdata_list.prev->next = &var->custdata_list;
- var->custdata_list.next->prev = &var->custdata_list;
- }
- }
+ if(index != i)
+ TLB_relink_custdata(&This->vardescs[i].custdata_list);
}
} else
var_desc = This->vardescs = heap_alloc_zero(sizeof(TLBVarDesc));
More information about the wine-cvs
mailing list