From: Piotr Caban Subject: [PATCH 2/6] msvcp100: Add basic_ios::swap implementation Message-Id: <53D95B94.1090700@codeweavers.com> Date: Wed, 30 Jul 2014 15:54:44 -0500 --- dlls/msvcp100/msvcp100.spec | 12 ++++++------ dlls/msvcp110/msvcp110.spec | 18 +++++++++--------- dlls/msvcp90/ios.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec index 3d0db763..b593c06 100644 --- a/dlls/msvcp100/msvcp100.spec +++ b/dlls/msvcp100/msvcp100.spec @@ -2686,12 +2686,12 @@ @ cdecl -arch=win64 ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) basic_streambuf_wchar_sungetc @ thiscall -arch=win32 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) basic_streambuf_wchar_sungetc @ cdecl -arch=win64 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) basic_streambuf_wchar_sungetc -@ stub -arch=win32 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z -@ stub -arch=win32 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z -@ stub -arch=win32 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z +@ thiscall -arch=win32 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_char_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_char_swap +@ thiscall -arch=win32 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ thiscall -arch=win32 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_wchar_swap @ stub -arch=win32 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z @ stub -arch=win64 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z @ stub -arch=win32 ?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index ecf2db3..0618f48 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -3461,15 +3461,15 @@ @ cdecl -arch=arm ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) basic_streambuf_wchar_sungetc @ thiscall -arch=i386 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) basic_streambuf_wchar_sungetc @ cdecl -arch=win64 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) basic_streambuf_wchar_sungetc -@ stub -arch=arm ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXAAV12@@Z -@ stub -arch=i386 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z -@ stub -arch=arm ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXAAV12@@Z -@ stub -arch=i386 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z -@ stub -arch=arm ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXAAV12@@Z -@ stub -arch=i386 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z -@ stub -arch=win64 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXAAV12@@Z(ptr ptr) basic_ios_char_swap +@ thiscall -arch=i386 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_char_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_char_swap +@ cdecl -arch=arm ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ thiscall -arch=i386 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ cdecl -arch=arm ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ thiscall -arch=i386 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z(ptr ptr) basic_ios_wchar_swap +@ cdecl -arch=win64 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) basic_ios_wchar_swap @ stub -arch=arm ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z @ stub -arch=i386 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z @ stub -arch=win64 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c index 14b3b25..0ca6566 100644 --- a/dlls/msvcp90/ios.c +++ b/dlls/msvcp90/ios.c @@ -5505,6 +5505,26 @@ char __thiscall basic_ios_char_widen(basic_ios_char *this, char ch) return ctype_char_widen_ch(ctype_char_use_facet(this->strbuf->loc), ch); } +/* ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z */ +/* ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z */ +DEFINE_THISCALL_WRAPPER(basic_ios_char_swap, 8) +void __thiscall basic_ios_char_swap(basic_ios_char *this, basic_ios_char *r) +{ + void *swap_ptr; + + TRACE("(%p %p)\n", this, r); + + if(this == r) + return; + + ios_base_swap(&this->base, &r->base); + swap_ptr = this->stream; + this->stream = r->stream; + r->stream = swap_ptr; + this->fillch ^= r->fillch; + r->fillch ^= this->fillch; + this->fillch ^= r->fillch; +} /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ */ /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ */ @@ -5780,6 +5800,29 @@ wchar_t __thiscall basic_ios_wchar_widen(basic_ios_wchar *this, char ch) return ctype_wchar_widen_ch(ctype_wchar_use_facet(this->strbuf->loc), ch); } +/* ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z */ +/* ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z */ +/* ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z */ +/* ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z */ +DEFINE_THISCALL_WRAPPER(basic_ios_wchar_swap, 8) +void __thiscall basic_ios_wchar_swap(basic_ios_wchar *this, basic_ios_wchar *r) +{ + void *swap_ptr; + + TRACE("(%p %p)\n", this, r); + + if(this == r) + return; + + ios_base_swap(&this->base, &r->base); + swap_ptr = this->stream; + this->stream = r->stream; + r->stream = swap_ptr; + this->fillch ^= r->fillch; + r->fillch ^= this->fillch; + this->fillch ^= r->fillch; +} + /* Caution: basic_ostream uses virtual inheritance. * All constructors have additional parameter that says if base class should be initialized. * Base class needs to be accessed using vbtable.