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