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