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 *
operator new(std::size_t size)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*
operator new(size_t size,const std::nothrow_t &)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*
operator new[](size_t size)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*
operator new[](size_t size,const std::nothrow_t &)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
operator delete(void * ptr)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
operator delete(void * ptr,const std::nothrow_t &)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
operator delete[](void * ptr)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
operator delete[](void * ptr,const std::nothrow_t &)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
bad_alloc()203 bad_alloc::bad_alloc() _NOEXCEPT
204 {
205 }
206
~bad_alloc()207 bad_alloc::~bad_alloc() _NOEXCEPT
208 {
209 }
210
211 const char*
what() const212 bad_alloc::what() const _NOEXCEPT
213 {
214 return "std::bad_alloc";
215 }
216
217 // bad_array_new_length
218
bad_array_new_length()219 bad_array_new_length::bad_array_new_length() _NOEXCEPT
220 {
221 }
222
~bad_array_new_length()223 bad_array_new_length::~bad_array_new_length() _NOEXCEPT
224 {
225 }
226
227 const char*
what() const228 bad_array_new_length::what() const _NOEXCEPT
229 {
230 return "bad_array_new_length";
231 }
232
233 #if 0 // WE DONT WANT NO C++14 FIXME can remove this if 0 now?
234
235 // bad_array_length
236
237 #ifndef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
238
239 class _LIBCPP_EXCEPTION_ABI bad_array_length
240 : public bad_alloc
241 {
242 public:
243 bad_array_length() _NOEXCEPT;
244 virtual ~bad_array_length() _NOEXCEPT;
245 virtual const char* what() const _NOEXCEPT;
246 };
247
248 #endif // _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
249
250 bad_array_length::bad_array_length() _NOEXCEPT
251 {
252 }
253
254 bad_array_length::~bad_array_length() _NOEXCEPT
255 {
256 }
257
258 const char*
259 bad_array_length::what() const _NOEXCEPT
260 {
261 return "bad_array_length";
262 }
263
264 #endif // WE DONT WANT NO C++14
265
266 } // std
267