new revision 321222
1// -*- C++ -*- 2//===----------------------------- new ------------------------------------===// 3// 4// The LLVM Compiler Infrastructure 5// 6// This file is dual licensed under the MIT and the University of Illinois Open 7// Source Licenses. See LICENSE.TXT for details. 8// 9//===----------------------------------------------------------------------===// 10 11#ifndef _LIBCPP_NEW 12#define _LIBCPP_NEW 13 14/* 15 new synopsis 16 17namespace std 18{ 19 20class bad_alloc 21 : public exception 22{ 23public: 24 bad_alloc() noexcept; 25 bad_alloc(const bad_alloc&) noexcept; 26 bad_alloc& operator=(const bad_alloc&) noexcept; 27 virtual const char* what() const noexcept; 28}; 29 30class bad_array_length : public bad_alloc // C++14 31{ 32public: 33 bad_array_length() noexcept; 34}; 35 36class bad_array_new_length : public bad_alloc 37{ 38public: 39 bad_array_new_length() noexcept; 40}; 41 42struct nothrow_t {}; 43extern const nothrow_t nothrow; 44typedef void (*new_handler)(); 45new_handler set_new_handler(new_handler new_p) noexcept; 46new_handler get_new_handler() noexcept; 47 48} // std 49 50void* operator new(std::size_t size); // replaceable 51void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable 52void operator delete(void* ptr) noexcept; // replaceable 53void operator delete(void* ptr, std::size_t size) noexcept; // replaceable, C++14 54void operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable 55void operator delete(void* ptr, std::size_t size, 56 const std::nothrow_t&) noexcept; // replaceable, C++14 57 58void* operator new[](std::size_t size); // replaceable 59void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable 60void operator delete[](void* ptr) noexcept; // replaceable 61void operator delete[](void* ptr, std::size_t size) noexcept; // replaceable, C++14 62void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable 63void operator delete[](void* ptr, std::size_t size, 64 const std::nothrow_t&) noexcept; // replaceable, C++14 65 66void* operator new (std::size_t size, void* ptr) noexcept; 67void* operator new[](std::size_t size, void* ptr) noexcept; 68void operator delete (void* ptr, void*) noexcept; 69void operator delete[](void* ptr, void*) noexcept; 70 71*/ 72 73#include <__config> 74#include <exception> 75#include <cstddef> 76 77#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 78#pragma GCC system_header 79#endif 80 81namespace std // purposefully not using versioning namespace 82{ 83 84class _LIBCPP_EXCEPTION_ABI bad_alloc 85 : public exception 86{ 87public: 88 bad_alloc() _NOEXCEPT; 89 virtual ~bad_alloc() _NOEXCEPT; 90 virtual const char* what() const _NOEXCEPT; 91}; 92 93class _LIBCPP_EXCEPTION_ABI bad_array_new_length 94 : public bad_alloc 95{ 96public: 97 bad_array_new_length() _NOEXCEPT; 98 virtual ~bad_array_new_length() _NOEXCEPT; 99 virtual const char* what() const _NOEXCEPT; 100}; 101 102#if defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11) 103 104class _LIBCPP_EXCEPTION_ABI bad_array_length 105 : public bad_alloc 106{ 107public: 108 bad_array_length() _NOEXCEPT; 109 virtual ~bad_array_length() _NOEXCEPT; 110 virtual const char* what() const _NOEXCEPT; 111}; 112 113#define _LIBCPP_BAD_ARRAY_LENGTH_DEFINED 114 115#endif // defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11) 116 117_LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec 118 119struct _LIBCPP_TYPE_VIS nothrow_t {}; 120extern _LIBCPP_FUNC_VIS const nothrow_t nothrow; 121typedef void (*new_handler)(); 122_LIBCPP_FUNC_VIS new_handler set_new_handler(new_handler) _NOEXCEPT; 123_LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT; 124 125} // std 126 127#if defined(_WIN32) && !defined(cxx_EXPORTS) 128# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS_ONLY 129#else 130# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS 131#endif 132 133_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz) 134#if !__has_feature(cxx_noexcept) 135 throw(std::bad_alloc) 136#endif 137; 138_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS; 139_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p) _NOEXCEPT; 140_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, std::size_t __sz) _NOEXCEPT; 141_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT; 142_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; 143 144_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz) 145#if !__has_feature(cxx_noexcept) 146 throw(std::bad_alloc) 147#endif 148; 149_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS; 150_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p) _NOEXCEPT; 151_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT; 152_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT; 153_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; 154 155inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;} 156inline _LIBCPP_INLINE_VISIBILITY void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;} 157inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {} 158inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {} 159 160_LIBCPP_BEGIN_NAMESPACE_STD 161 162inline _LIBCPP_INLINE_VISIBILITY void *__allocate(size_t __size) { 163#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE 164 return ::operator new(__size); 165#else 166 return __builtin_operator_new(__size); 167#endif 168} 169 170inline _LIBCPP_INLINE_VISIBILITY void __deallocate(void *__ptr) { 171#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE 172 ::operator delete(__ptr); 173#else 174 __builtin_operator_delete(__ptr); 175#endif 176} 177 178_LIBCPP_END_NAMESPACE_STD 179 180#endif // _LIBCPP_NEW 181