cxa_new_delete.cpp revision 35b2c2af6b2720a3f624ad556b1a3c75394350d7
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#include <new>
13#include <cstdlib>
14
15/*
16[new.delete.single]
17
18* Executes a loop: Within the loop, the function first attempts to allocate
19  the requested storage. Whether the attempt involves a call to the Standard C
20  library function malloc is unspecified.
21
22* Returns a pointer to the allocated storage if the attempt is successful.
23  Otherwise, if the current new_handler (18.6.2.5) is a null pointer value,
24  throws bad_alloc.
25
26* Otherwise, the function calls the current new_handler function (18.6.2.3).
27  If the called function returns, the loop repeats.
28
29* The loop terminates when an attempt to allocate the requested storage is
30  successful or when a called new_handler function does not return.
31*/
32__attribute__((__weak__, __visibility__("default")))
33void *
34operator new(std::size_t size)
35#if !__has_feature(cxx_noexcept)
36    throw(std::bad_alloc)
37#endif
38{
39    if (size == 0)
40        size = 1;
41    void* p;
42    while ((p = std::malloc(size)) == 0)
43    {
44        std::new_handler nh = std::get_new_handler();
45        if (nh)
46            nh();
47        else
48            throw std::bad_alloc();
49    }
50    return p;
51}
52
53/*
54Note:  The relationships among these operators is both carefully considered
55and standard in C++11.  Please do not change them without fully understanding
56the consequences of doing so.  Reference:
57http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2158.html
58*/
59/*
60[new.delete.single]
61
62Calls operator new(size). If the call returns normally, returns the result of
63that call. Otherwise, returns a null pointer.
64*/
65__attribute__((__weak__, __visibility__("default")))
66void*
67operator new(size_t size, const std::nothrow_t&)
68#if __has_feature(cxx_noexcept)
69    noexcept
70#else
71    throw()
72#endif
73{
74    void* p = 0;
75    try
76    {
77        p = ::operator new(size);
78    }
79    catch (...)
80    {
81    }
82    return p;
83}
84
85/*
86[new.delete.array]
87
88Returns operator new(size).
89*/
90__attribute__((__weak__, __visibility__("default")))
91void*
92operator new[](size_t size)
93#if !__has_feature(cxx_noexcept)
94    throw(std::bad_alloc)
95#endif
96{
97    return ::operator new(size);
98}
99
100/*
101[new.delete.array]
102
103Calls operator new[](size). If the call returns normally, returns the result
104of that call. Otherwise, returns a null pointer.
105*/
106__attribute__((__weak__, __visibility__("default")))
107void*
108operator new[](size_t size, const std::nothrow_t&)
109#if __has_feature(cxx_noexcept)
110    noexcept
111#else
112    throw()
113#endif
114{
115    void* p = 0;
116    try
117    {
118        p = ::operator new[](size);
119    }
120    catch (...)
121    {
122    }
123    return p;
124}
125
126/*
127[new.delete.single]
128
129If ptr is null, does nothing. Otherwise, reclaims the storage allocated by the
130earlier call to operator new.
131*/
132__attribute__((__weak__, __visibility__("default")))
133void
134operator delete(void* ptr)
135#if __has_feature(cxx_noexcept)
136    noexcept
137#else
138    throw()
139#endif
140{
141    if (ptr)
142        std::free(ptr);
143}
144
145/*
146[new.delete.single]
147
148calls operator delete(ptr)
149*/
150__attribute__((__weak__, __visibility__("default")))
151void
152operator delete(void* ptr, const std::nothrow_t&)
153#if __has_feature(cxx_noexcept)
154    noexcept
155#else
156    throw()
157#endif
158{
159    ::operator delete(ptr);
160}
161
162/*
163[new.delete.array]
164
165Calls operator delete(ptr)
166*/
167__attribute__((__weak__, __visibility__("default")))
168void
169operator delete[] (void* ptr)
170#if __has_feature(cxx_noexcept)
171    noexcept
172#else
173    throw()
174#endif
175{
176    ::operator delete(ptr);
177}
178
179/*
180[new.delete.array]
181
182calls operator delete[](ptr)
183*/
184__attribute__((__weak__, __visibility__("default")))
185void
186operator delete[] (void* ptr, const std::nothrow_t&)
187#if __has_feature(cxx_noexcept)
188    noexcept
189#else
190    throw()
191#endif
192{
193    ::operator delete[](ptr);
194}
195
196namespace std
197{
198
199//  bad_alloc
200
201bad_alloc::bad_alloc() _NOEXCEPT
202{
203}
204
205bad_alloc::~bad_alloc() _NOEXCEPT
206{
207}
208
209const char*
210bad_alloc::what() const _NOEXCEPT
211{
212    return "std::bad_alloc";
213}
214
215// bad_array_new_length
216
217bad_array_new_length::bad_array_new_length() _NOEXCEPT
218{
219}
220
221bad_array_new_length::~bad_array_new_length() _NOEXCEPT
222{
223}
224
225const char*
226bad_array_new_length::what() const _NOEXCEPT
227{
228    return "bad_array_new_length";
229}
230
231}  // std
232