diff options
-rw-r--r-- | gc_cpp.cc | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -29,22 +29,36 @@ built-in "new" and "delete". #include "gc_cpp.h" -void* operator new( size_t size ) { +#if !defined(GC_NEW_DELETE_NEED_THROW) && defined(__GNUC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) +# define GC_NEW_DELETE_NEED_THROW +#endif + +#ifdef GC_NEW_DELETE_NEED_THROW +# include <new> /* for std::bad_alloc */ +# define GC_DECL_NEW_THROW throw(std::bad_alloc) +# define GC_DECL_DELETE_THROW throw() +#else +# define GC_DECL_NEW_THROW /* empty */ +# define GC_DECL_DELETE_THROW /* empty */ +#endif /* !GC_NEW_DELETE_NEED_THROW */ + +void* operator new( size_t size ) GC_DECL_NEW_THROW { return GC_MALLOC_UNCOLLECTABLE(size); } #if !defined(__CYGWIN__) - void operator delete( void* obj ) { + void operator delete( void* obj ) GC_DECL_DELETE_THROW { GC_FREE(obj); } #endif /* !__CYGWIN__ */ #ifdef GC_OPERATOR_NEW_ARRAY - void* operator new[]( size_t size ) { + void* operator new[]( size_t size ) GC_DECL_NEW_THROW { return GC_MALLOC_UNCOLLECTABLE(size); } - void operator delete[]( void* obj ) { + void operator delete[]( void* obj ) GC_DECL_DELETE_THROW { GC_FREE(obj); } #endif /* GC_OPERATOR_NEW_ARRAY */ @@ -53,7 +67,7 @@ void* operator new( size_t size ) { // This new operator is used by VC++ in case of Debug builds! void* operator new( size_t size, int /* nBlockUse */, - const char * szFileName, int nLine ) + const char * szFileName, int nLine ) GC_DECL_NEW_THROW { # ifndef GC_DEBUG return GC_malloc_uncollectable(size); @@ -65,7 +79,7 @@ void* operator new( size_t size ) { # if _MSC_VER > 1020 // This new operator is used by VC++ 7.0 and later in Debug builds. void* operator new[]( size_t size, int nBlockUse, - const char* szFileName, int nLine ) + const char* szFileName, int nLine ) GC_DECL_NEW_THROW { return operator new(size, nBlockUse, szFileName, nLine); } |