-- v2: msvcp110: Add std::_Throw_future_error.
From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcp110/msvcp110.spec | 4 +- dlls/msvcp120/msvcp120.spec | 4 +- dlls/msvcp120_app/msvcp120_app.spec | 4 +- dlls/msvcp140/msvcp140.spec | 4 +- dlls/msvcp90/exception.c | 64 +++++++++++++++++++++++++++++ dlls/msvcp_win/msvcp_win.spec | 4 +- 6 files changed, 74 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index 074ca946b19..4326e9a4589 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -1780,8 +1780,8 @@ @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map @ stub ?_Throw_C_error@std@@YAXH@Z @ stub ?_Throw_Cpp_error@std@@YAXH@Z -@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z -@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ cdecl -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z(ptr) _Throw_future_error +@ cdecl -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z(ptr) _Throw_future_error @ stub ?_Throw_lock_error@threads@stdext@@YAXXZ @ stub ?_Throw_resource_error@threads@stdext@@YAXXZ @ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) _Yarn_char__Tidy diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 0d2a5fe0fca..615172a3376 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -1741,8 +1741,8 @@ @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map @ stub ?_Throw_C_error@std@@YAXH@Z @ stub ?_Throw_Cpp_error@std@@YAXH@Z -@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z -@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ cdecl -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z(ptr) _Throw_future_error +@ cdecl -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z(ptr) _Throw_future_error @ stub ?_Throw_lock_error@threads@stdext@@YAXXZ @ stub ?_Throw_resource_error@threads@stdext@@YAXXZ @ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) _Yarn_char__Tidy diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index d11ba788898..b8f7e4b69e2 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -1741,8 +1741,8 @@ @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) msvcp120.?_Syserror_map@std@@YAPEBDH@Z @ stub ?_Throw_C_error@std@@YAXH@Z @ stub ?_Throw_Cpp_error@std@@YAXH@Z -@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z -@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ cdecl -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z(ptr) msvcp120.?_Throw_future_error@std@@YAXABVerror_code@1@@Z +@ cdecl -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z(ptr) msvcp120.?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z @ stub ?_Throw_lock_error@threads@stdext@@YAXXZ @ stub ?_Throw_resource_error@threads@stdext@@YAXXZ @ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) msvcp120.?_Tidy@?$_Yarn@D@std@@AAAXXZ diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 8e57b828182..258a5acc648 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -1625,8 +1625,8 @@ @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map @ stub ?_Throw_C_error@std@@YAXH@Z @ stub ?_Throw_Cpp_error@std@@YAXH@Z -@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z -@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ cdecl -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z(ptr) _Throw_future_error +@ cdecl -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z(ptr) _Throw_future_error @ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) _Yarn_char__Tidy @ thiscall -arch=i386 ?_Tidy@?$_Yarn@D@std@@AAEXXZ(ptr) _Yarn_char__Tidy @ cdecl -arch=win64 ?_Tidy@?$_Yarn@D@std@@AEAAXXZ(ptr) _Yarn_char__Tidy diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c index 66a5061a4f0..3257b206cc7 100644 --- a/dlls/msvcp90/exception.c +++ b/dlls/msvcp90/exception.c @@ -948,6 +948,59 @@ bool __cdecl MSVCP__uncaught_exception(void) }
#if _MSVCP_VER >= 110 +typedef struct +{ + int code; + void *category; +} error_code; + +typedef struct +{ + logic_error base; + error_code code; +} future_error; + +extern const vtable_ptr future_error_vtable; + +DEFINE_THISCALL_WRAPPER(future_error_copy_ctor, 8) +future_error* __thiscall future_error_copy_ctor(future_error *this, const future_error *rhs) +{ + logic_error_copy_ctor(&this->base, &rhs->base); + this->code = rhs->code; + this->base.e.vtable = &future_error_vtable; + return this; +} + +DEFINE_RTTI_DATA3(future_error, 0, &future_error_rtti_base_descriptor, + &logic_error_rtti_base_descriptor, &exception_rtti_base_descriptor, + ".?AVfuture_error@std@@") +DEFINE_CXX_DATA3(future_error, &logic_error_cxx_type_info, &logic_error_cxx_type_info, + &exception_cxx_type_info, MSVCP_logic_error_dtor) + +/* ?_Throw_future_error@std@@YAXABVerror_code@1@@Z */ +/* ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z */ +void __cdecl DECLSPEC_NORETURN _Throw_future_error( const error_code *error_code ) +{ + const char *names[4] = { + "broken promise", + "future already retrieved", + "promise already satisfied", + "no state", + }; + future_error e; +#if _MSVCP_VER == 110 + const char *name = names[error_code->code]; +#else + const char *name = names[error_code->code-1]; +#endif + + TRACE("(%p)\n", error_code); + + MSVCP_logic_error_ctor(&e.base, EXCEPTION_NAME(name)); + e.code = *error_code; + _CxxThrowException(&e, &future_error_cxx_type); +} + typedef struct { EXCEPTION_RECORD *rec; @@ -1360,6 +1413,11 @@ __ASM_BLOCK_BEGIN(exception_vtables) EXCEPTION_VTABLE(runtime_error, VTABLE_ADD_FUNC(MSVCP_runtime_error_vector_dtor) VTABLE_ADD_FUNC(MSVCP_runtime_error_what)); +#if _MSVCP_VER >= 110 + EXCEPTION_VTABLE(future_error, + VTABLE_ADD_FUNC(MSVCP_logic_error_vector_dtor) + VTABLE_ADD_FUNC(MSVCP_logic_error_what)); +#endif #if _MSVCP_VER > 110 EXCEPTION_VTABLE(_System_error, VTABLE_ADD_FUNC(MSVCP_failure_vector_dtor) @@ -1422,6 +1480,9 @@ void init_exception(void *base) init_out_of_range_rtti(base); init_invalid_argument_rtti(base); init_runtime_error_rtti(base); +#if _MSVCP_VER >= 110 + init_future_error_rtti(base); +#endif #if _MSVCP_VER > 110 init__System_error_rtti(base); #endif @@ -1439,6 +1500,9 @@ void init_exception(void *base) init_out_of_range_cxx(base); init_invalid_argument_cxx(base); init_runtime_error_cxx(base); +#if _MSVCP_VER >= 110 + init_future_error_cxx(base); +#endif #if _MSVCP_VER > 110 init__System_error_cxx_type_info(base); #endif diff --git a/dlls/msvcp_win/msvcp_win.spec b/dlls/msvcp_win/msvcp_win.spec index 0e05582e251..99b34ccc9ac 100644 --- a/dlls/msvcp_win/msvcp_win.spec +++ b/dlls/msvcp_win/msvcp_win.spec @@ -1625,8 +1625,8 @@ @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) msvcp140.?_Syserror_map@std@@YAPEBDH@Z @ stub ?_Throw_C_error@std@@YAXH@Z @ stub ?_Throw_Cpp_error@std@@YAXH@Z -@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z -@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ cdecl -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z(ptr) msvcp140.?_Throw_future_error@std@@YAXABVerror_code@1@@Z +@ cdecl -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z(ptr) msvcp140.?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z @ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) msvcp140.?_Tidy@?$_Yarn@D@std@@AAAXXZ @ thiscall -arch=i386 ?_Tidy@?$_Yarn@D@std@@AAEXXZ(ptr) msvcp140.?_Tidy@?$_Yarn@D@std@@AAEXXZ @ cdecl -arch=win64 ?_Tidy@?$_Yarn@D@std@@AEAAXXZ(ptr) msvcp140.?_Tidy@?$_Yarn@D@std@@AEAAXXZ
On Sat Sep 9 05:21:24 2023 +0000, Daniel Lehman wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/3767/diffs?diff_id=67944&start_sha=19a8d0456546e5fee25054478b933c8fc04b01d3#4fa775c6c81988b993812f10b7038ad92a8bc5e2_994_999)
It still behaves differently comparing to newest msvcp140 when e.g. `error_code->code == 5`.
which version? 5 (and 0) crashes in ucrtbase.dll for me with 14.36.32532.0 which is the latest from https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist
On Sun Sep 10 09:34:06 2023 +0000, Daniel Lehman wrote:
which version? 5 (and 0) crashes in ucrtbase.dll for me with 14.36.32532.0 which is the latest from https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist
I was using the same version of the dll. I've tried something like this: ```c try { _Throw_future_error(error_code(5, generic_category())); } catch (future_error &e) { printf("got error %p\n", e.what()); } ```
`e.what()` returns NULL in this case.
ah.. that's what you meant. i get non-null for 5 and up from msvcp110: ``` ---- msvcp110.dll 0 code 'future:0', what 00007FF9D8133BB8: code 'future:1', what 00007FF9D8133BC8: code 'future:2', what 00007FF9D8133BE8: code 'future:3', what 00007FF9D8133C08: code 'future:4', what 70206E656B6F7262: code 'future:5', what 00006573696D6F72: ---- msvcp120.dll 1 code 'future:1', what 00007FF9C8926C68: code 'future:2', what 00007FF9C8926C78: code 'future:3', what 00007FF9C8926C98: code 'future:4', what 00007FF9C8926CB8: code 'future:5', what 0000000000000000: code 'future:6', what 0000000000000000: ---- msvcp140.dll 1 code 'future:1', what 00007FF9D88390B0: code 'future:2', what 00007FF9D88390C0: code 'future:3', what 00007FF9D88390E0: code 'future:4', what 00007FF9D8839100: code 'future:5', what 0000000000000000: code 'future:6', what 0000000000000000: done ``` but do see null for msvcp120 and msvcp140. i'll fix it