Piotr Caban : msvcp90: Don't use throw_exception helper for bad_alloc exception.
Alexandre Julliard
julliard at winehq.org
Thu Aug 26 15:22:31 CDT 2021
Module: wine
Branch: master
Commit: 1c09a7c5c4bd4ef851a42180396d87ea6cd500b9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1c09a7c5c4bd4ef851a42180396d87ea6cd500b9
Author: Piotr Caban <piotr at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 at details@Concurrency@@IAE at 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 at 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 at 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 at std@@YAXPBD at 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;
}
More information about the wine-cvs
mailing list