Module: wine Branch: master Commit: c41fd08ddca012b3eb5b841bf8746ea80dec5d1d URL: http://source.winehq.org/git/wine.git/?a=commit;h=c41fd08ddca012b3eb5b841bf8...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Sep 7 11:00:56 2012 +0200
msvcp100: Fixed RTTI structure on 64-bit systems.
---
dlls/msvcp100/cxx.h | 113 +++++++++++++++++++++++++++++++++++++++++++- dlls/msvcp100/exception.c | 15 ++++++ dlls/msvcp100/ios.c | 49 +++++++++++++++++++- dlls/msvcp100/locale.c | 27 +++++++++++ dlls/msvcp100/msvcp.h | 4 +- dlls/msvcp100/msvcp100.c | 4 +- 6 files changed, 205 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcp100/cxx.h b/dlls/msvcp100/cxx.h index f709d12..956675c 100644 --- a/dlls/msvcp100/cxx.h +++ b/dlls/msvcp100/cxx.h @@ -64,7 +64,9 @@
#endif /* _WIN64 */
-#define DEFINE_RTTI_DATA(name, off, base_classes, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \ +#ifndef __x86_64__ + +#define DEFINE_RTTI_DATA(name, off, base_classes_no, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \ static const type_info name ## _type_info = { \ &MSVCP_type_info_vtable, \ NULL, \ @@ -73,7 +75,7 @@ \ static const rtti_base_descriptor name ## _rtti_base_descriptor = { \ &name ##_type_info, \ - base_classes, \ + base_classes_no, \ { 0, -1, 0}, \ 64 \ }; \ @@ -96,7 +98,7 @@ static const rtti_base_array name ## _rtti_base_array = { \ static const rtti_object_hierarchy name ## _hierarchy = { \ 0, \ 0, \ - base_classes+1, \ + base_classes_no+1, \ &name ## _rtti_base_array \ }; \ \ @@ -108,6 +110,74 @@ const rtti_object_locator name ## _rtti = { \ &name ## _hierarchy \ }
+#else + +#define DEFINE_RTTI_DATA(name, off, base_classes_no, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \ + static const type_info name ## _type_info = { \ + &MSVCP_type_info_vtable, \ + NULL, \ + mangled_name \ + }; \ +\ +static rtti_base_descriptor name ## _rtti_base_descriptor = { \ + 0xdeadbeef, \ + base_classes_no, \ + { 0, -1, 0}, \ + 64 \ +}; \ +\ +static rtti_base_array name ## _rtti_base_array = { \ + { \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + } \ +}; \ +\ +static rtti_object_hierarchy name ## _hierarchy = { \ + 0, \ + 0, \ + base_classes_no+1, \ + 0xdeadbeef \ +}; \ +\ +rtti_object_locator name ## _rtti = { \ + 1, \ + off, \ + 0, \ + 0xdeadbeef, \ + 0xdeadbeef, \ + 0xdeadbeef \ +};\ +\ +static void init_ ## name ## _rtti(char *base) \ +{ \ + name ## _rtti_base_descriptor.type_descriptor = (char*)&name ## _type_info - base; \ + name ## _rtti_base_array.bases[0] = (char*)&name ## _rtti_base_descriptor - base; \ + name ## _rtti_base_array.bases[1] = (char*)cl1 - base; \ + name ## _rtti_base_array.bases[2] = (char*)cl2 - base; \ + name ## _rtti_base_array.bases[3] = (char*)cl3 - base; \ + name ## _rtti_base_array.bases[4] = (char*)cl4 - base; \ + name ## _rtti_base_array.bases[5] = (char*)cl5 - base; \ + name ## _rtti_base_array.bases[6] = (char*)cl6 - base; \ + name ## _rtti_base_array.bases[7] = (char*)cl7 - base; \ + name ## _rtti_base_array.bases[8] = (char*)cl8 - base; \ + name ## _rtti_base_array.bases[9] = (char*)cl9 - base; \ + name ## _hierarchy.base_classes = (char*)&name ## _rtti_base_array - base; \ + name ## _rtti.type_descriptor = (char*)&name ## _type_info - base; \ + name ## _rtti.type_hierarchy = (char*)&name ## _hierarchy - base; \ + name ## _rtti.object_locator = (char*)&name ## _rtti - base; \ +} + +#endif + #define DEFINE_RTTI_DATA0(name, off, mangled_name) \ DEFINE_RTTI_DATA(name, off, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name) #define DEFINE_RTTI_DATA1(name, off, cl1, mangled_name) \ @@ -191,6 +261,8 @@ typedef struct int vbase_offset; /* offset of this pointer offset in virtual base class descriptor */ } this_ptr_offsets;
+#ifndef __x86_64__ + typedef struct _rtti_base_descriptor { const type_info *type_descriptor; @@ -220,3 +292,38 @@ typedef struct _rtti_object_locator const type_info *type_descriptor; const rtti_object_hierarchy *type_hierarchy; } rtti_object_locator; + +#else + +typedef struct +{ + unsigned int type_descriptor; + int num_base_classes; + this_ptr_offsets offsets; /* offsets for computing the this pointer */ + unsigned int attributes; +} rtti_base_descriptor; + +typedef struct +{ + unsigned int bases[10]; /* First element is the class itself */ +} rtti_base_array; + +typedef struct +{ + unsigned int signature; + unsigned int attributes; + int array_len; /* Size of the array pointed to by 'base_classes' */ + unsigned int base_classes; +} rtti_object_hierarchy; + +typedef struct +{ + unsigned int signature; + int base_class_offset; + unsigned int flags; + unsigned int type_descriptor; + unsigned int type_hierarchy; + unsigned int object_locator; +} rtti_object_locator; + +#endif diff --git a/dlls/msvcp100/exception.c b/dlls/msvcp100/exception.c index a81fb54..55b7cd2 100644 --- a/dlls/msvcp100/exception.c +++ b/dlls/msvcp100/exception.c @@ -750,3 +750,18 @@ void throw_exception(exception_type et, const char *str) } } } + +void init_exception(void *base) +{ +#ifdef __x86_64__ + init_type_info_rtti(base); + init_exception_rtti(base); + init_bad_alloc_rtti(base); + init_logic_error_rtti(base); + init_length_error_rtti(base); + init_out_of_range_rtti(base); + init_invalid_argument_rtti(base); + init_runtime_error_rtti(base); + init_failure_rtti(base); +#endif +} diff --git a/dlls/msvcp100/ios.c b/dlls/msvcp100/ios.c index 5889d57..b41bc19 100644 --- a/dlls/msvcp100/ios.c +++ b/dlls/msvcp100/ios.c @@ -12343,8 +12343,53 @@ struct { /* ?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA */ basic_ostream_wchar *_Ptr_wclog = &wclog.obj;
-void init_io(void) -{ +void init_io(void *base) +{ +#ifdef __x86_64__ + init_iosb_rtti(base); + init_ios_base_rtti(base); + init_basic_ios_char_rtti(base); + init_basic_ios_wchar_rtti(base); + init_basic_ios_short_rtti(base); + init_basic_streambuf_char_rtti(base); + init_basic_streambuf_wchar_rtti(base); + init_basic_streambuf_short_rtti(base); + init_basic_filebuf_char_rtti(base); + init_basic_filebuf_wchar_rtti(base); + init_basic_filebuf_short_rtti(base); + init_basic_stringbuf_char_rtti(base); + init_basic_stringbuf_wchar_rtti(base); + init_basic_stringbuf_short_rtti(base); + init_basic_ostream_char_rtti(base); + init_basic_ostream_wchar_rtti(base); + init_basic_ostream_short_rtti(base); + init_basic_istream_char_rtti(base); + init_basic_istream_wchar_rtti(base); + init_basic_istream_short_rtti(base); + init_basic_iostream_char_rtti(base); + init_basic_iostream_wchar_rtti(base); + init_basic_iostream_short_rtti(base); + init_basic_ofstream_char_rtti(base); + init_basic_ofstream_wchar_rtti(base); + init_basic_ofstream_short_rtti(base); + init_basic_ifstream_char_rtti(base); + init_basic_ifstream_wchar_rtti(base); + init_basic_ifstream_short_rtti(base); + init_basic_fstream_char_rtti(base); + init_basic_fstream_wchar_rtti(base); + init_basic_fstream_short_rtti(base); + init_basic_ostringstream_char_rtti(base); + init_basic_ostringstream_wchar_rtti(base); + init_basic_ostringstream_short_rtti(base); + init_basic_istringstream_char_rtti(base); + init_basic_istringstream_wchar_rtti(base); + init_basic_istringstream_short_rtti(base); + init_basic_stringstream_char_rtti(base); + init_basic_stringstream_wchar_rtti(base); + init_basic_stringstream_short_rtti(base); + init_strstreambuf_rtti(base); +#endif + basic_filebuf_char_ctor_file(&filebuf_char_stdin, stdin); basic_istream_char_ctor(&cin.obj, &filebuf_char_stdin.base, FALSE/*FIXME*/, TRUE);
diff --git a/dlls/msvcp100/locale.c b/dlls/msvcp100/locale.c index 55b3134..e1abed8 100644 --- a/dlls/msvcp100/locale.c +++ b/dlls/msvcp100/locale.c @@ -8582,6 +8582,33 @@ void __asm_dummy_vtables(void) { } #endif
+void init_locale(void *base) +{ +#ifdef __x86_64__ + init_locale_facet_rtti(base); + init_collate_char_rtti(base); + init_collate_wchar_rtti(base); + init_collate_short_rtti(base); + init_ctype_base_rtti(base); + init_ctype_char_rtti(base); + init_ctype_wchar_rtti(base); + init_ctype_short_rtti(base); + init_codecvt_base_rtti(base); + init_codecvt_char_rtti(base); + init_codecvt_wchar_rtti(base); + init_codecvt_short_rtti(base); + init_numpunct_char_rtti(base); + init_numpunct_wchar_rtti(base); + init_numpunct_short_rtti(base); + init_num_get_char_rtti(base); + init_num_get_wchar_rtti(base); + init_num_get_short_rtti(base); + init_num_put_char_rtti(base); + init_num_put_wchar_rtti(base); + init_num_put_short_rtti(base); +#endif +} + void free_locale(void) { facets_elem *iter, *safe; diff --git a/dlls/msvcp100/msvcp.h b/dlls/msvcp100/msvcp.h index f43982f..733b653 100644 --- a/dlls/msvcp100/msvcp.h +++ b/dlls/msvcp100/msvcp.h @@ -464,5 +464,7 @@ ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put*, o ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, MSVCP_bool);
-void init_io(void); +void init_exception(void*); +void init_locale(void*); +void init_io(void*); void free_io(void); diff --git a/dlls/msvcp100/msvcp100.c b/dlls/msvcp100/msvcp100.c index 60c2c8d..4238a24 100644 --- a/dlls/msvcp100/msvcp100.c +++ b/dlls/msvcp100/msvcp100.c @@ -113,7 +113,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) case DLL_PROCESS_ATTACH: init_cxx_funcs(); init_lockit(); - init_io(); + init_exception(hinstDLL); + init_locale(hinstDLL); + init_io(hinstDLL); break; case DLL_PROCESS_DETACH: free_io();