From: Piotr Caban Subject: [PATCH 6/7] msvcp90: Pass base class pointer to virtual functions Message-Id: <4FF44FF3.5040408@codeweavers.com> Date: Wed, 04 Jul 2012 16:15:15 +0200 --- dlls/msvcp90/ios.c | 304 +++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 242 insertions(+), 62 deletions(-) diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c index dfbd51d..8550c6e 100644 --- a/dlls/msvcp90/ios.c +++ b/dlls/msvcp90/ios.c @@ -4487,6 +4487,16 @@ static inline basic_ios_char* basic_ostream_char_get_basic_ios(basic_ostream_cha return (basic_ios_char*)((char*)this+this->vbtable[1]); } +static inline basic_ios_char* basic_ostream_char_to_basic_ios(basic_ostream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_ostream_char_vbtable[1]); +} + +static inline basic_ostream_char* basic_ostream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_ostream_char*)((char*)ptr-basic_ostream_char_vbtable[1]); +} + /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */ /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */ DEFINE_THISCALL_WRAPPER(basic_ostream_char_ctor, 16) @@ -4537,8 +4547,10 @@ basic_ostream_char* __thiscall basic_ostream_char_ctor_uninitialized(basic_ostre /* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ostream_char_dtor, 4) -void __thiscall basic_ostream_char_dtor(basic_ostream_char *this) +void __thiscall basic_ostream_char_dtor(basic_ios_char *base) { + basic_ostream_char *this = basic_ostream_char_from_basic_ios(base); + /* don't destroy virtual base here */ TRACE("(%p)\n", this); } @@ -4549,14 +4561,14 @@ DEFINE_THISCALL_WRAPPER(basic_ostream_char_vbase_dtor, 4) void __thiscall basic_ostream_char_vbase_dtor(basic_ostream_char *this) { TRACE("(%p)\n", this); - basic_ostream_char_dtor(this); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_ostream_char_get_basic_ios(this)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ostream_char_vector_dtor, 8) basic_ostream_char* __thiscall MSVCP_basic_ostream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_ostream_char *this = (basic_ostream_char *)((char*)base - basic_ostream_char_vbtable[1] + basic_ostream_char_vbtable[0]); + basic_ostream_char *this = basic_ostream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -5237,6 +5249,16 @@ static inline basic_ios_wchar* basic_ostream_wchar_get_basic_ios(basic_ostream_w return (basic_ios_wchar*)((char*)this+this->vbtable[1]); } +static inline basic_ios_wchar* basic_ostream_wchar_to_basic_ios(basic_ostream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_ostream_wchar_vbtable[1]); +} + +static inline basic_ostream_wchar* basic_ostream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_ostream_wchar*)((char*)ptr-basic_ostream_wchar_vbtable[1]); +} + /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */ /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */ DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_ctor, 16) @@ -5287,8 +5309,10 @@ basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor_uninitialized(basic_ost /* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */ /* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_dtor, 4) -void __thiscall basic_ostream_wchar_dtor(basic_ostream_wchar *this) +void __thiscall basic_ostream_wchar_dtor(basic_ios_wchar *base) { + basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base); + /* don't destroy virtual base here */ TRACE("(%p)\n", this); } @@ -5299,14 +5323,14 @@ DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vbase_dtor, 4) void __thiscall basic_ostream_wchar_vbase_dtor(basic_ostream_wchar *this) { TRACE("(%p)\n", this); - basic_ostream_wchar_dtor(this); + basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(this)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ostream_wchar_vector_dtor, 8) basic_ostream_wchar* __thiscall MSVCP_basic_ostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_ostream_wchar *this = (basic_ostream_wchar *)((char*)base - basic_ostream_wchar_vbtable[1] + basic_ostream_wchar_vbtable[0]); + basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -5979,6 +6003,16 @@ static inline basic_ios_char* basic_istream_char_get_basic_ios(basic_istream_cha return (basic_ios_char*)((char*)this+this->vbtable[1]); } +static inline basic_ios_char* basic_istream_char_to_basic_ios(basic_istream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_istream_char_vbtable[1]); +} + +static inline basic_istream_char* basic_istream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_istream_char*)((char*)ptr-basic_istream_char_vbtable[1]); +} + /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */ /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */ DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_init, 20) @@ -6036,8 +6070,10 @@ basic_istream_char* __thiscall basic_istream_char_ctor_uninitialized(basic_istre /* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_istream_char_dtor, 4) -void __thiscall basic_istream_char_dtor(basic_istream_char *this) +void __thiscall basic_istream_char_dtor(basic_ios_char *base) { + basic_istream_char *this = basic_istream_char_from_basic_ios(base); + /* don't destroy virtual base here */ TRACE("(%p)\n", this); } @@ -6048,14 +6084,14 @@ DEFINE_THISCALL_WRAPPER(basic_istream_char_vbase_dtor, 4) void __thiscall basic_istream_char_vbase_dtor(basic_istream_char *this) { TRACE("(%p)\n", this); - basic_istream_char_dtor(this); + basic_istream_char_dtor(basic_istream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(this)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_istream_char_vector_dtor, 8) basic_istream_char* __thiscall MSVCP_basic_istream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_istream_char *this = (basic_istream_char *)((char*)base - basic_istream_char_vbtable[1] + basic_istream_char_vbtable[0]); + basic_istream_char *this = basic_istream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -7133,6 +7169,16 @@ static inline basic_ios_wchar* basic_istream_wchar_get_basic_ios(basic_istream_w return (basic_ios_wchar*)((char*)this+this->vbtable[1]); } +static inline basic_ios_wchar* basic_istream_wchar_to_basic_ios(basic_istream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_istream_wchar_vbtable[1]); +} + +static inline basic_istream_wchar* basic_istream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_istream_wchar*)((char*)ptr-basic_istream_wchar_vbtable[1]); +} + /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */ /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */ DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor_init, 20) @@ -7190,8 +7236,10 @@ basic_istream_wchar* __thiscall basic_istream_wchar_ctor_uninitialized(basic_ist /* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */ /* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_istream_wchar_dtor, 4) -void __thiscall basic_istream_wchar_dtor(basic_istream_wchar *this) +void __thiscall basic_istream_wchar_dtor(basic_ios_wchar *base) { + basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base); + /* don't destroy virtual base here */ TRACE("(%p)\n", this); } @@ -7202,14 +7250,14 @@ DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vbase_dtor, 4) void __thiscall basic_istream_wchar_vbase_dtor(basic_istream_wchar *this) { TRACE("(%p)\n", this); - basic_istream_wchar_dtor(this); + basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(this)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_istream_wchar_vector_dtor, 8) basic_istream_wchar* __thiscall MSVCP_basic_istream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_istream_wchar *this = (basic_istream_wchar *)((char*)base - basic_istream_wchar_vbtable[1] + basic_istream_wchar_vbtable[0]); + basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -8273,6 +8321,16 @@ basic_istream_wchar* __thiscall basic_istream_wchar_read_func_ios_base( return this; } +static inline basic_ios_char* basic_iostream_char_to_basic_ios(basic_iostream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_iostream_char_vbtable1[1]); +} + +static inline basic_iostream_char* basic_iostream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_iostream_char*)((char*)ptr-basic_iostream_char_vbtable1[1]); +} + /* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */ /* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */ DEFINE_THISCALL_WRAPPER(basic_iostream_char_ctor, 12) @@ -8301,11 +8359,13 @@ basic_iostream_char* __thiscall basic_iostream_char_ctor(basic_iostream_char *th /* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_iostream_char_dtor, 4) -void __thiscall basic_iostream_char_dtor(basic_iostream_char *this) +void __thiscall basic_iostream_char_dtor(basic_ios_char *base) { + basic_iostream_char *this = basic_iostream_char_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_ostream_char_dtor(&this->base2); - basic_istream_char_dtor(&this->base1); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base2)); + basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base1)); } /* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ */ @@ -8314,14 +8374,14 @@ DEFINE_THISCALL_WRAPPER(basic_iostream_char_vbase_dtor, 4) void __thiscall basic_iostream_char_vbase_dtor(basic_iostream_char *this) { TRACE("(%p)\n", this); - basic_iostream_char_dtor(this); + basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base1)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_iostream_char_vector_dtor, 8) basic_iostream_char* __thiscall MSVCP_basic_iostream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_iostream_char *this = (basic_iostream_char *)((char*)base - basic_iostream_char_vbtable1[1] + basic_iostream_char_vbtable1[0]); + basic_iostream_char *this = basic_iostream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -8341,6 +8401,16 @@ basic_iostream_char* __thiscall MSVCP_basic_iostream_char_vector_dtor(basic_ios_ return this; } +static inline basic_ios_wchar* basic_iostream_wchar_to_basic_ios(basic_iostream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_iostream_wchar_vbtable1[1]); +} + +static inline basic_iostream_wchar* basic_iostream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_iostream_wchar*)((char*)ptr-basic_iostream_wchar_vbtable1[1]); +} + /* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */ /* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */ DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_ctor, 12) @@ -8369,11 +8439,13 @@ basic_iostream_wchar* __thiscall basic_iostream_wchar_ctor(basic_iostream_wchar /* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */ /* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_dtor, 4) -void __thiscall basic_iostream_wchar_dtor(basic_iostream_wchar *this) +void __thiscall basic_iostream_wchar_dtor(basic_ios_wchar *base) { + basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_ostream_wchar_dtor(&this->base2); - basic_istream_wchar_dtor(&this->base1); + basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base2)); + basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base1)); } /* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */ @@ -8382,14 +8454,14 @@ DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vbase_dtor, 4) void __thiscall basic_iostream_wchar_vbase_dtor(basic_iostream_wchar *this) { TRACE("(%p)\n", this); - basic_iostream_wchar_dtor(this); + basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base1)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_iostream_wchar_vector_dtor, 8) basic_iostream_wchar* __thiscall MSVCP_basic_iostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_iostream_wchar *this = (basic_iostream_wchar *)((char*)base - basic_iostream_wchar_vbtable1[1] + basic_iostream_wchar_vbtable1[0]); + basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -8409,6 +8481,16 @@ basic_iostream_wchar* __thiscall MSVCP_basic_iostream_wchar_vector_dtor(basic_io return this; } +static inline basic_ios_char* basic_ofstream_char_to_basic_ios(basic_ofstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_ofstream_char_vbtable[1]); +} + +static inline basic_ofstream_char* basic_ofstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_ofstream_char*)((char*)ptr-basic_ofstream_char_vbtable[1]); +} + /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@XZ */ /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor, 8) @@ -8495,11 +8577,13 @@ basic_ofstream_char* __thiscall basic_ofstream_char_ctor_name_wchar(basic_ofstre /* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ofstream_char_dtor, 4) -void __thiscall basic_ofstream_char_dtor(basic_ofstream_char *this) +void __thiscall basic_ofstream_char_dtor(basic_ios_char *base) { + basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_ostream_char_dtor(&this->base); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base)); basic_filebuf_char_dtor(&this->filebuf); } @@ -8510,14 +8594,14 @@ void __thiscall basic_ofstream_char_vbase_dtor(basic_ofstream_char *this) { TRACE("(%p)\n", this); - basic_ofstream_char_dtor(this); + basic_ofstream_char_dtor(basic_ofstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ofstream_char_vector_dtor, 8) basic_ofstream_char* __thiscall MSVCP_basic_ofstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_ofstream_char *this = (basic_ofstream_char *)((char*)base - basic_ofstream_char_vbtable[1] + basic_ofstream_char_vbtable[0]); + basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -8618,6 +8702,16 @@ basic_filebuf_char* __thiscall basic_ofstream_char_rdbuf(const basic_ofstream_ch return (basic_filebuf_char*)&this->filebuf; } +static inline basic_ios_char* basic_ifstream_char_to_basic_ios(basic_ifstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_ifstream_char_vbtable[1]); +} + +static inline basic_ifstream_char* basic_ifstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_ifstream_char*)((char*)ptr-basic_ifstream_char_vbtable[1]); +} + /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@XZ */ /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor, 8) @@ -8704,11 +8798,13 @@ basic_ifstream_char* __thiscall basic_ifstream_char_ctor_name_wchar(basic_ifstre /* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ifstream_char_dtor, 4) -void __thiscall basic_ifstream_char_dtor(basic_ifstream_char *this) +void __thiscall basic_ifstream_char_dtor(basic_ios_char *base) { + basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_istream_char_dtor(&this->base); + basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base)); basic_filebuf_char_dtor(&this->filebuf); } @@ -8719,14 +8815,14 @@ void __thiscall basic_ifstream_char_vbase_dtor(basic_ifstream_char *this) { TRACE("(%p)\n", this); - basic_ifstream_char_dtor(this); + basic_ifstream_char_dtor(basic_ifstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ifstream_char_vector_dtor, 8) basic_ifstream_char* __thiscall MSVCP_basic_ifstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_ifstream_char *this = (basic_ifstream_char *)((char*)base - basic_ifstream_char_vbtable[1] + basic_ifstream_char_vbtable[0]); + basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -8827,6 +8923,16 @@ basic_filebuf_char* __thiscall basic_ifstream_char_rdbuf(const basic_ifstream_ch return (basic_filebuf_char*)&this->filebuf; } +static inline basic_ios_char* basic_fstream_char_to_basic_ios(basic_fstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_fstream_char_vbtable1[1]); +} + +static inline basic_fstream_char* basic_fstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_fstream_char*)((char*)ptr-basic_fstream_char_vbtable1[1]); +} + /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@XZ */ /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor, 8) @@ -8915,11 +9021,13 @@ basic_fstream_char* __thiscall basic_fstream_char_ctor_name_wchar(basic_fstream_ /* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UAE@XZ */ /* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_fstream_char_dtor, 4) -void __thiscall basic_fstream_char_dtor(basic_fstream_char *this) +void __thiscall basic_fstream_char_dtor(basic_ios_char *base) { + basic_fstream_char *this = basic_fstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_iostream_char_dtor(&this->base); + basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base)); basic_filebuf_char_dtor(&this->filebuf); } @@ -8930,14 +9038,14 @@ void __thiscall basic_fstream_char_vbase_dtor(basic_fstream_char *this) { TRACE("(%p)\n", this); - basic_fstream_char_dtor(this); + basic_fstream_char_dtor(basic_fstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_fstream_char_vector_dtor, 8) basic_fstream_char* __thiscall MSVCP_basic_fstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_fstream_char *this = (basic_fstream_char *)((char*)base - basic_fstream_char_vbtable1[1] + basic_fstream_char_vbtable1[0]); + basic_fstream_char *this = basic_fstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9038,6 +9146,16 @@ basic_filebuf_char* __thiscall basic_fstream_char_rdbuf(const basic_fstream_char return (basic_filebuf_char*)&this->filebuf; } +static inline basic_ios_char* basic_ostringstream_char_to_basic_ios(basic_ostringstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_ostringstream_char_vbtable[1]); +} + +static inline basic_ostringstream_char* basic_ostringstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_ostringstream_char*)((char*)ptr-basic_ostringstream_char_vbtable[1]); +} + /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor_str, 16) @@ -9098,12 +9216,14 @@ basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor( /* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */ /* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_dtor, 4) -void __thiscall basic_ostringstream_char_dtor(basic_ostringstream_char *this) +void __thiscall basic_ostringstream_char_dtor(basic_ios_char *base) { + basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); basic_stringbuf_char_dtor(&this->strbuf); - basic_ostream_char_dtor(&this->base); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base)); } /* ??_D?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */ @@ -9113,14 +9233,14 @@ void __thiscall basic_ostringstream_char_vbase_dtor(basic_ostringstream_char *th { TRACE("(%p)\n", this); - basic_ostringstream_char_dtor(this); + basic_ostringstream_char_dtor(basic_ostringstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ostringstream_char_vector_dtor, 8) basic_ostringstream_char* __thiscall MSVCP_basic_ostringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_ostringstream_char *this = (basic_ostringstream_char *)((char*)base - basic_ostringstream_char_vbtable[1] + basic_ostringstream_char_vbtable[0]); + basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9167,6 +9287,16 @@ basic_string_char* __thiscall basic_ostringstream_char_str_get(const basic_ostri return basic_stringbuf_char_str_get(&this->strbuf, ret); } +static inline basic_ios_wchar* basic_ostringstream_wchar_to_basic_ios(basic_ostringstream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_ostringstream_wchar_vbtable[1]); +} + +static inline basic_ostringstream_wchar* basic_ostringstream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_ostringstream_wchar*)((char*)ptr-basic_ostringstream_wchar_vbtable[1]); +} + /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_ctor_str, 16) @@ -9227,12 +9357,14 @@ basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor( /* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */ /* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_dtor, 4) -void __thiscall basic_ostringstream_wchar_dtor(basic_ostringstream_wchar *this) +void __thiscall basic_ostringstream_wchar_dtor(basic_ios_wchar *base) { + basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base); + TRACE("(%p)\n", this); basic_stringbuf_wchar_dtor(&this->strbuf); - basic_ostream_wchar_dtor(&this->base); + basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base)); } /* ??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */ @@ -9242,14 +9374,14 @@ void __thiscall basic_ostringstream_wchar_vbase_dtor(basic_ostringstream_wchar * { TRACE("(%p)\n", this); - basic_ostringstream_wchar_dtor(this); + basic_ostringstream_wchar_dtor(basic_ostringstream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_ostringstream_wchar_vector_dtor, 8) basic_ostringstream_wchar* __thiscall MSVCP_basic_ostringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_ostringstream_wchar *this = (basic_ostringstream_wchar *)((char*)base - basic_ostringstream_wchar_vbtable[1] + basic_ostringstream_wchar_vbtable[0]); + basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9296,6 +9428,16 @@ basic_string_wchar* __thiscall basic_ostringstream_wchar_str_get(const basic_ost return basic_stringbuf_wchar_str_get(&this->strbuf, ret); } +static inline basic_ios_char* basic_istringstream_char_to_basic_ios(basic_istringstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_istringstream_char_vbtable[1]); +} + +static inline basic_istringstream_char* basic_istringstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_istringstream_char*)((char*)ptr-basic_istringstream_char_vbtable[1]); +} + /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor_str, 16) @@ -9356,12 +9498,14 @@ basic_istringstream_char* __thiscall basic_istringstream_char_ctor( /* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */ /* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_istringstream_char_dtor, 4) -void __thiscall basic_istringstream_char_dtor(basic_istringstream_char *this) +void __thiscall basic_istringstream_char_dtor(basic_ios_char *base) { + basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); basic_stringbuf_char_dtor(&this->strbuf); - basic_istream_char_dtor(&this->base); + basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base)); } /* ??_D?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */ @@ -9371,14 +9515,14 @@ void __thiscall basic_istringstream_char_vbase_dtor(basic_istringstream_char *th { TRACE("(%p)\n", this); - basic_istringstream_char_dtor(this); + basic_istringstream_char_dtor(basic_istringstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_istringstream_char_vector_dtor, 8) basic_istringstream_char* __thiscall MSVCP_basic_istringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_istringstream_char *this = (basic_istringstream_char *)((char*)base - basic_istringstream_char_vbtable[1] + basic_istringstream_char_vbtable[0]); + basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9425,6 +9569,16 @@ basic_string_char* __thiscall basic_istringstream_char_str_get(const basic_istri return basic_stringbuf_char_str_get(&this->strbuf, ret); } +static inline basic_ios_wchar* basic_istringstream_wchar_to_basic_ios(basic_istringstream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_istringstream_wchar_vbtable[1]); +} + +static inline basic_istringstream_wchar* basic_istringstream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_istringstream_wchar*)((char*)ptr-basic_istringstream_wchar_vbtable[1]); +} + /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_ctor_str, 16) @@ -9485,12 +9639,14 @@ basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor( /* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */ /* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_dtor, 4) -void __thiscall basic_istringstream_wchar_dtor(basic_istringstream_wchar *this) +void __thiscall basic_istringstream_wchar_dtor(basic_ios_wchar *base) { + basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base); + TRACE("(%p)\n", this); basic_stringbuf_wchar_dtor(&this->strbuf); - basic_istream_wchar_dtor(&this->base); + basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base)); } /* ??_D?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */ @@ -9500,14 +9656,14 @@ void __thiscall basic_istringstream_wchar_vbase_dtor(basic_istringstream_wchar * { TRACE("(%p)\n", this); - basic_istringstream_wchar_dtor(this); + basic_istringstream_wchar_dtor(basic_istringstream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_istringstream_wchar_vector_dtor, 8) basic_istringstream_wchar* __thiscall MSVCP_basic_istringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_istringstream_wchar *this = (basic_istringstream_wchar *)((char*)base - basic_istringstream_wchar_vbtable[1] + basic_istringstream_wchar_vbtable[0]); + basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9554,6 +9710,16 @@ basic_string_wchar* __thiscall basic_istringstream_wchar_str_get(const basic_ist return basic_stringbuf_wchar_str_get(&this->strbuf, ret); } +static inline basic_ios_char* basic_stringstream_char_to_basic_ios(basic_stringstream_char *ptr) +{ + return (basic_ios_char*)((char*)ptr+basic_stringstream_char_vbtable1[1]); +} + +static inline basic_stringstream_char* basic_stringstream_char_from_basic_ios(basic_ios_char *ptr) +{ + return (basic_stringstream_char*)((char*)ptr-basic_stringstream_char_vbtable1[1]); +} + /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor_str, 16) @@ -9617,11 +9783,13 @@ basic_stringstream_char* __thiscall basic_stringstream_char_ctor( /* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */ /* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_stringstream_char_dtor, 4) -void __thiscall basic_stringstream_char_dtor(basic_stringstream_char *this) +void __thiscall basic_stringstream_char_dtor(basic_ios_char *base) { + basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_iostream_char_dtor(&this->base); + basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base)); basic_stringbuf_char_dtor(&this->strbuf); } @@ -9632,14 +9800,14 @@ void __thiscall basic_stringstream_char_vbase_dtor(basic_stringstream_char *this { TRACE("(%p)\n", this); - basic_stringstream_char_dtor(this); + basic_stringstream_char_dtor(basic_stringstream_char_to_basic_ios(this)); basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_stringstream_char_vector_dtor, 8) basic_stringstream_char* __thiscall MSVCP_basic_stringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags) { - basic_stringstream_char *this = (basic_stringstream_char *)((char*)base - basic_stringstream_char_vbtable1[1] + basic_stringstream_char_vbtable1[0]); + basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9686,6 +9854,16 @@ basic_string_char* __thiscall basic_stringstream_char_str_get(const basic_string return basic_stringbuf_char_str_get(&this->strbuf, ret); } +static inline basic_ios_wchar* basic_stringstream_wchar_to_basic_ios(basic_stringstream_wchar *ptr) +{ + return (basic_ios_wchar*)((char*)ptr+basic_stringstream_wchar_vbtable1[1]); +} + +static inline basic_stringstream_wchar* basic_stringstream_wchar_from_basic_ios(basic_ios_wchar *ptr) +{ + return (basic_stringstream_wchar*)((char*)ptr-basic_stringstream_wchar_vbtable1[1]); +} + /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */ DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_ctor_str, 16) @@ -9749,11 +9927,13 @@ basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor( /* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */ /* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */ DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_dtor, 4) -void __thiscall basic_stringstream_wchar_dtor(basic_stringstream_wchar *this) +void __thiscall basic_stringstream_wchar_dtor(basic_ios_wchar *base) { + basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base); + TRACE("(%p)\n", this); - basic_iostream_wchar_dtor(&this->base); + basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(&this->base)); basic_stringbuf_wchar_dtor(&this->strbuf); } @@ -9764,14 +9944,14 @@ void __thiscall basic_stringstream_wchar_vbase_dtor(basic_stringstream_wchar *th { TRACE("(%p)\n", this); - basic_stringstream_wchar_dtor(this); + basic_stringstream_wchar_dtor(basic_stringstream_wchar_to_basic_ios(this)); basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base.base1)); } DEFINE_THISCALL_WRAPPER(MSVCP_basic_stringstream_wchar_vector_dtor, 8) basic_stringstream_wchar* __thiscall MSVCP_basic_stringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags) { - basic_stringstream_wchar *this = (basic_stringstream_wchar *)((char*)base - basic_stringstream_wchar_vbtable1[1] + basic_stringstream_wchar_vbtable1[0]); + basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base); TRACE("(%p %x)\n", this, flags); @@ -9907,15 +10087,15 @@ void init_io(void) void free_io(void) { - basic_istream_char_dtor(&cin.obj); + basic_istream_char_dtor(basic_istream_char_to_basic_ios(&cin.obj)); basic_filebuf_char_dtor(&filebuf_stdin); - basic_ostream_char_dtor(&cout.obj); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&cout.obj)); basic_filebuf_char_dtor(&filebuf_stdout); - basic_ostream_char_dtor(&cerr.obj); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&cerr.obj)); basic_filebuf_char_dtor(&filebuf_stderr); - basic_ostream_char_dtor(&clog.obj); + basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&clog.obj)); basic_filebuf_char_dtor(&filebuf_log); }