[PATCH 0/2] MR10636: Draft: Msvcp140 basic istream assign
From: Theodoros Chatzigiannakis <tchatzigiannakis@gmail.com> --- dlls/msvcp90/tests/ios.c | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dlls/msvcp90/tests/ios.c b/dlls/msvcp90/tests/ios.c index 498a19f7c7c..e5fbcfcf280 100644 --- a/dlls/msvcp90/tests/ios.c +++ b/dlls/msvcp90/tests/ios.c @@ -491,6 +491,7 @@ static basic_istream_char* (*__thiscall p_basic_istream_char_seekg_fpos)(basic_i static int (*__thiscall p_basic_istream_char_peek)(basic_istream_char*); static fpos_int* (*__thiscall p_basic_istream_char_tellg)(basic_istream_char*, fpos_int*); static basic_istream_char* (*__cdecl p_basic_istream_char_getline_bstr_delim)(basic_istream_char*, basic_string_char*, char); +static basic_istream_char* (*__thiscall p_basic_istream_char_assign)(basic_istream_char*, basic_istream_char*); static basic_istream_wchar* (*__thiscall p_basic_istream_wchar_read_uint64)(basic_istream_wchar*, unsigned __int64*); static basic_istream_wchar* (*__thiscall p_basic_istream_wchar_read_double)(basic_istream_wchar*, double *); @@ -650,6 +651,7 @@ static void init_thiscall_thunk(void) #endif /* __i386__ */ static HMODULE msvcr, msvcp; +static HMODULE msvcp140_mod; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) static BOOL init(void) @@ -1157,6 +1159,16 @@ static BOOL init(void) "@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z"); } + msvcp140_mod = LoadLibraryA("msvcp140.dll"); + if(msvcp140_mod) { + if(sizeof(void*) == 8) + p_basic_istream_char_assign = (void*)GetProcAddress(msvcp140_mod, + "??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z"); + else + p_basic_istream_char_assign = (void*)GetProcAddress(msvcp140_mod, + "??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z"); + } + init_thiscall_thunk(); return TRUE; } @@ -2608,6 +2620,35 @@ static void test_time_get__Getint(void) call_func1(p_time_get_char_dtor, &time_get); } +static void test_istream_assign(void) +{ + basic_stringstream_char ss1, ss2; + basic_string_char str; + + if(!p_basic_istream_char_assign) { + skip("basic_istream_char_assign not found\n"); + return; + } + + call_func2(p_basic_string_char_ctor_cstr, &str, "hello"); + call_func4(p_basic_stringstream_char_ctor_str, &ss1, &str, OPENMODE_out|OPENMODE_in, TRUE); + call_func4(p_basic_stringstream_char_ctor_str, &ss2, &str, OPENMODE_out|OPENMODE_in, TRUE); + call_func1(p_basic_string_char_dtor, &str); + + /* advance ss1's read count by reading one character */ + call_func1(p_basic_istream_char_get, &ss1.base.base1); + ok(ss1.base.base1.count == 1, "expected count 1, got %d\n", (int)ss1.base.base1.count); + ok(ss2.base.base1.count == 0, "expected count 0, got %d\n", (int)ss2.base.base1.count); + + /* move-assign ss2 into ss1: the count field is swapped */ + call_func2(p_basic_istream_char_assign, &ss1.base.base1, &ss2.base.base1); + ok(ss1.base.base1.count == 0, "expected count 0, got %d\n", (int)ss1.base.base1.count); + ok(ss2.base.base1.count == 1, "expected count 1, got %d\n", (int)ss2.base.base1.count); + + call_func1(p_basic_stringstream_char_vbase_dtor, &ss1); + call_func1(p_basic_stringstream_char_vbase_dtor, &ss2); +} + START_TEST(ios) { if(!init()) @@ -2636,9 +2677,11 @@ START_TEST(ios) test_istream_read_complex_double(); test_basic_ios(); test_time_get__Getint(); + test_istream_assign(); ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n"); FreeLibrary(msvcr); FreeLibrary(msvcp); + if(msvcp140_mod) FreeLibrary(msvcp140_mod); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10636
From: Theodoros Chatzigiannakis <tchatzigiannakis@gmail.com> --- dlls/msvcp110/msvcp110.spec | 6 +++--- dlls/msvcp120/msvcp120.spec | 6 +++--- dlls/msvcp140/msvcp140.spec | 6 +++--- dlls/msvcp90/ios.c | 10 ++++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index 2bc7e0bbeec..914ef4923bd 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -547,9 +547,9 @@ @ stub -arch=arm ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z -@ stub -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z -@ stub -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z -@ stub -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ cdecl -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ thiscall -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ cdecl -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z(ptr ptr) basic_istream_char_assign @ stub -arch=arm ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 0a9f3ca47ee..0c878e241a9 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -547,9 +547,9 @@ @ stub -arch=arm ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z -@ stub -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z -@ stub -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z -@ stub -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ cdecl -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ thiscall -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ cdecl -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z(ptr ptr) basic_istream_char_assign @ stub -arch=arm ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 4faf71ae3f7..70d0851f6fc 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -554,9 +554,9 @@ @ stub -arch=arm ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z -@ stub -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z -@ stub -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z -@ stub -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ cdecl -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ thiscall -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z(ptr ptr) basic_istream_char_assign +@ cdecl -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z(ptr ptr) basic_istream_char_assign @ stub -arch=arm ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z @ stub -arch=i386 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z @ stub -arch=win64 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c index 71f8dc53159..dab99d639b5 100644 --- a/dlls/msvcp90/ios.c +++ b/dlls/msvcp90/ios.c @@ -9669,6 +9669,16 @@ void __thiscall basic_istream_char_swap(basic_istream_char *this, basic_istream_ this->count ^= r->count; } +/* ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z */ +/* ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z */ +DEFINE_THISCALL_WRAPPER(basic_istream_char_assign, 8) +basic_istream_char* __thiscall basic_istream_char_assign(basic_istream_char *this, basic_istream_char *r) +{ + TRACE("(%p %p)\n", this, r); + basic_istream_char_swap(this, r); + return this; +} + /* Caution: basic_istream uses virtual inheritance. */ static inline basic_ios_wchar* basic_istream_wchar_get_basic_ios(basic_istream_wchar *this) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10636
Piotr Caban (@piotr) commented about dlls/msvcp90/tests/ios.c:
"@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z"); }
+ msvcp140_mod = LoadLibraryA("msvcp140.dll");
It's not safe to use contructor from msvcp90 and operator=(&&) from msvcp140. Please test the functionality in msvcp140 tests. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10636#note_135875
participants (3)
-
Piotr Caban (@piotr) -
Theodoros Chatzigiannakis -
Theodoros Chatzigiannakis (@TChatzigiannakis)