summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-04-19 08:12:13 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-04-20 11:24:16 +0300
commit906c14ec7907c28b5652ed253f7a48b259ee84e5 (patch)
tree95fa2b73297c2b1892a493dc087c953bcac40f80
parentd25fee545bcf270231bfe5a683fa61d5ae795338 (diff)
downloadbdwgc-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.cc25
-rw-r--r--include/gc/gc_cpp.h110
2 files changed, 90 insertions, 45 deletions
diff --git a/gc_cpp.cc b/gc_cpp.cc
index 1f25ce4e..bcc049f5 100644
--- a/gc_cpp.cc
+++ b/gc_cpp.cc
@@ -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 {}