Alexandre Julliard : msvcp60: Use the correct vtable pointer for type_info objects.

Alexandre Julliard julliard at winehq.org
Thu Apr 5 12:31:44 CDT 2012


Module: wine
Branch: master
Commit: 7016a638fe7aa8c2fe93b2dc67b304d86cb49f2a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7016a638fe7aa8c2fe93b2dc67b304d86cb49f2a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr  4 20:11:59 2012 +0200

msvcp60: Use the correct vtable pointer for type_info objects.

---

 dlls/msvcp60/exception.c |   29 +++++++++++++++++++++++++++++
 dlls/msvcp60/msvcp.h     |    2 +-
 2 files changed, 30 insertions(+), 1 deletions(-)

diff --git a/dlls/msvcp60/exception.c b/dlls/msvcp60/exception.c
index 6dfdb50..609cb98 100644
--- a/dlls/msvcp60/exception.c
+++ b/dlls/msvcp60/exception.c
@@ -61,6 +61,7 @@ typedef struct __cxx_exception_type
 void WINAPI _CxxThrowException(exception*,const cxx_exception_type*);
 
 /* vtables */
+extern const vtable_ptr MSVCP_type_info_vtable;
 extern const vtable_ptr MSVCP_exception_vtable;
 /* ??_7bad_alloc at std@@6B@ */
 extern const vtable_ptr MSVCP_bad_alloc_vtable;
@@ -74,6 +75,33 @@ extern const vtable_ptr MSVCP_invalid_argument_vtable;
 /* ??_7runtime_error at std@@6B@ */
 extern const vtable_ptr MSVCP_runtime_error_vtable;
 
+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)
+{
+    TRACE("(%p %x)\n", _this, flags);
+    if (flags & 2)
+    {
+        /* we have an array, with the number of elements stored before the first object */
+        int i, *ptr = (int *)_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_DATA( type_info, 0, 0, NULL, NULL, NULL, ".?AVtype_info@@" );
+
 DEFINE_THISCALL_WRAPPER(MSVCP_exception_ctor, 8)
 exception* __thiscall MSVCP_exception_ctor(exception *this, const char *name)
 {
@@ -703,6 +731,7 @@ const char* __thiscall MSVCP_runtime_error_what(runtime_error *this)
 #ifndef __GNUC__
 void __asm_dummy_vtables(void) {
 #endif
+    __ASM_VTABLE(type_info,"");
     __ASM_VTABLE(exception,
             VTABLE_ADD_FUNC(MSVCP_exception_what)
             VTABLE_ADD_FUNC(MSVCP_exception__Doraise));
diff --git a/dlls/msvcp60/msvcp.h b/dlls/msvcp60/msvcp.h
index 82d9d4c..27d5366 100644
--- a/dlls/msvcp60/msvcp.h
+++ b/dlls/msvcp60/msvcp.h
@@ -83,7 +83,7 @@ extern void* (__cdecl *MSVCRT_set_new_handler)(void*);
 
 #define DEFINE_RTTI_DATA(name, off, base_classes, cl1, cl2, cl3, mangled_name) \
 static const type_info name ## _type_info = { \
-    &MSVCP_ ## name ## _vtable, \
+    &MSVCP_type_info_vtable, \
     NULL, \
     mangled_name \
 }; \




More information about the wine-cvs mailing list