Alexandre Julliard : msvcp90: 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: efd693c57bace5a34390f6f5c6bececcf3aafa26
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=efd693c57bace5a34390f6f5c6bececcf3aafa26

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

msvcp90: Use the correct vtable pointer for type_info objects.

---

 dlls/msvcp90/exception.c |   29 +++++++++++++++++++++++++++++
 dlls/msvcp90/msvcp90.h   |    4 +++-
 2 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c
index 0965716..289dcd8 100644
--- a/dlls/msvcp90/exception.c
+++ b/dlls/msvcp90/exception.c
@@ -70,6 +70,34 @@ extern const vtable_ptr MSVCP_invalid_argument_vtable;
 extern const vtable_ptr MSVCP_runtime_error_vtable;
 extern const vtable_ptr MSVCP_failure_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 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)
 {
@@ -666,6 +694,7 @@ static const cxx_exception_type failure_cxx_type = {
 #ifndef __GNUC__
 void __asm_dummy_vtables(void) {
 #endif
+    __ASM_VTABLE(type_info, "");
     __ASM_VTABLE(exception, VTABLE_ADD_FUNC(MSVCP_what_exception));
     __ASM_VTABLE(bad_alloc, VTABLE_ADD_FUNC(MSVCP_what_exception));
     __ASM_VTABLE(logic_error, VTABLE_ADD_FUNC(MSVCP_logic_error_what));
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index c774e98..1b40b55 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.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 \
 }; \
@@ -177,6 +177,8 @@ typedef struct __type_info
     char               mangled[128]; /* Variable length, but we declare it large enough for static RTTI */
 } type_info;
 
+extern const vtable_ptr MSVCP_type_info_vtable;
+
 /* offsets for computing the this pointer */
 typedef struct
 {




More information about the wine-cvs mailing list