Home | History | Annotate | Download | only in src
      1 //===------------------------ cxa_new_delete.cpp --------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //
      9 // This file implements the new and delete operators.
     10 //===----------------------------------------------------------------------===//
     11 
     12 #define _LIBCPP_BUILDING_NEW
     13 
     14 #include <new>
     15 #include <cstdlib>
     16 
     17 /*
     18 [new.delete.single]
     19 
     20 * Executes a loop: Within the loop, the function first attempts to allocate
     21   the requested storage. Whether the attempt involves a call to the Standard C
     22   library function malloc is unspecified.
     23 
     24 * Returns a pointer to the allocated storage if the attempt is successful.
     25   Otherwise, if the current new_handler (18.6.2.5) is a null pointer value,
     26   throws bad_alloc.
     27 
     28 * Otherwise, the function calls the current new_handler function (18.6.2.3).
     29   If the called function returns, the loop repeats.
     30 
     31 * The loop terminates when an attempt to allocate the requested storage is
     32   successful or when a called new_handler function does not return.
     33 */
     34 __attribute__((__weak__, __visibility__("default")))
     35 void *
     36 operator new(std::size_t size)
     37 #if !__has_feature(cxx_noexcept)
     38     throw(std::bad_alloc)
     39 #endif
     40 {
     41     if (size == 0)
     42         size = 1;
     43     void* p;
     44     while ((p = std::malloc(size)) == 0)
     45     {
     46         std::new_handler nh = std::get_new_handler();
     47         if (nh)
     48             nh();
     49         else
     50             throw std::bad_alloc();
     51     }
     52     return p;
     53 }
     54 
     55 /*
     56 Note:  The relationships among these operators is both carefully considered
     57 and standard in C++11.  Please do not change them without fully understanding
     58 the consequences of doing so.  Reference:
     59 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2158.html
     60 */
     61 /*
     62 [new.delete.single]
     63 
     64 Calls operator new(size). If the call returns normally, returns the result of
     65 that call. Otherwise, returns a null pointer.
     66 */
     67 __attribute__((__weak__, __visibility__("default")))
     68 void*
     69 operator new(size_t size, const std::nothrow_t&)
     70 #if __has_feature(cxx_noexcept)
     71     noexcept
     72 #else
     73     throw()
     74 #endif
     75 {
     76     void* p = 0;
     77     try
     78     {
     79         p = ::operator new(size);
     80     }
     81     catch (...)
     82     {
     83     }
     84     return p;
     85 }
     86 
     87 /*
     88 [new.delete.array]
     89 
     90 Returns operator new(size).
     91 */
     92 __attribute__((__weak__, __visibility__("default")))
     93 void*
     94 operator new[](size_t size)
     95 #if !__has_feature(cxx_noexcept)
     96     throw(std::bad_alloc)
     97 #endif
     98 {
     99     return ::operator new(size);
    100 }
    101 
    102 /*
    103 [new.delete.array]
    104 
    105 Calls operator new[](size). If the call returns normally, returns the result
    106 of that call. Otherwise, returns a null pointer.
    107 */
    108 __attribute__((__weak__, __visibility__("default")))
    109 void*
    110 operator new[](size_t size, const std::nothrow_t&)
    111 #if __has_feature(cxx_noexcept)
    112     noexcept
    113 #else
    114     throw()
    115 #endif
    116 {
    117     void* p = 0;
    118     try
    119     {
    120         p = ::operator new[](size);
    121     }
    122     catch (...)
    123     {
    124     }
    125     return p;
    126 }
    127 
    128 /*
    129 [new.delete.single]
    130 
    131 If ptr is null, does nothing. Otherwise, reclaims the storage allocated by the
    132 earlier call to operator new.
    133 */
    134 __attribute__((__weak__, __visibility__("default")))
    135 void
    136 operator delete(void* ptr)
    137 #if __has_feature(cxx_noexcept)
    138     noexcept
    139 #else
    140     throw()
    141 #endif
    142 {
    143     if (ptr)
    144         std::free(ptr);
    145 }
    146 
    147 /*
    148 [new.delete.single]
    149 
    150 calls operator delete(ptr)
    151 */
    152 __attribute__((__weak__, __visibility__("default")))
    153 void
    154 operator delete(void* ptr, const std::nothrow_t&)
    155 #if __has_feature(cxx_noexcept)
    156     noexcept
    157 #else
    158     throw()
    159 #endif
    160 {
    161     ::operator delete(ptr);
    162 }
    163 
    164 /*
    165 [new.delete.array]
    166 
    167 Calls operator delete(ptr)
    168 */
    169 __attribute__((__weak__, __visibility__("default")))
    170 void
    171 operator delete[] (void* ptr)
    172 #if __has_feature(cxx_noexcept)
    173     noexcept
    174 #else
    175     throw()
    176 #endif
    177 {
    178     ::operator delete(ptr);
    179 }
    180 
    181 /*
    182 [new.delete.array]
    183 
    184 calls operator delete[](ptr)
    185 */
    186 __attribute__((__weak__, __visibility__("default")))
    187 void
    188 operator delete[] (void* ptr, const std::nothrow_t&)
    189 #if __has_feature(cxx_noexcept)
    190     noexcept
    191 #else
    192     throw()
    193 #endif
    194 {
    195     ::operator delete[](ptr);
    196 }
    197 
    198 namespace std
    199 {
    200 
    201 //  bad_alloc
    202 
    203 bad_alloc::bad_alloc() _NOEXCEPT
    204 {
    205 }
    206 
    207 bad_alloc::~bad_alloc() _NOEXCEPT
    208 {
    209 }
    210 
    211 const char*
    212 bad_alloc::what() const _NOEXCEPT
    213 {
    214     return "std::bad_alloc";
    215 }
    216 
    217 // bad_array_new_length
    218 
    219 bad_array_new_length::bad_array_new_length() _NOEXCEPT
    220 {
    221 }
    222 
    223 bad_array_new_length::~bad_array_new_length() _NOEXCEPT
    224 {
    225 }
    226 
    227 const char*
    228 bad_array_new_length::what() const _NOEXCEPT
    229 {
    230     return "bad_array_new_length";
    231 }
    232 
    233 // bad_array_length
    234 
    235 #ifndef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
    236 
    237 class _LIBCPP_EXCEPTION_ABI bad_array_length
    238     : public bad_alloc
    239 {
    240 public:
    241     bad_array_length() _NOEXCEPT;
    242     virtual ~bad_array_length() _NOEXCEPT;
    243     virtual const char* what() const _NOEXCEPT;
    244 };
    245 
    246 #endif  // _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
    247 
    248 bad_array_length::bad_array_length() _NOEXCEPT
    249 {
    250 }
    251 
    252 bad_array_length::~bad_array_length() _NOEXCEPT
    253 {
    254 }
    255 
    256 const char*
    257 bad_array_length::what() const _NOEXCEPT
    258 {
    259     return "bad_array_length";
    260 }
    261 
    262 }  // std
    263