Module: wine Branch: master Commit: 1c09a7c5c4bd4ef851a42180396d87ea6cd500b9 URL: https://source.winehq.org/git/wine.git/?a=commit;h=1c09a7c5c4bd4ef851a421803...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Aug 26 14:21:28 2021 +0200
msvcp90: Don't use throw_exception helper for bad_alloc exception.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcp60/main.c | 2 +- dlls/msvcp60/msvcp.h | 1 + dlls/msvcp90/cxx.h | 1 - dlls/msvcp90/details.c | 2 +- dlls/msvcp90/exception.c | 21 ++++++++++++--------- dlls/msvcp90/memory.c | 12 ++---------- dlls/msvcp90/msvcp90.h | 3 ++- dlls/msvcp90/msvcp_main.c | 5 ++--- 8 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/dlls/msvcp60/main.c b/dlls/msvcp60/main.c index 9d77fd190ca..cecea919bed 100644 --- a/dlls/msvcp60/main.c +++ b/dlls/msvcp60/main.c @@ -65,7 +65,7 @@ void* (__cdecl *MSVCRT_set_new_handler)(void*); void* __cdecl operator_new(size_t size) { void *ret = MSVCRT_operator_new(size); - if (!ret) throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); + if (!ret) _Xmem(); return ret; }
diff --git a/dlls/msvcp60/msvcp.h b/dlls/msvcp60/msvcp.h index d60a588b3eb..1f53a31ad97 100644 --- a/dlls/msvcp60/msvcp.h +++ b/dlls/msvcp60/msvcp.h @@ -485,3 +485,4 @@ typedef struct { } complex_double;
void WINAPI DECLSPEC_NORETURN _CxxThrowException(exception*,const cxx_exception_type*); +void __cdecl DECLSPEC_NORETURN _Xmem(void); diff --git a/dlls/msvcp90/cxx.h b/dlls/msvcp90/cxx.h index 50d78dbddb6..c1000579443 100644 --- a/dlls/msvcp90/cxx.h +++ b/dlls/msvcp90/cxx.h @@ -317,7 +317,6 @@ typedef struct __exception /* Internal: throws selected exception */ typedef enum __exception_type { EXCEPTION, - EXCEPTION_BAD_ALLOC, EXCEPTION_BAD_CAST, EXCEPTION_LOGIC_ERROR, EXCEPTION_LENGTH_ERROR, diff --git a/dlls/msvcp90/details.c b/dlls/msvcp90/details.c index b265bf1be71..d2c51b7ff0a 100644 --- a/dlls/msvcp90/details.c +++ b/dlls/msvcp90/details.c @@ -89,7 +89,7 @@ void __thiscall _Concurrent_queue_base_v4__Internal_throw_exception( const _Concurrent_queue_base_v4 *this) { TRACE("(%p)\n", this); - throw_exception(EXCEPTION_BAD_ALLOC, NULL); + _Xmem(); }
/* ??0_Concurrent_queue_base_v4@details@Concurrency@@IAE@I@Z */ diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c index eec72b9964d..115e0374f7f 100644 --- a/dlls/msvcp90/exception.c +++ b/dlls/msvcp90/exception.c @@ -867,17 +867,25 @@ DEFINE_RTTI_DATA2(range_error, 0, &runtime_error_rtti_base_descriptor, &exceptio DEFINE_CXX_DATA2(range_error, &runtime_error_cxx_type_info, &exception_cxx_type_info, MSVCP_runtime_error_dtor)
/* ?_Nomemory@std@@YAXXZ */ -void __cdecl _Nomemory(void) +void __cdecl DECLSPEC_NORETURN _Nomemory(void) { + bad_alloc e; + TRACE("()\n"); - throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); + + MSVCP_bad_alloc_default_ctor(&e); + _CxxThrowException(&e, &bad_alloc_cxx_type); }
/* ?_Xmem@tr1@std@@YAXXZ */ -void __cdecl _Xmem(void) +void __cdecl DECLSPEC_NORETURN _Xmem(void) { + bad_alloc e; + TRACE("()\n"); - throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); + + MSVCP_bad_alloc_default_ctor(&e); + _CxxThrowException(&e, &bad_alloc_cxx_type); }
/* ?_Xinvalid_argument@std@@YAXPBD@Z */ @@ -1048,11 +1056,6 @@ void throw_exception(exception_type et, const char *str) MSVCP_exception_ctor(&e, name); _CxxThrowException(&e, &exception_cxx_type); } - case EXCEPTION_BAD_ALLOC: { - bad_alloc e; - MSVCP_bad_alloc_ctor(&e, name); - _CxxThrowException(&e, &bad_alloc_cxx_type); - } case EXCEPTION_BAD_CAST: { bad_cast e; MSVCP_bad_cast_ctor(&e, str); diff --git a/dlls/msvcp90/memory.c b/dlls/msvcp90/memory.c index 0e3fb2347e8..d1fe7ce5786 100644 --- a/dlls/msvcp90/memory.c +++ b/dlls/msvcp90/memory.c @@ -170,11 +170,7 @@ void __thiscall MSVCP_allocator_wchar_deallocate(void *this, DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate, 8) wchar_t* __thiscall MSVCP_allocator_wchar_allocate(void *this, size_t count) { - if(UINT_MAX/count < sizeof(wchar_t)) { - throw_exception(EXCEPTION_BAD_ALLOC, NULL); - return NULL; - } - + if(UINT_MAX/count < sizeof(wchar_t)) _Xmem(); return operator_new(count * sizeof(wchar_t)); }
@@ -269,11 +265,7 @@ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate, 8) unsigned short* __thiscall MSVCP_allocator_short_allocate( void *this, size_t count) { - if(UINT_MAX/count < sizeof(unsigned short)) { - throw_exception(EXCEPTION_BAD_ALLOC, NULL); - return NULL; - } - + if(UINT_MAX/count < sizeof(unsigned short)) _Xmem(); return operator_new(count * sizeof(unsigned short)); }
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h index 94098d84135..0ef02b96ea8 100644 --- a/dlls/msvcp90/msvcp90.h +++ b/dlls/msvcp90/msvcp90.h @@ -663,4 +663,5 @@ static inline int mbstowcs_wrapper( size_t *ret, wchar_t *wcs, size_t size, cons #define hypotf( x, y ) ((float)hypot( (double)(x), (double)(y) )) #endif
-void WINAPI _CxxThrowException(exception*,const cxx_exception_type*); +void WINAPI DECLSPEC_NORETURN _CxxThrowException(exception*,const cxx_exception_type*); +void __cdecl DECLSPEC_NORETURN _Xmem(void); diff --git a/dlls/msvcp90/msvcp_main.c b/dlls/msvcp90/msvcp_main.c index eed4beb41ac..7f61f59a078 100644 --- a/dlls/msvcp90/msvcp_main.c +++ b/dlls/msvcp90/msvcp_main.c @@ -94,8 +94,7 @@ void* __cdecl operator_new(size_t size) } while (freed);
TRACE("(%Iu) out of memory\n", size); - throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); - return NULL; + _Xmem(); }
void __cdecl operator_delete(void *mem) @@ -116,7 +115,7 @@ void* __cdecl operator_new(size_t size) { void *ret = MSVCRT_operator_new(size); #if _MSVCP_VER < 80 - if (!ret) throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); + if (!ret) _Xmem(); #endif return ret; }