Commit 7ff10d34 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcp: Fix failure class layout and exception information data.

parent 5f5f9974
...@@ -111,22 +111,26 @@ const rtti_object_locator name ## _rtti = { \ ...@@ -111,22 +111,26 @@ const rtti_object_locator name ## _rtti = { \
&name ## _hierarchy \ &name ## _hierarchy \
}; };
#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, dtor) \ #define DEFINE_CXX_TYPE_INFO(type) \
\
static const cxx_type_info type ## _cxx_type_info = { \ static const cxx_type_info type ## _cxx_type_info = { \
0, \ 0, \
& type ##_type_info, \ & type ##_type_info, \
{ 0, -1, 0 }, \ { 0, -1, 0 }, \
sizeof(type), \ sizeof(type), \
(cxx_copy_ctor)THISCALL(MSVCP_ ## type ##_copy_ctor) \ (cxx_copy_ctor)THISCALL(MSVCP_ ## type ##_copy_ctor) \
}; \ };
#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, cl3, cl4, dtor) \
DEFINE_CXX_TYPE_INFO(type) \
\ \
static const cxx_type_info_table type ## _cxx_type_table = { \ static const cxx_type_info_table type ## _cxx_type_table = { \
base_no+1, \ base_no+1, \
{ \ { \
& type ## _cxx_type_info, \ & type ## _cxx_type_info, \
cl1, \ cl1, \
cl2 \ cl2, \
cl3, \
cl4 \
} \ } \
}; \ }; \
\ \
...@@ -203,8 +207,7 @@ static void init_ ## name ## _rtti(char *base) \ ...@@ -203,8 +207,7 @@ static void init_ ## name ## _rtti(char *base) \
name ## _rtti.object_locator = (char*)&name ## _rtti - base; \ name ## _rtti.object_locator = (char*)&name ## _rtti - base; \
} }
#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, dtor) \ #define DEFINE_CXX_TYPE_INFO(type) \
\
static cxx_type_info type ## _cxx_type_info = { \ static cxx_type_info type ## _cxx_type_info = { \
0, \ 0, \
0xdeadbeef, \ 0xdeadbeef, \
...@@ -213,11 +216,23 @@ static cxx_type_info type ## _cxx_type_info = { \ ...@@ -213,11 +216,23 @@ static cxx_type_info type ## _cxx_type_info = { \
0xdeadbeef \ 0xdeadbeef \
}; \ }; \
\ \
static void init_ ## type ## _cxx_type_info(char *base) \
{ \
type ## _cxx_type_info.type_info = (char *)&type ## _type_info - base; \
type ## _cxx_type_info.copy_ctor = (char *)MSVCP_ ## type ## _copy_ctor - base; \
}
#define DEFINE_CXX_DATA(type, base_no, cl1, cl2, cl3, cl4, dtor) \
\
DEFINE_CXX_TYPE_INFO(type) \
\
static cxx_type_info_table type ## _cxx_type_table = { \ static cxx_type_info_table type ## _cxx_type_table = { \
base_no+1, \ base_no+1, \
{ \ { \
0xdeadbeef, \ 0xdeadbeef, \
0xdeadbeef, \ 0xdeadbeef, \
0xdeadbeef, \
0xdeadbeef, \
0xdeadbeef \ 0xdeadbeef \
} \ } \
}; \ }; \
...@@ -231,11 +246,12 @@ static cxx_exception_type type ##_cxx_type = { \ ...@@ -231,11 +246,12 @@ static cxx_exception_type type ##_cxx_type = { \
\ \
static void init_ ## type ## _cxx(char *base) \ static void init_ ## type ## _cxx(char *base) \
{ \ { \
type ## _cxx_type_info.type_info = (char *)&type ## _type_info - base; \ init_ ## type ## _cxx_type_info(base); \
type ## _cxx_type_info.copy_ctor = (char *)MSVCP_ ## type ## _copy_ctor - base; \
type ## _cxx_type_table.info[0] = (char *)&type ## _cxx_type_info - base; \ type ## _cxx_type_table.info[0] = (char *)&type ## _cxx_type_info - base; \
type ## _cxx_type_table.info[1] = (char *)cl1 - base; \ type ## _cxx_type_table.info[1] = (char *)cl1 - base; \
type ## _cxx_type_table.info[2] = (char *)cl2 - base; \ type ## _cxx_type_table.info[2] = (char *)cl2 - base; \
type ## _cxx_type_table.info[3] = (char *)cl3 - base; \
type ## _cxx_type_table.info[4] = (char *)cl4 - base; \
type ## _cxx_type.destructor = (char *)dtor - base; \ type ## _cxx_type.destructor = (char *)dtor - base; \
type ## _cxx_type.type_info_table = (char *)&type ## _cxx_type_table - base; \ type ## _cxx_type.type_info_table = (char *)&type ## _cxx_type_table - base; \
} }
...@@ -258,11 +274,15 @@ static void init_ ## type ## _cxx(char *base) \ ...@@ -258,11 +274,15 @@ static void init_ ## type ## _cxx(char *base) \
DEFINE_RTTI_DATA(name, off, 9, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) DEFINE_RTTI_DATA(name, off, 9, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name)
#define DEFINE_CXX_DATA0(name, dtor) \ #define DEFINE_CXX_DATA0(name, dtor) \
DEFINE_CXX_DATA(name, 0, NULL, NULL, dtor) DEFINE_CXX_DATA(name, 0, NULL, NULL, NULL, NULL, dtor)
#define DEFINE_CXX_DATA1(name, cl1, dtor) \ #define DEFINE_CXX_DATA1(name, cl1, dtor) \
DEFINE_CXX_DATA(name, 1, cl1, NULL, dtor) DEFINE_CXX_DATA(name, 1, cl1, NULL, NULL, NULL, dtor)
#define DEFINE_CXX_DATA2(name, cl1, cl2, dtor) \ #define DEFINE_CXX_DATA2(name, cl1, cl2, dtor) \
DEFINE_CXX_DATA(name, 2, cl1, cl2, dtor) DEFINE_CXX_DATA(name, 2, cl1, cl2, NULL, NULL, dtor)
#define DEFINE_CXX_DATA3(name, cl1, cl2, cl3, dtor) \
DEFINE_CXX_DATA(name, 3, cl1, cl2, cl3, NULL, dtor)
#define DEFINE_CXX_DATA4(name, cl1, cl2, cl3, cl4, dtor) \
DEFINE_CXX_DATA(name, 4, cl1, cl2, cl3, cl4, dtor)
#ifdef __i386__ #ifdef __i386__
...@@ -380,7 +400,7 @@ typedef struct ...@@ -380,7 +400,7 @@ typedef struct
typedef struct typedef struct
{ {
UINT count; UINT count;
const cxx_type_info *info[3]; const cxx_type_info *info[5];
} cxx_type_info_table; } cxx_type_info_table;
typedef struct typedef struct
...@@ -436,7 +456,7 @@ typedef struct ...@@ -436,7 +456,7 @@ typedef struct
typedef struct typedef struct
{ {
UINT count; UINT count;
unsigned int info[3]; unsigned int info[5];
} cxx_type_info_table; } cxx_type_info_table;
typedef struct typedef struct
......
...@@ -56,6 +56,8 @@ extern const vtable_ptr MSVCP_out_of_range_vtable; ...@@ -56,6 +56,8 @@ extern const vtable_ptr MSVCP_out_of_range_vtable;
extern const vtable_ptr MSVCP_invalid_argument_vtable; extern const vtable_ptr MSVCP_invalid_argument_vtable;
/* ??_7runtime_error@std@@6B@ */ /* ??_7runtime_error@std@@6B@ */
extern const vtable_ptr MSVCP_runtime_error_vtable; extern const vtable_ptr MSVCP_runtime_error_vtable;
extern const vtable_ptr MSVCP__System_error_vtable;
extern const vtable_ptr MSVCP_system_error_vtable;
extern const vtable_ptr MSVCP_failure_vtable; extern const vtable_ptr MSVCP_failure_vtable;
/* ??_7bad_cast@std@@6B@ */ /* ??_7bad_cast@std@@6B@ */
extern const vtable_ptr MSVCP_bad_cast_vtable; extern const vtable_ptr MSVCP_bad_cast_vtable;
...@@ -656,13 +658,24 @@ DEFINE_RTTI_DATA1(runtime_error, 0, &exception_rtti_base_descriptor, ".?AVruntim ...@@ -656,13 +658,24 @@ DEFINE_RTTI_DATA1(runtime_error, 0, &exception_rtti_base_descriptor, ".?AVruntim
DEFINE_CXX_DATA1(runtime_error, &exception_cxx_type_info, MSVCP_runtime_error_dtor) DEFINE_CXX_DATA1(runtime_error, &exception_cxx_type_info, MSVCP_runtime_error_dtor)
/* failure class data */ /* failure class data */
typedef runtime_error failure; typedef struct {
runtime_error base;
#if _MSVCP_VER > 90
int err;
#endif
} system_error;
typedef system_error _System_error;
typedef system_error failure;
static failure* MSVCP_failure_ctor( failure *this, exception_name name ) static failure* MSVCP_failure_ctor( failure *this, exception_name name )
{ {
TRACE("%p %s\n", this, EXCEPTION_STR(name)); TRACE("%p %s\n", this, EXCEPTION_STR(name));
MSVCP_runtime_error_ctor(this, name); MSVCP_runtime_error_ctor(&this->base, name);
this->e.vtable = &MSVCP_failure_vtable; #if _MSVCP_VER > 90
/* FIXME: set err correctly */
this->err = 0;
#endif
this->base.e.vtable = &MSVCP_failure_vtable;
return this; return this;
} }
...@@ -671,8 +684,11 @@ failure* __thiscall MSVCP_failure_copy_ctor( ...@@ -671,8 +684,11 @@ failure* __thiscall MSVCP_failure_copy_ctor(
failure *this, failure *rhs) failure *this, failure *rhs)
{ {
TRACE("%p %p\n", this, rhs); TRACE("%p %p\n", this, rhs);
MSVCP_runtime_error_copy_ctor(this, rhs); MSVCP_runtime_error_copy_ctor(&this->base, &rhs->base);
this->e.vtable = &MSVCP_failure_vtable; #if _MSVCP_VER > 90
this->err = rhs->err;
#endif
this->base.e.vtable = &MSVCP_failure_vtable;
return this; return this;
} }
...@@ -680,7 +696,7 @@ DEFINE_THISCALL_WRAPPER(MSVCP_failure_dtor, 4) ...@@ -680,7 +696,7 @@ DEFINE_THISCALL_WRAPPER(MSVCP_failure_dtor, 4)
void __thiscall MSVCP_failure_dtor(failure *this) void __thiscall MSVCP_failure_dtor(failure *this)
{ {
TRACE("%p\n", this); TRACE("%p\n", this);
MSVCP_runtime_error_dtor(this); MSVCP_runtime_error_dtor(&this->base);
} }
DEFINE_THISCALL_WRAPPER(MSVCP_failure_vector_dtor, 8) DEFINE_THISCALL_WRAPPER(MSVCP_failure_vector_dtor, 8)
...@@ -688,18 +704,67 @@ void* __thiscall MSVCP_failure_vector_dtor( ...@@ -688,18 +704,67 @@ void* __thiscall MSVCP_failure_vector_dtor(
failure *this, unsigned int flags) failure *this, unsigned int flags)
{ {
TRACE("%p %x\n", this, flags); TRACE("%p %x\n", this, flags);
return MSVCP_runtime_error_vector_dtor(this, flags); return MSVCP_runtime_error_vector_dtor(&this->base, flags);
} }
DEFINE_THISCALL_WRAPPER(MSVCP_failure_what, 4) DEFINE_THISCALL_WRAPPER(MSVCP_failure_what, 4)
const char* __thiscall MSVCP_failure_what(failure *this) const char* __thiscall MSVCP_failure_what(failure *this)
{ {
TRACE("%p\n", this); TRACE("%p\n", this);
return MSVCP_runtime_error_what(this); return MSVCP_runtime_error_what(&this->base);
} }
DEFINE_RTTI_DATA2(failure, 0, &runtime_error_rtti_base_descriptor, &exception_rtti_base_descriptor, ".?AVfailure@std@@") #if _MSVCP_VER > 90
DEFINE_CXX_DATA2(failure, &runtime_error_cxx_type_info, &exception_cxx_type_info, MSVCP_runtime_error_dtor) DEFINE_THISCALL_WRAPPER(MSVCP_system_error_copy_ctor, 8)
system_error* __thiscall MSVCP_system_error_copy_ctor(
system_error *this, system_error *rhs)
{
MSVCP_failure_copy_ctor(this, rhs);
this->base.e.vtable = &MSVCP_system_error_vtable;
return this;
}
#endif
#if _MSVCP_VER > 110
DEFINE_THISCALL_WRAPPER(MSVCP__System_error_copy_ctor, 8)
_System_error* __thiscall MSVCP__System_error_copy_ctor(
_System_error *this, _System_error *rhs)
{
MSVCP_failure_copy_ctor(this, rhs);
this->base.e.vtable = &MSVCP__System_error_vtable;
return this;
}
#endif
#if _MSVCP_VER > 110
DEFINE_RTTI_DATA2(_System_error, 0, &runtime_error_rtti_base_descriptor,
&exception_rtti_base_descriptor, ".?AV_System_error@std@@")
DEFINE_RTTI_DATA3(system_error, 0, &_System_error_rtti_base_descriptor,
&runtime_error_rtti_base_descriptor, &exception_rtti_base_descriptor,
".?AVsystem_error@std@@")
DEFINE_RTTI_DATA4(failure, 0, &system_error_rtti_base_descriptor,
&_System_error_rtti_base_descriptor, &runtime_error_rtti_base_descriptor,
&exception_rtti_base_descriptor, ".?AVfailure@ios_base@std@@")
DEFINE_CXX_TYPE_INFO(_System_error)
DEFINE_CXX_TYPE_INFO(system_error);
DEFINE_CXX_DATA4(failure, &system_error_cxx_type_info,
&_System_error_cxx_type_info, &runtime_error_cxx_type_info,
&exception_cxx_type_info, MSVCP_runtime_error_dtor)
#elif _MSVCP_VER > 90
DEFINE_RTTI_DATA2(system_error, 0, &runtime_error_rtti_base_descriptor,
&exception_rtti_base_descriptor, ".?AVsystem_error@std@@")
DEFINE_RTTI_DATA3(failure, 0, &system_error_rtti_base_descriptor,
&runtime_error_rtti_base_descriptor, &exception_rtti_base_descriptor,
".?AVfailure@ios_base@std@@")
DEFINE_CXX_TYPE_INFO(system_error);
DEFINE_CXX_DATA3(failure, &system_error_cxx_type_info, &runtime_error_cxx_type_info,
&exception_cxx_type_info, MSVCP_runtime_error_dtor)
#else
DEFINE_RTTI_DATA2(failure, 0, &runtime_error_rtti_base_descriptor,
&exception_rtti_base_descriptor, ".?AVfailure@ios_base@std@@")
DEFINE_CXX_DATA2(failure, &runtime_error_cxx_type_info,
&exception_cxx_type_info, MSVCP_runtime_error_dtor)
#endif
/* bad_cast class data */ /* bad_cast class data */
typedef exception bad_cast; typedef exception bad_cast;
...@@ -911,6 +976,16 @@ void __asm_dummy_vtables(void) { ...@@ -911,6 +976,16 @@ void __asm_dummy_vtables(void) {
EXCEPTION_VTABLE(runtime_error, EXCEPTION_VTABLE(runtime_error,
VTABLE_ADD_FUNC(MSVCP_runtime_error_vector_dtor) VTABLE_ADD_FUNC(MSVCP_runtime_error_vector_dtor)
VTABLE_ADD_FUNC(MSVCP_runtime_error_what)); VTABLE_ADD_FUNC(MSVCP_runtime_error_what));
#if _MSVCP_VER > 110
EXCEPTION_VTABLE(_System_error,
VTABLE_ADD_FUNC(MSVCP_failure_vector_dtor)
VTABLE_ADD_FUNC(MSVCP_failure_what));
#endif
#if _MSVCP_VER > 90
EXCEPTION_VTABLE(system_error,
VTABLE_ADD_FUNC(MSVCP_failure_vector_dtor)
VTABLE_ADD_FUNC(MSVCP_failure_what));
#endif
EXCEPTION_VTABLE(failure, EXCEPTION_VTABLE(failure,
VTABLE_ADD_FUNC(MSVCP_failure_vector_dtor) VTABLE_ADD_FUNC(MSVCP_failure_vector_dtor)
VTABLE_ADD_FUNC(MSVCP_failure_what)); VTABLE_ADD_FUNC(MSVCP_failure_what));
...@@ -996,6 +1071,12 @@ void init_exception(void *base) ...@@ -996,6 +1071,12 @@ void init_exception(void *base)
init_out_of_range_rtti(base); init_out_of_range_rtti(base);
init_invalid_argument_rtti(base); init_invalid_argument_rtti(base);
init_runtime_error_rtti(base); init_runtime_error_rtti(base);
#if _MSVCP_VER > 110
init__System_error_rtti(base);
#endif
#if _MSVCP_VER > 90
init_system_error_rtti(base);
#endif
init_failure_rtti(base); init_failure_rtti(base);
init_bad_cast_rtti(base); init_bad_cast_rtti(base);
init_range_error_rtti(base); init_range_error_rtti(base);
...@@ -1007,6 +1088,12 @@ void init_exception(void *base) ...@@ -1007,6 +1088,12 @@ void init_exception(void *base)
init_out_of_range_cxx(base); init_out_of_range_cxx(base);
init_invalid_argument_cxx(base); init_invalid_argument_cxx(base);
init_runtime_error_cxx(base); init_runtime_error_cxx(base);
#if _MSVCP_VER > 110
init__System_error_cxx_type_info(base);
#endif
#if _MSVCP_VER > 90
init_system_error_cxx_type_info(base);
#endif
init_failure_cxx(base); init_failure_cxx(base);
init_bad_cast_cxx(base); init_bad_cast_cxx(base);
init_range_error_cxx(base); init_range_error_cxx(base);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment