From f23600cd30b8728aefa5c8bf95f08cf62f8e0d58 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 20 Apr 2017 13:53:36 +0200 Subject: [PATCH] Fixed: Compilation in 32 bits with GCC (patch provided by Alistair Leslie-Hughes, thanks a lot) --HG-- branch : develop --- code/nel/include/nel/misc/types_nl.h | 13 +++++++++++++ code/nel/src/misc/common.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index a532a47fb..71702bce5 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -166,6 +166,10 @@ # define NL_ISO_CPP0X_AVAILABLE #endif +#if defined(NL_COMP_GCC) && (__cplusplus >= 201103L) +# define NL_NO_EXCEPTION_SPECS +#endif + // gcc 3.4 introduced ISO C++ with tough template rules // // NL_ISO_SYNTAX can be used using #if NL_ISO_SYNTAX or #if !NL_ISO_SYNTAX @@ -407,12 +411,21 @@ typedef unsigned int uint; // at least 32bits (depend of processor) #ifndef NL_CPU_X86_64 // on x86_64, new and delete are already aligned on 16 bytes + +#ifdef NL_NO_EXCEPTION_SPECS +extern void *operator new(size_t size); +extern void *operator new[](size_t size); +extern void operator delete(void *p) noexcept; +extern void operator delete[](void *p) noexcept; +#else extern void *operator new(size_t size) throw(std::bad_alloc); extern void *operator new[](size_t size) throw(std::bad_alloc); extern void operator delete(void *p) throw(); extern void operator delete[](void *p) throw(); #endif +#endif + #else /* NL_HAS_SSE2 */ #define NL_DEFAULT_MEMORY_ALIGNMENT 4 diff --git a/code/nel/src/misc/common.cpp b/code/nel/src/misc/common.cpp index 31f289381..7eebdafbf 100644 --- a/code/nel/src/misc/common.cpp +++ b/code/nel/src/misc/common.cpp @@ -82,6 +82,31 @@ extern "C" long _ftol2( double dblSource ) { return _ftol( dblSource ); } #if defined(NL_HAS_SSE2) && !defined(NL_CPU_X86_64) +#ifdef NL_NO_EXCEPTION_SPECS +void *operator new(size_t size) +{ + void *p = aligned_malloc(size, NL_DEFAULT_MEMORY_ALIGNMENT); + if (p == NULL) throw std::bad_alloc(); + return p; +} + +void *operator new[](size_t size) +{ + void *p = aligned_malloc(size, NL_DEFAULT_MEMORY_ALIGNMENT); + if (p == NULL) throw std::bad_alloc(); + return p; +} + +void operator delete(void *p) noexcept +{ + aligned_free(p); +} + +void operator delete[](void *p) noexcept +{ + aligned_free(p); +} +#else void *operator new(size_t size) throw(std::bad_alloc) { void *p = aligned_malloc(size, NL_DEFAULT_MEMORY_ALIGNMENT); @@ -105,6 +130,7 @@ void operator delete[](void *p) throw() { aligned_free(p); } +#endif #endif /* NL_HAS_SSE2 */