diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2023-04-19 08:12:13 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-04-20 11:24:16 +0300 |
commit | 906c14ec7907c28b5652ed253f7a48b259ee84e5 (patch) | |
tree | 95fa2b73297c2b1892a493dc087c953bcac40f80 | |
parent | d25fee545bcf270231bfe5a683fa61d5ae795338 (diff) | |
download | bdwgc-906c14ec7907c28b5652ed253f7a48b259ee84e5.tar.gz |
Define sized delete operator in 'gc' class
* gc_cpp.cc [!_MSC_VER && !__DMC__ || GC_NO_INLINE_STD_NEW]
(operator delete): Replace __cplusplus>=201703L||_MSVC_LANG>=201703L
to defined(GC_OPERATOR_SIZED_DELETE).
* include/gc/gc_cpp.h [GC_INLINE_STD_NEW]: Likewise.
* gc_cpp.cc [!_MSC_VER && !__DMC__ || GC_NO_INLINE_STD_NEW]
(GC_ALLOCATOR_THROW_OR_ABORT, operator new, operator delete,
operator new[], operator delete[]): Do not define if GC_INLINE_STD_NEW.
* gc_cpp.cc (operator new, operator delete): Reformat code.
* include/gc/gc_cpp.h [!GC_NO_INLINE_STD_NEW && !GC_INLINE_STD_NEW
&& (_MSC_VER || __DMC__ || (__BORLANDC__ || __CYGWIN__ || __CYGWIN32__
|| __MINGW32__ || __WATCOMC__) && !GC_BUILD && !GC_NOT_DLL)]
(GC_INLINE_STD_NEW): Define macro.
* include/gc/gc_cpp.h [!GC_NO_OPERATOR_SIZED_DELETE
&& !GC_OPERATOR_SIZED_DELETE && (__cplusplus>=201402L
|| _MSVC_LANG>=201402L)] (GC_OPERATOR_SIZED_DELETE): Likewise.
* include/gc/gc_cpp.h [!GC_NO_INLINE_STD_NEW && (_MSC_VER || __DMC__
|| (__BORLANDC__ || __CYGWIN__ || __CYGWIN32__ || __MINGW32__
|| __WATCOMC__) && !GC_BUILD && !GC_NOT_DLL)]: Check GC_INLINE_STD_NEW
instead.
* include/gc/gc_cpp.h [GC_OPERATOR_SIZED_DELETE]
(gc::operator delete(void*,GC_SIZE_T)): Declare.
* include/gc/gc_cpp.h [GC_OPERATOR_NEW_ARRAY
&& GC_OPERATOR_SIZED_DELETE] (gc::operator delete[](void*,GC_SIZE_T)):
Likewise.
* include/gc/gc_cpp.h [GC_NO_INLINE_STD_NEW && _MSC_VER
&& GC_OPERATOR_NEW_ARRAY && GC_OPERATOR_SIZED_DELETE]
(operator delete[](void*,GC_SIZE_T)): Likewise.
* include/gc/gc_cpp.h [GC_NO_INLINE_STD_NEW && _MSC_VER
&& GC_OPERATOR_SIZED_DELETE] (operator delete(void*,GC_SIZE_T)):
Likewise.
* include/gc/gc_cpp.h [GC_OPERATOR_SIZED_DELETE]
(gc::operator delete(void*,GC_SIZE_T)): Define inline function.
* include/gc/gc_cpp.h [GC_OPERATOR_NEW_ARRAY
&& GC_OPERATOR_SIZED_DELETE] (gc::operator delete[](void*,GC_SIZE_T)):
Likewise.
-rw-r--r-- | gc_cpp.cc | 25 | ||||
-rw-r--r-- | include/gc/gc_cpp.h | 110 |
2 files changed, 90 insertions, 45 deletions
@@ -38,7 +38,8 @@ built-in "new" and "delete". #endif #include "gc/gc_cpp.h" -#if !(defined(_MSC_VER) || defined(__DMC__)) || defined(GC_NO_INLINE_STD_NEW) +#if (!defined(_MSC_VER) && !defined(__DMC__) \ + || defined(GC_NO_INLINE_STD_NEW)) && !defined(GC_INLINE_STD_NEW) # if defined(GC_NEW_ABORTS_ON_OOM) || defined(_LIBCPP_NO_EXCEPTIONS) # define GC_ALLOCATOR_THROW_OR_ABORT() GC_abort_on_oom() @@ -47,7 +48,8 @@ built-in "new" and "delete". # define GC_ALLOCATOR_THROW_OR_ABORT() throw std::bad_alloc() # endif - void* operator new(GC_SIZE_T size) GC_DECL_NEW_THROW { + void* operator new(GC_SIZE_T size) GC_DECL_NEW_THROW + { void* obj = GC_MALLOC_UNCOLLECTABLE(size); if (0 == obj) GC_ALLOCATOR_THROW_OR_ABORT(); @@ -71,12 +73,14 @@ built-in "new" and "delete". } # endif // _MSC_VER - void operator delete(void* obj) GC_NOEXCEPT { + void operator delete(void* obj) GC_NOEXCEPT + { GC_FREE(obj); } # if defined(GC_OPERATOR_NEW_ARRAY) && !defined(CPPCHECK) - void* operator new[](GC_SIZE_T size) GC_DECL_NEW_THROW { + void* operator new[](GC_SIZE_T size) GC_DECL_NEW_THROW + { void* obj = GC_MALLOC_UNCOLLECTABLE(size); if (0 == obj) GC_ALLOCATOR_THROW_OR_ABORT(); @@ -92,21 +96,24 @@ built-in "new" and "delete". } # endif // _MSC_VER - void operator delete[](void* obj) GC_NOEXCEPT { + void operator delete[](void* obj) GC_NOEXCEPT + { GC_FREE(obj); } # endif // GC_OPERATOR_NEW_ARRAY -# if __cplusplus >= 201402L || _MSVC_LANG >= 201402L // C++14 - void operator delete(void* obj, GC_SIZE_T) GC_NOEXCEPT { +# ifdef GC_OPERATOR_SIZED_DELETE + void operator delete(void* obj, GC_SIZE_T) GC_NOEXCEPT + { GC_FREE(obj); } # if defined(GC_OPERATOR_NEW_ARRAY) && !defined(CPPCHECK) - void operator delete[](void* obj, GC_SIZE_T) GC_NOEXCEPT { + void operator delete[](void* obj, GC_SIZE_T) GC_NOEXCEPT + { GC_FREE(obj); } # endif -# endif // C++14 +# endif // GC_OPERATOR_SIZED_DELETE #endif // !_MSC_VER && !__DMC__ || GC_NO_INLINE_STD_NEW diff --git a/include/gc/gc_cpp.h b/include/gc/gc_cpp.h index 2976d61a..d06a74d9 100644 --- a/include/gc/gc_cpp.h +++ b/include/gc/gc_cpp.h @@ -163,12 +163,29 @@ by UseGC. GC is an alias for UseGC, unless GC_NAME_CONFLICT is defined. # define GC_OPERATOR_NEW_ARRAY #endif +#if !defined(GC_NO_INLINE_STD_NEW) && !defined(GC_INLINE_STD_NEW) \ + && (defined(_MSC_VER) || defined(__DMC__) \ + || ((defined(__BORLANDC__) || defined(__CYGWIN__) \ + || defined(__CYGWIN32__) || defined(__MINGW32__) \ + || defined(__WATCOMC__)) \ + && !defined(GC_BUILD) && !defined(GC_NOT_DLL))) + // Inlining done to avoid mix up of new and delete operators by VC++ 9 + // (due to arbitrary ordering during linking). +# define GC_INLINE_STD_NEW +#endif + #if (!defined(__BORLANDC__) || __BORLANDC__ > 0x0620) \ && !defined(__sgi) && !defined(__WATCOMC__) \ && (!defined(_MSC_VER) || _MSC_VER > 1020) # define GC_PLACEMENT_DELETE #endif +#if !defined(GC_OPERATOR_SIZED_DELETE) \ + && !defined(GC_NO_OPERATOR_SIZED_DELETE) \ + && (__cplusplus >= 201402L || _MSVC_LANG >= 201402L) // C++14 +# define GC_OPERATOR_SIZED_DELETE +#endif + #if !defined(GC_NEW_DELETE_THROW_NOT_NEEDED) \ && !defined(GC_NEW_DELETE_NEED_THROW) && GC_GNUC_PREREQ(4, 2) \ && (__cplusplus < 201103L || defined(__clang__)) @@ -229,6 +246,9 @@ public: // Must be redefined here, since the other overloadings hide // the global definition. inline void operator delete(void*) GC_NOEXCEPT; +# ifdef GC_OPERATOR_SIZED_DELETE + inline void operator delete(void*, GC_SIZE_T) GC_NOEXCEPT; +# endif # ifdef GC_PLACEMENT_DELETE inline void operator delete(void*, GCPlacement) GC_NOEXCEPT; @@ -241,6 +261,9 @@ public: inline void* operator new[](GC_SIZE_T, GCPlacement); inline void* operator new[](GC_SIZE_T, void*) GC_NOEXCEPT; inline void operator delete[](void*) GC_NOEXCEPT; +# ifdef GC_OPERATOR_SIZED_DELETE + inline void operator delete[](void*, GC_SIZE_T) GC_NOEXCEPT; +# endif # ifdef GC_PLACEMENT_DELETE inline void operator delete[](void*, GCPlacement) GC_NOEXCEPT; inline void operator delete[](void*, void*) GC_NOEXCEPT; @@ -303,54 +326,47 @@ inline void* operator new(GC_SIZE_T, GC_NS_QUALIFY(GCPlacement), void*) GC_NOEXCEPT; #endif -#ifndef GC_NO_INLINE_STD_NEW - -# if defined(_MSC_VER) || defined(__DMC__) \ - || ((defined(__BORLANDC__) || defined(__CYGWIN__) \ - || defined(__CYGWIN32__) || defined(__MINGW32__) \ - || defined(__WATCOMC__)) \ - && !defined(GC_BUILD) && !defined(GC_NOT_DLL)) - // Inlining done to avoid mix up of new and delete operators by VC++ 9 - // (due to arbitrary ordering during linking). - -# ifdef GC_OPERATOR_NEW_ARRAY - inline void* operator new[](GC_SIZE_T size) GC_DECL_NEW_THROW - { - void* obj = GC_MALLOC_UNCOLLECTABLE(size); - GC_OP_NEW_OOM_CHECK(obj); - return obj; - } - - inline void operator delete[](void* obj) GC_NOEXCEPT - { - GC_FREE(obj); - } -# endif // GC_OPERATOR_NEW_ARRAY +#ifdef GC_INLINE_STD_NEW - inline void* operator new(GC_SIZE_T size) GC_DECL_NEW_THROW +# ifdef GC_OPERATOR_NEW_ARRAY + inline void* operator new[](GC_SIZE_T size) GC_DECL_NEW_THROW { void* obj = GC_MALLOC_UNCOLLECTABLE(size); GC_OP_NEW_OOM_CHECK(obj); return obj; } - inline void operator delete(void* obj) GC_NOEXCEPT + inline void operator delete[](void* obj) GC_NOEXCEPT { GC_FREE(obj); } +# endif // GC_OPERATOR_NEW_ARRAY -# if __cplusplus >= 201402L || _MSVC_LANG >= 201402L // C++14 - inline void operator delete(void* obj, GC_SIZE_T) GC_NOEXCEPT { + inline void* operator new(GC_SIZE_T size) GC_DECL_NEW_THROW + { + void* obj = GC_MALLOC_UNCOLLECTABLE(size); + GC_OP_NEW_OOM_CHECK(obj); + return obj; + } + + inline void operator delete(void* obj) GC_NOEXCEPT + { + GC_FREE(obj); + } + +# ifdef GC_OPERATOR_SIZED_DELETE + inline void operator delete(void* obj, GC_SIZE_T) GC_NOEXCEPT + { + GC_FREE(obj); + } + +# ifdef GC_OPERATOR_NEW_ARRAY + inline void operator delete[](void* obj, GC_SIZE_T) GC_NOEXCEPT + { GC_FREE(obj); } - -# if defined(GC_OPERATOR_NEW_ARRAY) - inline void operator delete[](void* obj, GC_SIZE_T) GC_NOEXCEPT { - GC_FREE(obj); - } -# endif -# endif // C++14 -# endif // _MSC_VER || __CYGWIN__ && !GC_BUILD && !GC_NOT_DLL +# endif +# endif // GC_OPERATOR_SIZED_DELETE # ifdef _MSC_VER // This new operator is used by VC++ in case of Debug builds. @@ -377,7 +393,8 @@ inline void* operator new(GC_SIZE_T, GC_NS_QUALIFY(GCPlacement), # endif # endif // _MSC_VER -#elif defined(_MSC_VER) /* && GC_NO_INLINE_STD_NEW */ +#elif defined(GC_NO_INLINE_STD_NEW) && defined(_MSC_VER) + // The following ensures that the system default operator new[] does not // get undefined, which is what seems to happen on VC++ 6 for some reason // if we define a multi-argument operator new[]. @@ -386,6 +403,9 @@ inline void* operator new(GC_SIZE_T, GC_NS_QUALIFY(GCPlacement), # ifdef GC_OPERATOR_NEW_ARRAY void* operator new[](GC_SIZE_T) GC_DECL_NEW_THROW; void operator delete[](void*) GC_NOEXCEPT; +# ifdef GC_OPERATOR_SIZED_DELETE + void operator delete[](void*, GC_SIZE_T) GC_NOEXCEPT; +# endif void* operator new[](GC_SIZE_T, int /* nBlockUse */, const char* /* szFileName */, int /* nLine */); @@ -393,9 +413,13 @@ inline void* operator new(GC_SIZE_T, GC_NS_QUALIFY(GCPlacement), void* operator new(GC_SIZE_T) GC_DECL_NEW_THROW; void operator delete(void*) GC_NOEXCEPT; +# ifdef GC_OPERATOR_SIZED_DELETE + void operator delete(void*, GC_SIZE_T) GC_NOEXCEPT; +# endif void* operator new(GC_SIZE_T, int /* nBlockUse */, const char* /* szFileName */, int /* nLine */); + #endif // GC_NO_INLINE_STD_NEW && _MSC_VER #ifdef GC_OPERATOR_NEW_ARRAY @@ -452,6 +476,13 @@ inline void gc::operator delete(void* obj) GC_NOEXCEPT GC_FREE(obj); } +#ifdef GC_OPERATOR_SIZED_DELETE + inline void gc::operator delete(void* obj, GC_SIZE_T) GC_NOEXCEPT + { + GC_FREE(obj); + } +#endif + #ifdef GC_PLACEMENT_DELETE inline void gc::operator delete(void*, void*) GC_NOEXCEPT {} @@ -482,6 +513,13 @@ inline void gc::operator delete(void* obj) GC_NOEXCEPT gc::operator delete(obj); } +# ifdef GC_OPERATOR_SIZED_DELETE + inline void gc::operator delete[](void* obj, GC_SIZE_T size) GC_NOEXCEPT + { + gc::operator delete(obj, size); + } +# endif + # ifdef GC_PLACEMENT_DELETE inline void gc::operator delete[](void*, void*) GC_NOEXCEPT {} |