new.cpp revision 321222
1219820Sjeff//===--------------------------- new.cpp ----------------------------------===// 2219820Sjeff// 3219820Sjeff// The LLVM Compiler Infrastructure 4219820Sjeff// 5219820Sjeff// This file is dual licensed under the MIT and the University of Illinois Open 6219820Sjeff// Source Licenses. See LICENSE.TXT for details. 7219820Sjeff// 8219820Sjeff//===----------------------------------------------------------------------===// 9219820Sjeff 10219820Sjeff#define _LIBCPP_BUILDING_NEW 11219820Sjeff 12219820Sjeff#include <stdlib.h> 13219820Sjeff 14219820Sjeff#include "new" 15219820Sjeff 16219820Sjeff#ifndef __has_include 17219820Sjeff#define __has_include(inc) 0 18219820Sjeff#endif 19219820Sjeff 20219820Sjeff#if defined(__APPLE__) && !defined(LIBCXXRT) 21219820Sjeff #include <cxxabi.h> 22219820Sjeff 23219820Sjeff #ifndef _LIBCPPABI_VERSION 24219820Sjeff // On Darwin, there are two STL shared libraries and a lower level ABI 25219820Sjeff // shared library. The global holding the current new handler is 26219820Sjeff // in the ABI library and named __cxa_new_handler. 27219820Sjeff #define __new_handler __cxxabiapple::__cxa_new_handler 28219820Sjeff #endif 29219820Sjeff#else // __APPLE__ 30219820Sjeff #if defined(LIBCXXRT) || __has_include(<cxxabi.h>) 31219820Sjeff #include <cxxabi.h> 32219820Sjeff #endif // __has_include(<cxxabi.h>) 33219820Sjeff #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) 34219820Sjeff static std::new_handler __new_handler; 35219820Sjeff #endif // _LIBCPPABI_VERSION 36219820Sjeff#endif 37219820Sjeff 38219820Sjeff#ifndef __GLIBCXX__ 39219820Sjeff 40219820Sjeff// Implement all new and delete operators as weak definitions 41219820Sjeff// in this shared library, so that they can be overriden by programs 42219820Sjeff// that define non-weak copies of the functions. 43219820Sjeff 44219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 45219820Sjeffvoid * 46219820Sjeffoperator new(std::size_t size) 47219820Sjeff#if !__has_feature(cxx_noexcept) 48219820Sjeff throw(std::bad_alloc) 49219820Sjeff#endif 50219820Sjeff{ 51219820Sjeff if (size == 0) 52219820Sjeff size = 1; 53219820Sjeff void* p; 54219820Sjeff while ((p = ::malloc(size)) == 0) 55219820Sjeff { 56219820Sjeff // If malloc fails and there is a new_handler, 57219820Sjeff // call it to try free up memory. 58219820Sjeff std::new_handler nh = std::get_new_handler(); 59219820Sjeff if (nh) 60219820Sjeff nh(); 61219820Sjeff else 62219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 63219820Sjeff throw std::bad_alloc(); 64219820Sjeff#else 65219820Sjeff break; 66219820Sjeff#endif 67219820Sjeff } 68219820Sjeff return p; 69219820Sjeff} 70219820Sjeff 71219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 72219820Sjeffvoid* 73219820Sjeffoperator new(size_t size, const std::nothrow_t&) _NOEXCEPT 74219820Sjeff{ 75219820Sjeff void* p = 0; 76219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 77219820Sjeff try 78219820Sjeff { 79219820Sjeff#endif // _LIBCPP_NO_EXCEPTIONS 80219820Sjeff p = ::operator new(size); 81219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 82219820Sjeff } 83219820Sjeff catch (...) 84219820Sjeff { 85219820Sjeff } 86219820Sjeff#endif // _LIBCPP_NO_EXCEPTIONS 87219820Sjeff return p; 88219820Sjeff} 89219820Sjeff 90219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 91219820Sjeffvoid* 92219820Sjeffoperator new[](size_t size) 93219820Sjeff#if !__has_feature(cxx_noexcept) 94219820Sjeff throw(std::bad_alloc) 95219820Sjeff#endif 96219820Sjeff{ 97219820Sjeff return ::operator new(size); 98219820Sjeff} 99219820Sjeff 100219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 101219820Sjeffvoid* 102219820Sjeffoperator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 103219820Sjeff{ 104219820Sjeff void* p = 0; 105219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 106219820Sjeff try 107219820Sjeff { 108219820Sjeff#endif // _LIBCPP_NO_EXCEPTIONS 109219820Sjeff p = ::operator new[](size); 110219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 111219820Sjeff } 112219820Sjeff catch (...) 113219820Sjeff { 114219820Sjeff } 115219820Sjeff#endif // _LIBCPP_NO_EXCEPTIONS 116219820Sjeff return p; 117219820Sjeff} 118219820Sjeff 119219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 120219820Sjeffvoid 121219820Sjeffoperator delete(void* ptr) _NOEXCEPT 122219820Sjeff{ 123219820Sjeff if (ptr) 124219820Sjeff ::free(ptr); 125219820Sjeff} 126219820Sjeff 127219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 128219820Sjeffvoid 129219820Sjeffoperator delete(void* ptr, size_t) _NOEXCEPT 130219820Sjeff{ 131219820Sjeff ::operator delete(ptr); 132219820Sjeff} 133219820Sjeff 134219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 135219820Sjeffvoid 136219820Sjeffoperator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 137219820Sjeff{ 138219820Sjeff ::operator delete(ptr); 139219820Sjeff} 140219820Sjeff 141219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 142219820Sjeffvoid 143219820Sjeffoperator delete(void* ptr, size_t, const std::nothrow_t&) _NOEXCEPT 144219820Sjeff{ 145219820Sjeff ::operator delete(ptr); 146219820Sjeff} 147219820Sjeff 148219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 149219820Sjeffvoid 150219820Sjeffoperator delete[] (void* ptr) _NOEXCEPT 151219820Sjeff{ 152219820Sjeff ::operator delete(ptr); 153219820Sjeff} 154219820Sjeff 155219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 156219820Sjeffvoid 157219820Sjeffoperator delete[] (void* ptr, size_t) _NOEXCEPT 158219820Sjeff{ 159219820Sjeff ::operator delete[](ptr); 160219820Sjeff} 161219820Sjeff 162219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 163219820Sjeffvoid 164219820Sjeffoperator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 165219820Sjeff{ 166219820Sjeff ::operator delete[](ptr); 167219820Sjeff} 168219820Sjeff 169219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 170219820Sjeffvoid 171219820Sjeffoperator delete[] (void* ptr, size_t, const std::nothrow_t&) _NOEXCEPT 172219820Sjeff{ 173219820Sjeff ::operator delete[](ptr); 174219820Sjeff} 175219820Sjeff 176219820Sjeff#endif // !__GLIBCXX__ 177219820Sjeff 178219820Sjeffnamespace std 179219820Sjeff{ 180219820Sjeff 181219820Sjeff#ifndef __GLIBCXX__ 182219820Sjeffconst nothrow_t nothrow = {}; 183219820Sjeff#endif 184219820Sjeff 185219820Sjeff#ifndef _LIBCPPABI_VERSION 186219820Sjeff 187219820Sjeff#ifndef __GLIBCXX__ 188219820Sjeff 189219820Sjeffnew_handler 190219820Sjeffset_new_handler(new_handler handler) _NOEXCEPT 191219820Sjeff{ 192219820Sjeff return __sync_lock_test_and_set(&__new_handler, handler); 193219820Sjeff} 194219820Sjeff 195219820Sjeffnew_handler 196219820Sjeffget_new_handler() _NOEXCEPT 197219820Sjeff{ 198219820Sjeff return __sync_fetch_and_add(&__new_handler, nullptr); 199219820Sjeff} 200219820Sjeff 201219820Sjeff#endif // !__GLIBCXX__ 202219820Sjeff 203219820Sjeff#ifndef LIBCXXRT 204219820Sjeff 205219820Sjeffbad_alloc::bad_alloc() _NOEXCEPT 206219820Sjeff{ 207219820Sjeff} 208219820Sjeff 209219820Sjeff#ifndef __GLIBCXX__ 210219820Sjeff 211219820Sjeffbad_alloc::~bad_alloc() _NOEXCEPT 212219820Sjeff{ 213219820Sjeff} 214219820Sjeff 215219820Sjeffconst char* 216219820Sjeffbad_alloc::what() const _NOEXCEPT 217219820Sjeff{ 218219820Sjeff return "std::bad_alloc"; 219219820Sjeff} 220219820Sjeff 221219820Sjeff#endif // !__GLIBCXX__ 222219820Sjeff 223219820Sjeffbad_array_new_length::bad_array_new_length() _NOEXCEPT 224219820Sjeff{ 225219820Sjeff} 226219820Sjeff 227219820Sjeffbad_array_new_length::~bad_array_new_length() _NOEXCEPT 228219820Sjeff{ 229219820Sjeff} 230219820Sjeff 231219820Sjeffconst char* 232219820Sjeffbad_array_new_length::what() const _NOEXCEPT 233219820Sjeff{ 234219820Sjeff return "bad_array_new_length"; 235219820Sjeff} 236219820Sjeff 237219820Sjeff#endif //LIBCXXRT 238219820Sjeff 239219820Sjeffconst char* 240219820Sjeffbad_array_length::what() const _NOEXCEPT 241219820Sjeff{ 242219820Sjeff return "bad_array_length"; 243219820Sjeff} 244219820Sjeff 245219820Sjeffbad_array_length::bad_array_length() _NOEXCEPT 246219820Sjeff{ 247219820Sjeff} 248219820Sjeff 249219820Sjeffbad_array_length::~bad_array_length() _NOEXCEPT 250219820Sjeff{ 251219820Sjeff} 252219820Sjeff 253219820Sjeff#endif // _LIBCPPABI_VERSION 254219820Sjeff 255219820Sjeff#ifndef LIBSTDCXX 256219820Sjeff 257219820Sjeffvoid 258219820Sjeff__throw_bad_alloc() 259219820Sjeff{ 260219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS 261219820Sjeff throw bad_alloc(); 262219820Sjeff#endif 263219820Sjeff} 264219820Sjeff 265219820Sjeff#endif // !LIBSTDCXX 266219820Sjeff 267219820Sjeff} // std 268219820Sjeff