[PATCH v2 0/2] MR10159: msvcrt: Add __ExceptionPtrSwap implementation.
-- v2: msvcp140: Add __ExceptionPtrSwap implementation. msvcrt: Add __ExceptionPtrSwap implementation. https://gitlab.winehq.org/wine/wine/-/merge_requests/10159
From: Jacek Caban <jacek@codeweavers.com> Based on patch by Rémi Bernon. --- dlls/msvcr110/msvcr110.spec | 4 ++-- dlls/msvcr120/msvcr120.spec | 4 ++-- dlls/msvcr120_app/msvcr120_app.spec | 4 ++-- dlls/msvcrt/exception_ptr.c | 11 +++++++++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 760cfaeddd2..cada8e2c49b 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -702,8 +702,8 @@ @ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) __ExceptionPtrDestroy @ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) __ExceptionPtrRethrow @ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) __ExceptionPtrRethrow -@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z -@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z(ptr ptr) __ExceptionPtrSwap +@ cdecl -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z(ptr ptr) __ExceptionPtrSwap @ cdecl -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z(ptr) __ExceptionPtrToBool @ cdecl -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z(ptr) __ExceptionPtrToBool @ cdecl __uncaught_exception() diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 8613968ffb2..237f2235cc7 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -685,8 +685,8 @@ @ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) __ExceptionPtrDestroy @ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) __ExceptionPtrRethrow @ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) __ExceptionPtrRethrow -@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z -@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z(ptr ptr) __ExceptionPtrSwap +@ cdecl -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z(ptr ptr) __ExceptionPtrSwap @ cdecl -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z(ptr) __ExceptionPtrToBool @ cdecl -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z(ptr) __ExceptionPtrToBool @ cdecl __uncaught_exception() diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index e765ec1d5e5..d97d99adbf6 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -682,8 +682,8 @@ @ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) msvcr120.?__ExceptionPtrDestroy@@YAXPEAX@Z @ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) msvcr120.?__ExceptionPtrRethrow@@YAXPBX@Z @ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) msvcr120.?__ExceptionPtrRethrow@@YAXPEBX@Z -@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z -@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z(ptr ptr) msvcr120.?__ExceptionPtrSwap@@YAXPAX0@Z +@ cdecl -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z(ptr ptr) msvcr120.?__ExceptionPtrSwap@@YAXPEAX0@Z @ cdecl -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z(ptr) msvcr120.?__ExceptionPtrToBool@@YA_NPBX@Z @ cdecl -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z(ptr) msvcr120.?__ExceptionPtrToBool@@YA_NPEBX@Z @ cdecl __uncaught_exception() msvcr120.__uncaught_exception diff --git a/dlls/msvcrt/exception_ptr.c b/dlls/msvcrt/exception_ptr.c index 383d16166aa..39e59697b01 100644 --- a/dlls/msvcrt/exception_ptr.c +++ b/dlls/msvcrt/exception_ptr.c @@ -198,6 +198,17 @@ bool __cdecl __ExceptionPtrToBool(exception_ptr *ep) { return !!ep->rec; } + +/********************************************************************* + * ?__ExceptionPtrSwap@@YAXPAX0@Z + * ?__ExceptionPtrSwap@@YAXPEAX0@Z + */ +void __cdecl __ExceptionPtrSwap(exception_ptr *a, exception_ptr *b) +{ + exception_ptr tmp = *a; + *a = *b; + *b = tmp; +} #endif /********************************************************************* -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10159
From: Jacek Caban <jacek@codeweavers.com> Based on patch by Rémi Bernon. --- dlls/msvcp140/msvcp140.spec | 4 ++-- dlls/msvcp140/tests/msvcp140.c | 26 ++++++++++++++++++++++++++ dlls/msvcp90/exception.c | 11 +++++++++++ dlls/msvcp_win/msvcp_win.spec | 4 ++-- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 0a8af0ec04b..8e769af1242 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -1706,8 +1706,8 @@ @ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) __ExceptionPtrDestroy @ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) __ExceptionPtrRethrow @ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) __ExceptionPtrRethrow -@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z -@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z(ptr ptr) __ExceptionPtrSwap +@ cdecl -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z(ptr ptr) __ExceptionPtrSwap @ cdecl -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z(ptr) __ExceptionPtrToBool @ cdecl -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z(ptr) __ExceptionPtrToBool @ cdecl -arch=arm ?always_noconv@codecvt_base@std@@QBA_NXZ(ptr) codecvt_base_always_noconv diff --git a/dlls/msvcp140/tests/msvcp140.c b/dlls/msvcp140/tests/msvcp140.c index 48fe66f080e..32f06741cfe 100644 --- a/dlls/msvcp140/tests/msvcp140.c +++ b/dlls/msvcp140/tests/msvcp140.c @@ -353,6 +353,14 @@ static int (__thiscall * p_codecvt_char16_do_in)(const codecvt_char16 *this, _Mb const char *from, const char *from_end, const char **from_next, char16_t *to, char16_t *to_end, char16_t **to_next); +typedef struct +{ + EXCEPTION_RECORD *rec; + LONG *ref; +} exception_ptr; + +static void (__cdecl *p___ExceptionPtrSwap)(exception_ptr *a, exception_ptr *b); + static HMODULE msvcp; #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) @@ -374,6 +382,7 @@ static BOOL init(void) if(sizeof(void*) == 8) { /* 64-bit initialization */ SET(p_task_continuation_context_ctor, "??0task_continuation_context@Concurrency@@AEAA@XZ"); + SET(p___ExceptionPtrSwap, "?__ExceptionPtrSwap@@YAXPEAX0@Z"); SET(p__ContextCallback__Assign, "?_Assign@_ContextCallback@details@Concurrency@@AEAAXPEAX@Z"); SET(p__ContextCallback__CallInContext, "?_CallInContext@_ContextCallback@details@Concurrency@@QEBAXV?$function@$$A6AXXZ@std@@_N@Z"); SET(p__ContextCallback__Capture, "?_Capture@_ContextCallback@details@Concurrency@@AEAAXXZ"); @@ -436,6 +445,7 @@ static BOOL init(void) SET(p_codecvt_char16_do_out, "?do_out@?$codecvt@_SDU_Mbstatet@@@std@@MBEHAAU_Mbstatet@@PB_S1AAPB_SPAD3AAPAD@Z"); SET(p_codecvt_char16_do_in, "?do_in@?$codecvt@_SDU_Mbstatet@@@std@@MBEHAAU_Mbstatet@@PBD1AAPBDPA_S3AAPA_S@Z"); #endif + SET(p___ExceptionPtrSwap, "?__ExceptionPtrSwap@@YAXPAX0@Z"); SET(p__Schedule_chore, "?_Schedule_chore@details@Concurrency@@YAHPAU_Threadpool_chore@12@@Z"); SET(p__Reschedule_chore, "?_Reschedule_chore@details@Concurrency@@YAHPBU_Threadpool_chore@12@@Z"); SET(p__Release_chore, "?_Release_chore@details@Concurrency@@YAXPAU_Threadpool_chore@12@@Z"); @@ -2453,6 +2463,21 @@ static void test_thread_library_reference(void) CloseHandle(detach_event); } +static void test_exception_pointer(void) +{ + exception_ptr ptr1, ptr2; + + ptr1.rec = (void *)1; + ptr1.ref = (void *)2; + ptr2.rec = (void *)3; + ptr2.ref = (void *)4; + p___ExceptionPtrSwap(&ptr1, &ptr2); + ok(ptr1.rec == (void *)3, "ptr1.rec = %p\n", ptr1.rec); + ok(ptr1.ref == (void *)4, "ptr1.ref = %p\n", ptr1.ref); + ok(ptr2.rec == (void *)1, "ptr2.rec = %p\n", ptr2.rec); + ok(ptr2.ref == (void *)2, "ptr2.ref = %p\n", ptr2.ref); +} + START_TEST(msvcp140) { if(!init()) return; @@ -2484,5 +2509,6 @@ START_TEST(msvcp140) test__Fiopen(); test_codecvt_char16(); test_thread_library_reference(); + test_exception_pointer(); FreeLibrary(msvcp); } diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c index 01a366078b2..51bc0b7cfec 100644 --- a/dlls/msvcp90/exception.c +++ b/dlls/msvcp90/exception.c @@ -1370,6 +1370,17 @@ bool __cdecl __ExceptionPtrToBool(exception_ptr *ep) return !!ep->rec; } +/********************************************************************* + * ?__ExceptionPtrSwap@@YAXPAX0@Z + * ?__ExceptionPtrSwap@@YAXPEAX0@Z + */ +void __cdecl __ExceptionPtrSwap(exception_ptr *a, exception_ptr *b) +{ + exception_ptr tmp = *a; + *a = *b; + *b = tmp; +} + /********************************************************************* * ?__ExceptionPtrCopyException@@YAXPAXPBX1@Z * ?__ExceptionPtrCopyException@@YAXPEAXPEBX1@Z diff --git a/dlls/msvcp_win/msvcp_win.spec b/dlls/msvcp_win/msvcp_win.spec index 3b53cb8b564..c0f4888507d 100644 --- a/dlls/msvcp_win/msvcp_win.spec +++ b/dlls/msvcp_win/msvcp_win.spec @@ -1705,8 +1705,8 @@ @ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) msvcp140.?__ExceptionPtrDestroy@@YAXPEAX@Z @ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) msvcp140.?__ExceptionPtrRethrow@@YAXPBX@Z @ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) msvcp140.?__ExceptionPtrRethrow@@YAXPEBX@Z -@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z -@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z(ptr ptr) msvcp140.?__ExceptionPtrSwap@@YAXPAX0@Z +@ cdecl -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z(ptr ptr) msvcp140.?__ExceptionPtrSwap@@YAXPEAX0@Z @ cdecl -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z(ptr) msvcp140.?__ExceptionPtrToBool@@YA_NPBX@Z @ cdecl -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z(ptr) msvcp140.?__ExceptionPtrToBool@@YA_NPEBX@Z @ cdecl -arch=arm ?always_noconv@codecvt_base@std@@QBA_NXZ(ptr) msvcp140.?always_noconv@codecvt_base@std@@QBA_NXZ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10159
On Mon Feb 23 11:14:23 2026 +0000, Jacek Caban wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/10159/diffs?diff_id=246178&start_sha=be29a7f01f657cc6846ea0aa237f8efdc4eea2f0#4fa775c6c81988b993812f10b7038ad92a8bc5e2_1381_1379) Fixed in the new version, thanks. I also added a test case.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10159#note_130204
The crash in tests is not related to this patch. It should be fixed by !10165. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10159#note_130215
This merge request was approved by Piotr Caban. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10159
participants (3)
-
Jacek Caban -
Jacek Caban (@jacek) -
Piotr Caban (@piotr)