[PATCH 0/2] MR10159: msvcrt: Add __ExceptionPtrSwap implementation.
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..027bd09a1bb 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_RECORD *rec = a->rec; + a->rec = b->rec; + b->rec = rec; +} #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/msvcp90/exception.c | 11 +++++++++++ dlls/msvcp_win/msvcp_win.spec | 4 ++-- 3 files changed, 15 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/msvcp90/exception.c b/dlls/msvcp90/exception.c index 01a366078b2..c9610537f6c 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_RECORD *rec = a->rec; + a->rec = b->rec; + b->rec = rec; +} + /********************************************************************* * ?__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
Piotr Caban (@piotr) commented about dlls/msvcp90/exception.c:
return !!ep->rec; }
+/********************************************************************* + * ?__ExceptionPtrSwap@@YAXPAX0@Z + * ?__ExceptionPtrSwap@@YAXPEAX0@Z + */ +void __cdecl __ExceptionPtrSwap(exception_ptr *a, exception_ptr *b) +{ + EXCEPTION_RECORD *rec = a->rec; + a->rec = b->rec; + b->rec = rec;
Please also swap the reference counter (it's probably best to make a copy of whole exception_ptr structure). -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10159#note_130189
participants (3)
-
Jacek Caban -
Jacek Caban (@jacek) -
Piotr Caban (@piotr)