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