13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===// 23e519524SHoward Hinnant // 35b08a8a4SHoward Hinnant // The LLVM Compiler Infrastructure 43e519524SHoward Hinnant // 5*412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open 6*412dbebeSHoward Hinnant // Source Licenses. See LICENSE.TXT for details. 73e519524SHoward Hinnant // 83e519524SHoward Hinnant //===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 10111e0cbeSNick Kledzik #include <stdlib.h> 11111e0cbeSNick Kledzik 123e519524SHoward Hinnant #include "new" 133e519524SHoward Hinnant 14111e0cbeSNick Kledzik #if __APPLE__ 15128ba719SHoward Hinnant #include <cxxabi.h> 16111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 17111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 18111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 19111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 20940e211cSHoward Hinnant #else // __APPLE__ 21111e0cbeSNick Kledzik static std::new_handler __new_handler; 22111e0cbeSNick Kledzik #endif 23111e0cbeSNick Kledzik 24111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 25111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 26111e0cbeSNick Kledzik // that define non-weak copies of the functions. 27111e0cbeSNick Kledzik 28111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 29111e0cbeSNick Kledzik void * 30111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc) 31111e0cbeSNick Kledzik { 32111e0cbeSNick Kledzik if (size == 0) 33111e0cbeSNick Kledzik size = 1; 34111e0cbeSNick Kledzik void* p; 35111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 36111e0cbeSNick Kledzik { 37111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 38111e0cbeSNick Kledzik // call it to try free up memory. 39111e0cbeSNick Kledzik if (__new_handler) 40111e0cbeSNick Kledzik __new_handler(); 41111e0cbeSNick Kledzik else 4254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 43111e0cbeSNick Kledzik throw std::bad_alloc(); 4454b409fdSHoward Hinnant #else 4554b409fdSHoward Hinnant break; 4654b409fdSHoward Hinnant #endif 47111e0cbeSNick Kledzik } 48111e0cbeSNick Kledzik return p; 49111e0cbeSNick Kledzik } 50111e0cbeSNick Kledzik 51111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 52111e0cbeSNick Kledzik void* 53111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw() 54111e0cbeSNick Kledzik { 55111e0cbeSNick Kledzik void* p = 0; 5654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 57111e0cbeSNick Kledzik try 58111e0cbeSNick Kledzik { 59940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 60111e0cbeSNick Kledzik p = ::operator new(size); 6154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 62111e0cbeSNick Kledzik } 63111e0cbeSNick Kledzik catch (...) 64111e0cbeSNick Kledzik { 65111e0cbeSNick Kledzik } 66940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 67111e0cbeSNick Kledzik return p; 68111e0cbeSNick Kledzik } 69111e0cbeSNick Kledzik 70111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 71111e0cbeSNick Kledzik void* 72111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc) 73111e0cbeSNick Kledzik { 74111e0cbeSNick Kledzik return ::operator new(size); 75111e0cbeSNick Kledzik } 76111e0cbeSNick Kledzik 77111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 78111e0cbeSNick Kledzik void* 79111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw() 80111e0cbeSNick Kledzik { 81111e0cbeSNick Kledzik void* p = 0; 8254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 83111e0cbeSNick Kledzik try 84111e0cbeSNick Kledzik { 85940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 86111e0cbeSNick Kledzik p = ::operator new[](size); 8754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 88111e0cbeSNick Kledzik } 89111e0cbeSNick Kledzik catch (...) 90111e0cbeSNick Kledzik { 91111e0cbeSNick Kledzik } 92940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 93111e0cbeSNick Kledzik return p; 94111e0cbeSNick Kledzik } 95111e0cbeSNick Kledzik 96111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 97111e0cbeSNick Kledzik void 98111e0cbeSNick Kledzik operator delete(void* ptr) throw () 99111e0cbeSNick Kledzik { 100111e0cbeSNick Kledzik if (ptr) 101111e0cbeSNick Kledzik ::free(ptr); 102111e0cbeSNick Kledzik } 103111e0cbeSNick Kledzik 104111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 105111e0cbeSNick Kledzik void 106111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw () 107111e0cbeSNick Kledzik { 108111e0cbeSNick Kledzik ::operator delete(ptr); 109111e0cbeSNick Kledzik } 110111e0cbeSNick Kledzik 111111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 112111e0cbeSNick Kledzik void 113111e0cbeSNick Kledzik operator delete[] (void* ptr) throw () 114111e0cbeSNick Kledzik { 115111e0cbeSNick Kledzik ::operator delete (ptr); 116111e0cbeSNick Kledzik } 117111e0cbeSNick Kledzik 118111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 119111e0cbeSNick Kledzik void 120111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw () 121111e0cbeSNick Kledzik { 122111e0cbeSNick Kledzik ::operator delete[](ptr); 123111e0cbeSNick Kledzik } 124111e0cbeSNick Kledzik 1253e519524SHoward Hinnant namespace std 1263e519524SHoward Hinnant { 1273e519524SHoward Hinnant 12862713dacSNick Kledzik const nothrow_t nothrow = {}; 12962713dacSNick Kledzik 13062713dacSNick Kledzik new_handler 13162713dacSNick Kledzik set_new_handler(new_handler handler) throw() 13262713dacSNick Kledzik { 13362713dacSNick Kledzik new_handler r = __new_handler; 13462713dacSNick Kledzik __new_handler = handler; 13562713dacSNick Kledzik return r; 13662713dacSNick Kledzik } 13762713dacSNick Kledzik 138111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw() 139111e0cbeSNick Kledzik { 140111e0cbeSNick Kledzik } 141111e0cbeSNick Kledzik 142111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw() 143111e0cbeSNick Kledzik { 144111e0cbeSNick Kledzik } 145111e0cbeSNick Kledzik 146111e0cbeSNick Kledzik const char* 147111e0cbeSNick Kledzik bad_alloc::what() const throw() 148111e0cbeSNick Kledzik { 149111e0cbeSNick Kledzik return "std::bad_alloc"; 150111e0cbeSNick Kledzik } 151111e0cbeSNick Kledzik 152111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw() 153111e0cbeSNick Kledzik { 154111e0cbeSNick Kledzik } 155111e0cbeSNick Kledzik 1563e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw() 1573e519524SHoward Hinnant { 1583e519524SHoward Hinnant } 1593e519524SHoward Hinnant 1603e519524SHoward Hinnant const char* 1613e519524SHoward Hinnant bad_array_new_length::what() const throw() 1623e519524SHoward Hinnant { 1633e519524SHoward Hinnant return "bad_array_new_length"; 1643e519524SHoward Hinnant } 1653e519524SHoward Hinnant 1663e519524SHoward Hinnant void 1673e519524SHoward Hinnant __throw_bad_alloc() 1683e519524SHoward Hinnant { 16954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 1703e519524SHoward Hinnant throw bad_alloc(); 17154b409fdSHoward Hinnant #endif 1723e519524SHoward Hinnant } 1733e519524SHoward Hinnant 1743e519524SHoward Hinnant } // std 175