Commit 1c09a7c5 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcp90: Don't use throw_exception helper for bad_alloc exception.

parent 5630ce26
...@@ -65,7 +65,7 @@ void* (__cdecl *MSVCRT_set_new_handler)(void*); ...@@ -65,7 +65,7 @@ void* (__cdecl *MSVCRT_set_new_handler)(void*);
void* __cdecl operator_new(size_t size) void* __cdecl operator_new(size_t size)
{ {
void *ret = MSVCRT_operator_new(size); void *ret = MSVCRT_operator_new(size);
if (!ret) throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); if (!ret) _Xmem();
return ret; return ret;
} }
......
...@@ -485,3 +485,4 @@ typedef struct { ...@@ -485,3 +485,4 @@ typedef struct {
} complex_double; } complex_double;
void WINAPI DECLSPEC_NORETURN _CxxThrowException(exception*,const cxx_exception_type*); void WINAPI DECLSPEC_NORETURN _CxxThrowException(exception*,const cxx_exception_type*);
void __cdecl DECLSPEC_NORETURN _Xmem(void);
...@@ -317,7 +317,6 @@ typedef struct __exception ...@@ -317,7 +317,6 @@ typedef struct __exception
/* Internal: throws selected exception */ /* Internal: throws selected exception */
typedef enum __exception_type { typedef enum __exception_type {
EXCEPTION, EXCEPTION,
EXCEPTION_BAD_ALLOC,
EXCEPTION_BAD_CAST, EXCEPTION_BAD_CAST,
EXCEPTION_LOGIC_ERROR, EXCEPTION_LOGIC_ERROR,
EXCEPTION_LENGTH_ERROR, EXCEPTION_LENGTH_ERROR,
......
...@@ -89,7 +89,7 @@ void __thiscall _Concurrent_queue_base_v4__Internal_throw_exception( ...@@ -89,7 +89,7 @@ void __thiscall _Concurrent_queue_base_v4__Internal_throw_exception(
const _Concurrent_queue_base_v4 *this) const _Concurrent_queue_base_v4 *this)
{ {
TRACE("(%p)\n", this); TRACE("(%p)\n", this);
throw_exception(EXCEPTION_BAD_ALLOC, NULL); _Xmem();
} }
/* ??0_Concurrent_queue_base_v4@details@Concurrency@@IAE@I@Z */ /* ??0_Concurrent_queue_base_v4@details@Concurrency@@IAE@I@Z */
......
...@@ -867,17 +867,25 @@ DEFINE_RTTI_DATA2(range_error, 0, &runtime_error_rtti_base_descriptor, &exceptio ...@@ -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) DEFINE_CXX_DATA2(range_error, &runtime_error_cxx_type_info, &exception_cxx_type_info, MSVCP_runtime_error_dtor)
/* ?_Nomemory@std@@YAXXZ */ /* ?_Nomemory@std@@YAXXZ */
void __cdecl _Nomemory(void) void __cdecl DECLSPEC_NORETURN _Nomemory(void)
{ {
bad_alloc e;
TRACE("()\n"); 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 */ /* ?_Xmem@tr1@std@@YAXXZ */
void __cdecl _Xmem(void) void __cdecl DECLSPEC_NORETURN _Xmem(void)
{ {
bad_alloc e;
TRACE("()\n"); 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 */ /* ?_Xinvalid_argument@std@@YAXPBD@Z */
...@@ -1048,11 +1056,6 @@ void throw_exception(exception_type et, const char *str) ...@@ -1048,11 +1056,6 @@ void throw_exception(exception_type et, const char *str)
MSVCP_exception_ctor(&e, name); MSVCP_exception_ctor(&e, name);
_CxxThrowException(&e, &exception_cxx_type); _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: { case EXCEPTION_BAD_CAST: {
bad_cast e; bad_cast e;
MSVCP_bad_cast_ctor(&e, str); MSVCP_bad_cast_ctor(&e, str);
......
...@@ -170,11 +170,7 @@ void __thiscall MSVCP_allocator_wchar_deallocate(void *this, ...@@ -170,11 +170,7 @@ void __thiscall MSVCP_allocator_wchar_deallocate(void *this,
DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate, 8) DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate, 8)
wchar_t* __thiscall MSVCP_allocator_wchar_allocate(void *this, size_t count) wchar_t* __thiscall MSVCP_allocator_wchar_allocate(void *this, size_t count)
{ {
if(UINT_MAX/count < sizeof(wchar_t)) { if(UINT_MAX/count < sizeof(wchar_t)) _Xmem();
throw_exception(EXCEPTION_BAD_ALLOC, NULL);
return NULL;
}
return operator_new(count * sizeof(wchar_t)); return operator_new(count * sizeof(wchar_t));
} }
...@@ -269,11 +265,7 @@ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate, 8) ...@@ -269,11 +265,7 @@ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate, 8)
unsigned short* __thiscall MSVCP_allocator_short_allocate( unsigned short* __thiscall MSVCP_allocator_short_allocate(
void *this, size_t count) void *this, size_t count)
{ {
if(UINT_MAX/count < sizeof(unsigned short)) { if(UINT_MAX/count < sizeof(unsigned short)) _Xmem();
throw_exception(EXCEPTION_BAD_ALLOC, NULL);
return NULL;
}
return operator_new(count * sizeof(unsigned short)); return operator_new(count * sizeof(unsigned short));
} }
......
...@@ -663,4 +663,5 @@ static inline int mbstowcs_wrapper( size_t *ret, wchar_t *wcs, size_t size, cons ...@@ -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) )) #define hypotf( x, y ) ((float)hypot( (double)(x), (double)(y) ))
#endif #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);
...@@ -94,8 +94,7 @@ void* __cdecl operator_new(size_t size) ...@@ -94,8 +94,7 @@ void* __cdecl operator_new(size_t size)
} while (freed); } while (freed);
TRACE("(%Iu) out of memory\n", size); TRACE("(%Iu) out of memory\n", size);
throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); _Xmem();
return NULL;
} }
void __cdecl operator_delete(void *mem) void __cdecl operator_delete(void *mem)
...@@ -116,7 +115,7 @@ void* __cdecl operator_new(size_t size) ...@@ -116,7 +115,7 @@ void* __cdecl operator_new(size_t size)
{ {
void *ret = MSVCRT_operator_new(size); void *ret = MSVCRT_operator_new(size);
#if _MSVCP_VER < 80 #if _MSVCP_VER < 80
if (!ret) throw_exception(EXCEPTION_BAD_ALLOC, "bad allocation"); if (!ret) _Xmem();
#endif #endif
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment