VirtualBox

Changeset 95860 in vbox


Ignore:
Timestamp:
Jul 27, 2022 12:54:16 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152585
Message:

IPRT/new: Added a generic new/delete operator implementation based on RTMemAlloc (derived from alloc-ef-cpp.cpp). bugref:10261

Location:
trunk
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/generic/new-delete-generic.cpp

    r95811 r95860  
    2929*   Header Files                                                                                                                 *
    3030*********************************************************************************************************************************/
    31 #include "alloc-ef.h"
     31#include <iprt/nocrt/new>
    3232
    33 #include <iprt/asm.h>
    34 #include <new>
     33#include <iprt/assert.h>
     34#include <iprt/mem.h>
    3535
    3636
     
    4040/** @todo test this on MSC */
    4141
    42 /** MSC declares the operators as cdecl it seems. */
    43 #ifdef _MSC_VER
    44 # define RT_EF_CDECL    __cdecl
    45 #else
    46 # define RT_EF_CDECL
    47 #endif
    48 
    49 /** MSC doesn't use the standard namespace. */
    50 #ifdef _MSC_VER
    51 # define RT_EF_SIZE_T   size_t
    52 #else
    53 # define RT_EF_SIZE_T   std::size_t
    54 #endif
    55 
    56 /** The hint that we're throwing std::bad_alloc is not apprecitated by MSC. */
     42void *RT_NEW_DELETE_CDECL operator new(RT_NEW_DELETE_SIZE_T cb) RT_NEW_DELETE_THROWS_BAD_ALLOC
     43{
     44    void *pv = RTMemAlloc(cb);
    5745#ifdef RT_EXCEPTIONS_ENABLED
    58 # ifdef _MSC_VER
    59 #  define RT_EF_THROWS_BAD_ALLOC
    60 #  define RT_EF_NOTHROW               RT_NO_THROW_DEF
    61 # else
    62 #  ifdef _GLIBCXX_THROW
    63 #   define RT_EF_THROWS_BAD_ALLOC     _GLIBCXX_THROW(std::bad_alloc)
    64 #  elif defined(__cplusplus) && (__cplusplus + 0) < 201700
    65 #   define RT_EF_THROWS_BAD_ALLOC     throw(std::bad_alloc)
    66 #  else
    67 #   define RT_EF_THROWS_BAD_ALLOC     noexcept(false)
    68 #  endif
    69 #  define RT_EF_NOTHROW               throw()
    70 # endif
    71 #else  /* !RT_EXCEPTIONS_ENABLED */
    72 # define RT_EF_THROWS_BAD_ALLOC
    73 # define RT_EF_NOTHROW
    74 #endif /* !RT_EXCEPTIONS_ENABLED */
    75 
    76 
    77 void *RT_EF_CDECL operator new(RT_EF_SIZE_T cb) RT_EF_THROWS_BAD_ALLOC
    78 {
    79     void *pv = rtR3MemAlloc("new", RTMEMTYPE_NEW, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
    8046    if (!pv)
    8147        throw std::bad_alloc();
     48#endif
    8249    return pv;
    8350}
    8451
    8552
    86 void *RT_EF_CDECL operator new(RT_EF_SIZE_T cb, const std::nothrow_t &) RT_EF_NOTHROW
     53void *RT_NEW_DELETE_CDECL operator new(RT_NEW_DELETE_SIZE_T cb, const std::nothrow_t &) RT_NEW_DELETE_NOTHROW
    8754{
    88     void *pv = rtR3MemAlloc("new nothrow", RTMEMTYPE_NEW, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
    89     return pv;
     55    return RTMemAlloc(cb);
    9056}
    9157
    9258
    93 void RT_EF_CDECL operator delete(void *pv) RT_EF_NOTHROW
     59void RT_NEW_DELETE_CDECL operator delete(void *pv) RT_NEW_DELETE_NOTHROW
    9460{
    95     rtR3MemFree("delete", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     61    RTMemFree(pv);
    9662}
    9763
    9864
    9965#ifdef __cpp_sized_deallocation
    100 void RT_EF_CDECL operator delete(void *pv, RT_EF_SIZE_T cb) RT_EF_NOTHROW
     66void RT_NEW_DELETE_CDECL operator delete(void *pv, RT_NEW_DELETE_SIZE_T cb) RT_NEW_DELETE_NOTHROW
    10167{
    10268    NOREF(cb);
    10369    AssertMsgFailed(("cb ignored!\n"));
    104     rtR3MemFree("delete", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     70    RTMemFree(pv);
    10571}
    10672#endif
    10773
    10874
    109 void RT_EF_CDECL operator delete(void * pv, const std::nothrow_t &) RT_EF_NOTHROW
     75void RT_NEW_DELETE_CDECL operator delete(void *pv, const std::nothrow_t &) RT_NEW_DELETE_NOTHROW
    11076{
    111     rtR3MemFree("delete nothrow", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     77    RTMemFree(pv);
    11278}
    11379
     
    12187 */
    12288
    123 void *RT_EF_CDECL operator new[](RT_EF_SIZE_T cb) RT_EF_THROWS_BAD_ALLOC
     89void *RT_NEW_DELETE_CDECL operator new[](RT_NEW_DELETE_SIZE_T cb) RT_NEW_DELETE_THROWS_BAD_ALLOC
    12490{
    125     void *pv = rtR3MemAlloc("new[]", RTMEMTYPE_NEW_ARRAY, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
     91    void *pv = RTMemAlloc(cb);
     92#ifdef RT_EXCEPTIONS_ENABLED
    12693    if (!pv)
    12794        throw std::bad_alloc();
     95#endif
    12896    return pv;
    12997}
    13098
    13199
    132 void * RT_EF_CDECL operator new[](RT_EF_SIZE_T cb, const std::nothrow_t &) RT_EF_NOTHROW
     100void *RT_NEW_DELETE_CDECL operator new[](RT_NEW_DELETE_SIZE_T cb, const std::nothrow_t &) RT_NEW_DELETE_NOTHROW
    133101{
    134     void *pv = rtR3MemAlloc("new[] nothrow", RTMEMTYPE_NEW_ARRAY, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
    135     return pv;
     102    return RTMemAlloc(cb);
    136103}
    137104
    138105
    139 void RT_EF_CDECL operator delete[](void * pv) RT_EF_NOTHROW
     106void RT_NEW_DELETE_CDECL operator delete[](void * pv) RT_NEW_DELETE_NOTHROW
    140107{
    141     rtR3MemFree("delete[]", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     108    RTMemFree(pv);
    142109}
    143110
    144111
    145112#ifdef __cpp_sized_deallocation
    146 void RT_EF_CDECL operator delete[](void * pv, RT_EF_SIZE_T cb) RT_EF_NOTHROW
     113void RT_NEW_DELETE_CDECL operator delete[](void * pv, RT_NEW_DELETE_SIZE_T cb) RT_NEW_DELETE_NOTHROW
    147114{
    148115    NOREF(cb);
    149116    AssertMsgFailed(("cb ignored!\n"));
    150     rtR3MemFree("delete[]", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     117    RTMemFree(pv);
    151118}
    152119#endif
    153120
    154121
    155 void RT_EF_CDECL operator delete[](void *pv, const std::nothrow_t &) RT_EF_NOTHROW
     122void RT_NEW_DELETE_CDECL operator delete[](void *pv, const std::nothrow_t &) RT_NEW_DELETE_NOTHROW
    156123{
    157     rtR3MemFree("delete[] nothrow", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
     124    RTMemFree(pv);
    158125}
    159126
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette