Piotr Caban : msvcrt: Allow specifying destructor in DEFINE_CXX_DATA macro.

Alexandre Julliard julliard at winehq.org
Wed Aug 18 16:22:10 CDT 2021


Module: wine
Branch: master
Commit: bc05707364d722c7b8c105709962cb78c0469cd4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bc05707364d722c7b8c105709962cb78c0469cd4

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Aug 18 16:09:00 2021 +0200

msvcrt: Allow specifying destructor in DEFINE_CXX_DATA macro.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/cpp.c       | 80 ++++++++-----------------------------------------
 dlls/msvcrt/cppexcept.h | 53 +++++++++++++++++++++-----------
 2 files changed, 48 insertions(+), 85 deletions(-)

diff --git a/dlls/msvcrt/cpp.c b/dlls/msvcrt/cpp.c
index ffb91175a8f..ac363c41923 100644
--- a/dlls/msvcrt/cpp.c
+++ b/dlls/msvcrt/cpp.c
@@ -731,14 +731,6 @@ HRESULT __thiscall scheduler_resource_allocation_error_get_error_code(
     return this->hr;
 }
 
-DEFINE_THISCALL_WRAPPER(scheduler_resource_allocation_error_dtor,4)
-void __thiscall scheduler_resource_allocation_error_dtor(
-        scheduler_resource_allocation_error * this)
-{
-    TRACE("(%p)\n", this);
-    exception_dtor(&this->e);
-}
-
 typedef exception improper_lock;
 extern const vtable_ptr improper_lock_vtable;
 
@@ -770,13 +762,6 @@ improper_lock * __thiscall improper_lock_copy_ctor(improper_lock * _this, const
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(improper_lock_dtor,4)
-void __thiscall improper_lock_dtor(improper_lock * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 typedef exception invalid_scheduler_policy_key;
 extern const vtable_ptr invalid_scheduler_policy_key_vtable;
 
@@ -811,14 +796,6 @@ invalid_scheduler_policy_key * __thiscall invalid_scheduler_policy_key_copy_ctor
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(invalid_scheduler_policy_key_dtor,4)
-void __thiscall invalid_scheduler_policy_key_dtor(
-        invalid_scheduler_policy_key * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 typedef exception invalid_scheduler_policy_value;
 extern const vtable_ptr invalid_scheduler_policy_value_vtable;
 
@@ -853,14 +830,6 @@ invalid_scheduler_policy_value * __thiscall invalid_scheduler_policy_value_copy_
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(invalid_scheduler_policy_value_dtor,4)
-void __thiscall invalid_scheduler_policy_value_dtor(
-        invalid_scheduler_policy_value * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 typedef exception invalid_scheduler_policy_thread_specification;
 extern const vtable_ptr invalid_scheduler_policy_thread_specification_vtable;
 
@@ -895,14 +864,6 @@ invalid_scheduler_policy_thread_specification * __thiscall invalid_scheduler_pol
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(invalid_scheduler_policy_thread_specification_dtor,4)
-void __thiscall invalid_scheduler_policy_thread_specification_dtor(
-        invalid_scheduler_policy_thread_specification * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 typedef exception improper_scheduler_attach;
 extern const vtable_ptr improper_scheduler_attach_vtable;
 
@@ -937,14 +898,6 @@ improper_scheduler_attach * __thiscall improper_scheduler_attach_copy_ctor(
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(improper_scheduler_attach_dtor,4)
-void __thiscall improper_scheduler_attach_dtor(
-        improper_scheduler_attach * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 typedef exception improper_scheduler_detach;
 extern const vtable_ptr improper_scheduler_detach_vtable;
 
@@ -979,14 +932,6 @@ improper_scheduler_detach * __thiscall improper_scheduler_detach_copy_ctor(
     return _this;
 }
 
-DEFINE_THISCALL_WRAPPER(improper_scheduler_detach_dtor,4)
-void __thiscall improper_scheduler_detach_dtor(
-        improper_scheduler_detach * _this)
-{
-    TRACE("(%p)\n", _this);
-    exception_dtor(_this);
-}
-
 #endif /* _MSVCR_VER >= 100 */
 
 __ASM_BLOCK_BEGIN(vtables)
@@ -1069,21 +1014,22 @@ DEFINE_RTTI_DATA1(improper_scheduler_detach, 0, &exception_rtti_base_descriptor,
         ".?AVimproper_scheduler_detach at Concurrency@@" )
 #endif
 
-DEFINE_EXCEPTION_TYPE_INFO( exception, 0, NULL, NULL )
-DEFINE_EXCEPTION_TYPE_INFO( bad_typeid, 1, &exception_cxx_type_info, NULL )
-DEFINE_EXCEPTION_TYPE_INFO( bad_cast, 1, &exception_cxx_type_info, NULL )
-DEFINE_EXCEPTION_TYPE_INFO( __non_rtti_object, 2, &bad_typeid_cxx_type_info, &exception_cxx_type_info )
+DEFINE_CXX_DATA0( exception, exception_dtor )
+DEFINE_CXX_DATA1( bad_typeid, &exception_cxx_type_info, bad_typeid_dtor )
+DEFINE_CXX_DATA1( bad_cast, &exception_cxx_type_info, bad_cast_dtor )
+DEFINE_CXX_DATA2( __non_rtti_object, &bad_typeid_cxx_type_info,
+        &exception_cxx_type_info, __non_rtti_object_dtor )
 #if _MSVCR_VER >= 80
-DEFINE_EXCEPTION_TYPE_INFO( bad_alloc, 1, &exception_cxx_type_info, NULL )
+DEFINE_CXX_DATA1( bad_alloc, &exception_cxx_type_info, bad_alloc_dtor )
 #endif
 #if _MSVCR_VER >= 100
-DEFINE_EXCEPTION_TYPE_INFO(scheduler_resource_allocation_error, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(improper_lock, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(invalid_scheduler_policy_key, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(invalid_scheduler_policy_value, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(invalid_scheduler_policy_thread_specification, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(improper_scheduler_attach, 1, &exception_cxx_type_info, NULL)
-DEFINE_EXCEPTION_TYPE_INFO(improper_scheduler_detach, 1, &exception_cxx_type_info, NULL)
+DEFINE_CXX_DATA1(scheduler_resource_allocation_error, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(improper_lock, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(invalid_scheduler_policy_key, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(invalid_scheduler_policy_value, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(invalid_scheduler_policy_thread_specification, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(improper_scheduler_attach, &exception_cxx_type_info, exception_dtor)
+DEFINE_CXX_DATA1(improper_scheduler_detach, &exception_cxx_type_info, exception_dtor)
 #endif
 
 void msvcrt_init_exception(void *base)
diff --git a/dlls/msvcrt/cppexcept.h b/dlls/msvcrt/cppexcept.h
index 5170bf23fa2..2792491ca7f 100644
--- a/dlls/msvcrt/cppexcept.h
+++ b/dlls/msvcrt/cppexcept.h
@@ -156,36 +156,37 @@ static inline void *get_this_pointer( const this_ptr_offsets *off, void *object
 }
 
 #ifndef __x86_64__
-#define DEFINE_EXCEPTION_TYPE_INFO(type, base_no, cl1, cl2)  \
-\
+#define DEFINE_CXX_TYPE_INFO(type) \
 static const cxx_type_info type ## _cxx_type_info = { \
     0, \
     & type ##_type_info, \
     { 0, -1, 0 }, \
     sizeof(type), \
     (cxx_copy_ctor)THISCALL(type ##_copy_ctor) \
-}; \
+};
+
+#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, dtor)  \
+DEFINE_CXX_TYPE_INFO(type) \
 \
-static const cxx_type_info_table type ## _type_info_table = { \
+static const cxx_type_info_table type ## _cxx_type_table = { \
     base_no+1, \
     { \
         & type ## _cxx_type_info, \
         cl1, \
-        cl2 \
+        cl2, \
     } \
 }; \
 \
 static const cxx_exception_type type ## _exception_type = { \
     0, \
-    (cxx_copy_ctor)THISCALL(type ## _dtor), \
+    (cxx_copy_ctor)THISCALL(dtor), \
     NULL, \
-    & type ## _type_info_table \
+    & type ## _cxx_type_table \
 };
 
 #else
 
-#define DEFINE_EXCEPTION_TYPE_INFO(type, base_no, cl1, cl2)  \
-\
+#define DEFINE_CXX_TYPE_INFO(type) \
 static cxx_type_info type ## _cxx_type_info = { \
     0, \
     0xdeadbeef, \
@@ -194,12 +195,22 @@ static cxx_type_info type ## _cxx_type_info = { \
     0xdeadbeef \
 }; \
 \
-static cxx_type_info_table type ## _type_info_table = { \
+static void init_ ## type ## _cxx_type_info(char *base) \
+{ \
+    type ## _cxx_type_info.type_info  = (char *)&type ## _type_info - base; \
+    type ## _cxx_type_info.copy_ctor  = (char *)type ## _copy_ctor - base; \
+}
+
+#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, dtor)  \
+\
+DEFINE_CXX_TYPE_INFO(type) \
+\
+static cxx_type_info_table type ## _cxx_type_table = { \
     base_no+1, \
     { \
         0xdeadbeef, \
         0xdeadbeef, \
-        0xdeadbeef  \
+        0xdeadbeef, \
     } \
 }; \
 \
@@ -212,14 +223,20 @@ static cxx_exception_type type ##_exception_type = { \
 \
 static void init_ ## type ## _cxx(char *base) \
 { \
-    type ## _cxx_type_info.type_info  = (char *)&type ## _type_info - base; \
-    type ## _cxx_type_info.copy_ctor  = (char *)type ## _copy_ctor - base; \
-    type ## _type_info_table.info[0]   = (char *)&type ## _cxx_type_info - base; \
-    type ## _type_info_table.info[1]   = (char *)cl1 - base; \
-    type ## _type_info_table.info[2]   = (char *)cl2 - base; \
-    type ## _exception_type.destructor      = (char *)type ## _dtor - base; \
-    type ## _exception_type.type_info_table = (char *)&type ## _type_info_table - base; \
+    init_ ## type ## _cxx_type_info(base); \
+    type ## _cxx_type_table.info[0]   = (char *)&type ## _cxx_type_info - base; \
+    type ## _cxx_type_table.info[1]   = (char *)cl1 - base; \
+    type ## _cxx_type_table.info[2]   = (char *)cl2 - base; \
+    type ## _exception_type.destructor      = (char *)dtor - base; \
+    type ## _exception_type.type_info_table = (char *)&type ## _cxx_type_table - base; \
 }
 #endif
 
+#define DEFINE_CXX_DATA0(name, dtor) \
+    DEFINE_CXX_DATA(name, 0, NULL, NULL, dtor)
+#define DEFINE_CXX_DATA1(name, cl1, dtor) \
+    DEFINE_CXX_DATA(name, 1, cl1, NULL, dtor)
+#define DEFINE_CXX_DATA2(name, cl1, cl2, dtor) \
+    DEFINE_CXX_DATA(name, 2, cl1, cl2, dtor)
+
 #endif /* __MSVCRT_CPPEXCEPT_H */




More information about the wine-cvs mailing list