[PATCH 1/2] msvcp90: Move type_info to a separate file.

Arkadiusz Hiler ahiler at codeweavers.com
Thu Apr 1 08:38:12 CDT 2021


type_info is needed for RTTI, and in some cases pulling in whole
exception.c is not an option due to its dependency on multiple MSVCRT_
functions.

Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
---
 dlls/msvcirt/Makefile.in  |  1 +
 dlls/msvcirt/msvcirt.c    |  1 +
 dlls/msvcirt/msvcirt.h    |  1 +
 dlls/msvcp100/Makefile.in |  1 +
 dlls/msvcp110/Makefile.in |  1 +
 dlls/msvcp120/Makefile.in |  1 +
 dlls/msvcp140/Makefile.in |  1 +
 dlls/msvcp60/Makefile.in  |  1 +
 dlls/msvcp60/main.c       |  1 +
 dlls/msvcp60/msvcp.h      |  1 +
 dlls/msvcp70/Makefile.in  |  1 +
 dlls/msvcp71/Makefile.in  |  1 +
 dlls/msvcp80/Makefile.in  |  1 +
 dlls/msvcp90/Makefile.in  |  1 +
 dlls/msvcp90/exception.c  | 31 ------------------
 dlls/msvcp90/msvcp90.h    |  1 +
 dlls/msvcp90/msvcp_main.c |  1 +
 dlls/msvcp90/type_info.c  | 67 +++++++++++++++++++++++++++++++++++++++
 18 files changed, 83 insertions(+), 31 deletions(-)
 create mode 100644 dlls/msvcp90/type_info.c

diff --git a/dlls/msvcirt/Makefile.in b/dlls/msvcirt/Makefile.in
index 1dee2b24c02..b792edabf09 100644
--- a/dlls/msvcirt/Makefile.in
+++ b/dlls/msvcirt/Makefile.in
@@ -6,5 +6,6 @@ IMPORTS   = msvcrt
 EXTRADLLFLAGS = -mno-cygwin -Wb,--prefer-native
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	msvcirt.c
diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index db4b736d272..87e1908c4a8 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -5213,6 +5213,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
    {
    case DLL_PROCESS_ATTACH:
        init_cxx_funcs();
+       init_type_info(inst);
        init_exception(inst);
        init_io(inst);
        DisableThreadLibraryCalls( inst );
diff --git a/dlls/msvcirt/msvcirt.h b/dlls/msvcirt/msvcirt.h
index 5b59b7862a3..e775eabb2fe 100644
--- a/dlls/msvcirt/msvcirt.h
+++ b/dlls/msvcirt/msvcirt.h
@@ -71,4 +71,5 @@ typedef enum {
 extern void* (__cdecl *MSVCRT_operator_new)(SIZE_T);
 extern void (__cdecl *MSVCRT_operator_delete)(void*);
 
+void init_type_info(void*);
 void init_exception(void*);
diff --git a/dlls/msvcp100/Makefile.in b/dlls/msvcp100/Makefile.in
index 258aff4b770..0ee8fee26c8 100644
--- a/dlls/msvcp100/Makefile.in
+++ b/dlls/msvcp100/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp110/Makefile.in b/dlls/msvcp110/Makefile.in
index 6b1998a68ea..01a22340b6d 100644
--- a/dlls/msvcp110/Makefile.in
+++ b/dlls/msvcp110/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp120/Makefile.in b/dlls/msvcp120/Makefile.in
index 2a77859bf99..22923b61937 100644
--- a/dlls/msvcp120/Makefile.in
+++ b/dlls/msvcp120/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp140/Makefile.in b/dlls/msvcp140/Makefile.in
index ea05d6b3456..00bc6e219ce 100644
--- a/dlls/msvcp140/Makefile.in
+++ b/dlls/msvcp140/Makefile.in
@@ -5,6 +5,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp60/Makefile.in b/dlls/msvcp60/Makefile.in
index b43395b44d1..92188139b02 100644
--- a/dlls/msvcp60/Makefile.in
+++ b/dlls/msvcp60/Makefile.in
@@ -6,6 +6,7 @@ IMPORTS   = msvcrt
 EXTRADLLFLAGS = -mno-cygwin -Wb,--prefer-native
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp60/main.c b/dlls/msvcp60/main.c
index ab9a6a3179d..a553e1438c2 100644
--- a/dlls/msvcp60/main.c
+++ b/dlls/msvcp60/main.c
@@ -89,6 +89,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         case DLL_PROCESS_ATTACH:
             init_cxx_funcs();
             _Init_locks__Init_locks_ctor(NULL);
+            init_type_info(hinstDLL);
             init_exception(hinstDLL);
             init_locale(hinstDLL);
             init_io(hinstDLL);
diff --git a/dlls/msvcp60/msvcp.h b/dlls/msvcp60/msvcp.h
index 2507d9123d9..f078b33542a 100644
--- a/dlls/msvcp60/msvcp.h
+++ b/dlls/msvcp60/msvcp.h
@@ -465,6 +465,7 @@ ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put*, o
 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put*, ostreambuf_iterator_wchar*,
         ostreambuf_iterator_wchar, ios_base*, wchar_t, bool);
 
+void init_type_info(void*);
 void init_exception(void*);
 void init_locale(void*);
 void init_io(void*);
diff --git a/dlls/msvcp70/Makefile.in b/dlls/msvcp70/Makefile.in
index a023d1b8e2a..57987596f50 100644
--- a/dlls/msvcp70/Makefile.in
+++ b/dlls/msvcp70/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp71/Makefile.in b/dlls/msvcp71/Makefile.in
index 6713ab469d3..743b6d4751c 100644
--- a/dlls/msvcp71/Makefile.in
+++ b/dlls/msvcp71/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp80/Makefile.in b/dlls/msvcp80/Makefile.in
index 22a18fcc66a..7c1947f2721 100644
--- a/dlls/msvcp80/Makefile.in
+++ b/dlls/msvcp80/Makefile.in
@@ -6,6 +6,7 @@ PARENTSRC = ../msvcp90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp90/Makefile.in b/dlls/msvcp90/Makefile.in
index b7e7b73423f..fe4bec04a9c 100644
--- a/dlls/msvcp90/Makefile.in
+++ b/dlls/msvcp90/Makefile.in
@@ -5,6 +5,7 @@ EXTRADEFS = -D_MSVCP_VER=90
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
+	type_info.c \
 	exception.c \
 	ios.c \
 	locale.c \
diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c
index 8ea4e132a0f..e6c9227cc27 100644
--- a/dlls/msvcp90/exception.c
+++ b/dlls/msvcp90/exception.c
@@ -65,34 +65,6 @@ extern const vtable_ptr MSVCP_bad_cast_vtable;
 /* ??_7range_error at std@@6B@ */
 extern const vtable_ptr MSVCP_range_error_vtable;
 
-static void MSVCP_type_info_dtor(type_info * _this)
-{
-    free(_this->name);
-}
-
-/* Unexported */
-DEFINE_THISCALL_WRAPPER(MSVCP_type_info_vector_dtor,8)
-void * __thiscall MSVCP_type_info_vector_dtor(type_info * _this, unsigned int flags)
-{
-    TRACE("(%p %x)\n", _this, 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);
-        MSVCRT_operator_delete(ptr);
-    }
-    else
-    {
-        MSVCP_type_info_dtor(_this);
-        if (flags & 1) MSVCRT_operator_delete(_this);
-    }
-    return _this;
-}
-
-DEFINE_RTTI_DATA0( type_info, 0, ".?AVtype_info@@" )
-
 /* ??0exception@@QAE at ABQBD@Z */
 /* ??0exception@@QEAA at AEBQEBD@Z */
 DEFINE_THISCALL_WRAPPER(MSVCP_exception_ctor,8)
@@ -1022,8 +994,6 @@ void __cdecl __ExceptionPtrDestroy(exception_ptr *ep)
 #endif
 
 __ASM_BLOCK_BEGIN(exception_vtables)
-    __ASM_VTABLE(type_info,
-            VTABLE_ADD_FUNC(MSVCP_type_info_vector_dtor));
     EXCEPTION_VTABLE(exception,
             VTABLE_ADD_FUNC(MSVCP_exception_vector_dtor)
             VTABLE_ADD_FUNC(MSVCP_exception_what));
@@ -1130,7 +1100,6 @@ void throw_exception(exception_type et, const char *str)
 void init_exception(void *base)
 {
 #ifdef __x86_64__
-    init_type_info_rtti(base);
     init_exception_rtti(base);
     init_bad_alloc_rtti(base);
     init_logic_error_rtti(base);
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index b2e0ae8b15c..c4908f24245 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -618,6 +618,7 @@ ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put*, o
 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put*, ostreambuf_iterator_wchar*,
         ostreambuf_iterator_wchar, ios_base*, wchar_t, bool);
 
+void init_type_info(void*);
 void init_exception(void*);
 void init_locale(void*);
 void init_io(void*);
diff --git a/dlls/msvcp90/msvcp_main.c b/dlls/msvcp90/msvcp_main.c
index 6bfd8b14367..b023a3573de 100644
--- a/dlls/msvcp90/msvcp_main.c
+++ b/dlls/msvcp90/msvcp_main.c
@@ -184,6 +184,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         case DLL_PROCESS_ATTACH:
             init_cxx_funcs();
             _Init_locks__Init_locks_ctor(NULL);
+            init_type_info(hinstDLL);
             init_exception(hinstDLL);
             init_locale(hinstDLL);
             init_io(hinstDLL);
diff --git a/dlls/msvcp90/type_info.c b/dlls/msvcp90/type_info.c
new file mode 100644
index 00000000000..38134ac5e86
--- /dev/null
+++ b/dlls/msvcp90/type_info.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 Arkadiusz Hiler for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "msvcp90.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
+
+static void MSVCP_type_info_dtor(type_info * _this)
+{
+    free(_this->name);
+}
+
+/* Unexported */
+DEFINE_THISCALL_WRAPPER(MSVCP_type_info_vector_dtor,8)
+void * __thiscall MSVCP_type_info_vector_dtor(type_info * _this, unsigned int flags)
+{
+    TRACE("(%p %x)\n", _this, 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);
+        MSVCRT_operator_delete(ptr);
+    }
+    else
+    {
+        MSVCP_type_info_dtor(_this);
+        if (flags & 1) MSVCRT_operator_delete(_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
+
+void init_type_info(void *base)
+{
+#ifdef __x86_64__
+    init_type_info_rtti(base);
+#endif
+}
-- 
2.31.1




More information about the wine-devel mailing list