msvcp90: Use the correct vtable pointer for type_info objects.
This commit is contained in:
parent
7016a638fe
commit
efd693c57b
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue