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