Module: wine Branch: master Commit: efd693c57bace5a34390f6f5c6bececcf3aafa26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=efd693c57bace5a34390f6f5c6...
Author: Alexandre Julliard julliard@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 {