| Index: third_party/libc++abi/src/cxa_new_delete.cpp
|
| ===================================================================
|
| --- third_party/libc++abi/src/cxa_new_delete.cpp (revision 0)
|
| +++ third_party/libc++abi/src/cxa_new_delete.cpp (revision 0)
|
| @@ -0,0 +1,262 @@
|
| +//===------------------------ cxa_new_delete.cpp --------------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is dual licensed under the MIT and the University of Illinois Open
|
| +// Source Licenses. See LICENSE.TXT for details.
|
| +//
|
| +//
|
| +// This file implements the new and delete operators.
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +#define _LIBCPP_BUILDING_NEW
|
| +
|
| +#include <new>
|
| +#include <cstdlib>
|
| +
|
| +/*
|
| +[new.delete.single]
|
| +
|
| +* Executes a loop: Within the loop, the function first attempts to allocate
|
| + the requested storage. Whether the attempt involves a call to the Standard C
|
| + library function malloc is unspecified.
|
| +
|
| +* Returns a pointer to the allocated storage if the attempt is successful.
|
| + Otherwise, if the current new_handler (18.6.2.5) is a null pointer value,
|
| + throws bad_alloc.
|
| +
|
| +* Otherwise, the function calls the current new_handler function (18.6.2.3).
|
| + If the called function returns, the loop repeats.
|
| +
|
| +* The loop terminates when an attempt to allocate the requested storage is
|
| + successful or when a called new_handler function does not return.
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void *
|
| +operator new(std::size_t size)
|
| +#if !__has_feature(cxx_noexcept)
|
| + throw(std::bad_alloc)
|
| +#endif
|
| +{
|
| + if (size == 0)
|
| + size = 1;
|
| + void* p;
|
| + while ((p = std::malloc(size)) == 0)
|
| + {
|
| + std::new_handler nh = std::get_new_handler();
|
| + if (nh)
|
| + nh();
|
| + else
|
| + throw std::bad_alloc();
|
| + }
|
| + return p;
|
| +}
|
| +
|
| +/*
|
| +Note: The relationships among these operators is both carefully considered
|
| +and standard in C++11. Please do not change them without fully understanding
|
| +the consequences of doing so. Reference:
|
| +http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2158.html
|
| +*/
|
| +/*
|
| +[new.delete.single]
|
| +
|
| +Calls operator new(size). If the call returns normally, returns the result of
|
| +that call. Otherwise, returns a null pointer.
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void*
|
| +operator new(size_t size, const std::nothrow_t&)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + void* p = 0;
|
| + try
|
| + {
|
| + p = ::operator new(size);
|
| + }
|
| + catch (...)
|
| + {
|
| + }
|
| + return p;
|
| +}
|
| +
|
| +/*
|
| +[new.delete.array]
|
| +
|
| +Returns operator new(size).
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void*
|
| +operator new[](size_t size)
|
| +#if !__has_feature(cxx_noexcept)
|
| + throw(std::bad_alloc)
|
| +#endif
|
| +{
|
| + return ::operator new(size);
|
| +}
|
| +
|
| +/*
|
| +[new.delete.array]
|
| +
|
| +Calls operator new[](size). If the call returns normally, returns the result
|
| +of that call. Otherwise, returns a null pointer.
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void*
|
| +operator new[](size_t size, const std::nothrow_t&)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + void* p = 0;
|
| + try
|
| + {
|
| + p = ::operator new[](size);
|
| + }
|
| + catch (...)
|
| + {
|
| + }
|
| + return p;
|
| +}
|
| +
|
| +/*
|
| +[new.delete.single]
|
| +
|
| +If ptr is null, does nothing. Otherwise, reclaims the storage allocated by the
|
| +earlier call to operator new.
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void
|
| +operator delete(void* ptr)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + if (ptr)
|
| + std::free(ptr);
|
| +}
|
| +
|
| +/*
|
| +[new.delete.single]
|
| +
|
| +calls operator delete(ptr)
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void
|
| +operator delete(void* ptr, const std::nothrow_t&)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + ::operator delete(ptr);
|
| +}
|
| +
|
| +/*
|
| +[new.delete.array]
|
| +
|
| +Calls operator delete(ptr)
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void
|
| +operator delete[] (void* ptr)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + ::operator delete(ptr);
|
| +}
|
| +
|
| +/*
|
| +[new.delete.array]
|
| +
|
| +calls operator delete[](ptr)
|
| +*/
|
| +__attribute__((__weak__, __visibility__("default")))
|
| +void
|
| +operator delete[] (void* ptr, const std::nothrow_t&)
|
| +#if __has_feature(cxx_noexcept)
|
| + noexcept
|
| +#else
|
| + throw()
|
| +#endif
|
| +{
|
| + ::operator delete[](ptr);
|
| +}
|
| +
|
| +namespace std
|
| +{
|
| +
|
| +// bad_alloc
|
| +
|
| +bad_alloc::bad_alloc() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +bad_alloc::~bad_alloc() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +const char*
|
| +bad_alloc::what() const _NOEXCEPT
|
| +{
|
| + return "std::bad_alloc";
|
| +}
|
| +
|
| +// bad_array_new_length
|
| +
|
| +bad_array_new_length::bad_array_new_length() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +bad_array_new_length::~bad_array_new_length() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +const char*
|
| +bad_array_new_length::what() const _NOEXCEPT
|
| +{
|
| + return "bad_array_new_length";
|
| +}
|
| +
|
| +// bad_array_length
|
| +
|
| +#ifndef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
|
| +
|
| +class _LIBCPP_EXCEPTION_ABI bad_array_length
|
| + : public bad_alloc
|
| +{
|
| +public:
|
| + bad_array_length() _NOEXCEPT;
|
| + virtual ~bad_array_length() _NOEXCEPT;
|
| + virtual const char* what() const _NOEXCEPT;
|
| +};
|
| +
|
| +#endif // _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
|
| +
|
| +bad_array_length::bad_array_length() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +bad_array_length::~bad_array_length() _NOEXCEPT
|
| +{
|
| +}
|
| +
|
| +const char*
|
| +bad_array_length::what() const _NOEXCEPT
|
| +{
|
| + return "bad_array_length";
|
| +}
|
| +
|
| +} // std
|
|
|
| Property changes on: third_party/libc++abi/src/cxa_new_delete.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|