On Fri, Apr 02, 2021 at 10:39:59PM +0200, Piotr Caban wrote:
Hi Arek,
I'm attaching alternative solution for type_info_vtable definition. I think it makes sense to make the cxx.h file independent from other files. What do you think about it?
Thanks, Piotr
From ac91f5f1dd440cfdb43c9ae346e7bfd7b78629d9 Mon Sep 17 00:00:00 2001 From: Piotr Caban <piotr(a)codeweavers.com> Date: Fri, 2 Apr 2021 22:31:19 +0200 Subject: [PATCH] msvcp90: Define type_info vtable in cxx.h header if requested. To: wine-devel <wine-devel(a)winehq.org>
--- dlls/msvcp90/cxx.h | 33 +++++++++++++++++++++++++++++++++ dlls/msvcp90/exception.c | 31 +------------------------------ 2 files changed, 34 insertions(+), 30 deletions(-)
diff --git a/dlls/msvcp90/cxx.h b/dlls/msvcp90/cxx.h index 7af11de7fe6..43b8df61012 100644 --- a/dlls/msvcp90/cxx.h +++ b/dlls/msvcp90/cxx.h @@ -452,3 +452,36 @@ typedef struct } cxx_exception_type;
#endif + +#ifdef DEFINE_TYPE_INFO +static void MSVCP_type_info_dtor(type_info * _this) +{ + free(_this->name); +} + +DEFINE_THISCALL_WRAPPER(MSVCP_type_info_vector_dtor,8) +void * __thiscall MSVCP_type_info_vector_dtor(type_info * _this, unsigned int flags) +{ + if (flags & 2) + { + /* we have an array, with the number of elements stored before the first object */ + INT_PTR i, *ptr = (INT_PTR *)_this - 1; + + for (i = *ptr - 1; i >= 0; i--) MSVCP_type_info_dtor(_this + i); + free(ptr); + } + else + { + MSVCP_type_info_dtor(_this); + if (flags & 1) free(_this); + } + return _this; +} + +DEFINE_RTTI_DATA0( type_info, 0, ".?AVtype_info@@" ) + +__ASM_BLOCK_BEGIN(type_info_vtables) + __ASM_VTABLE(type_info, + VTABLE_ADD_FUNC(MSVCP_type_info_vector_dtor)); +__ASM_BLOCK_END +#endif
I was considering something similar at first, but I didn't like the idea of having RTTI/dtor definitions behind an ifdef in a header file. I don't have a strong preference though so if this is fine with you then it's also fine with me. -- Cheers, Arek