diff --git a/src/new.cpp b/src/new.cpp index 7e53230e..575bb096 100644 --- a/src/new.cpp +++ b/src/new.cpp @@ -23,107 +23,11 @@ _LIBCPP_END_NAMESPACE_STD #endif +#if 0 // Implement all new and delete operators as weak definitions // in this shared library, so that they can be overriden by programs // that define non-weak copies of the functions. - -__attribute__((__weak__, __visibility__("default"))) -void * -operator new(std::size_t size) throw (std::bad_alloc) -{ - if (size == 0) - size = 1; - void* p; - while ((p = ::malloc(size)) == 0) - { - // If malloc fails and there is a new_handler, - // call it to try free up memory. - std::new_handler nh = std::get_new_handler(); - if (nh) - nh(); - else -#ifndef _LIBCPP_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - break; #endif - } - return p; -} - -__attribute__((__weak__, __visibility__("default"))) -void* -operator new(size_t size, const std::nothrow_t&) throw() -{ - void* p = 0; -#ifndef _LIBCPP_NO_EXCEPTIONS - try - { -#endif // _LIBCPP_NO_EXCEPTIONS - p = ::operator new(size); -#ifndef _LIBCPP_NO_EXCEPTIONS - } - catch (...) - { - } -#endif // _LIBCPP_NO_EXCEPTIONS - return p; -} - -__attribute__((__weak__, __visibility__("default"))) -void* -operator new[](size_t size) throw (std::bad_alloc) -{ - return ::operator new(size); -} - -__attribute__((__weak__, __visibility__("default"))) -void* -operator new[](size_t size, const std::nothrow_t& nothrow) throw() -{ - void* p = 0; -#ifndef _LIBCPP_NO_EXCEPTIONS - try - { -#endif // _LIBCPP_NO_EXCEPTIONS - p = ::operator new[](size); -#ifndef _LIBCPP_NO_EXCEPTIONS - } - catch (...) - { - } -#endif // _LIBCPP_NO_EXCEPTIONS - return p; -} - -__attribute__((__weak__, __visibility__("default"))) -void -operator delete(void* ptr) throw () -{ - if (ptr) - ::free(ptr); -} - -__attribute__((__weak__, __visibility__("default"))) -void -operator delete(void* ptr, const std::nothrow_t&) throw () -{ - ::operator delete(ptr); -} - -__attribute__((__weak__, __visibility__("default"))) -void -operator delete[] (void* ptr) throw () -{ - ::operator delete (ptr); -} - -__attribute__((__weak__, __visibility__("default"))) -void -operator delete[] (void* ptr, const std::nothrow_t&) throw () -{ - ::operator delete[](ptr); -} namespace std { diff --git a/src/new_ZdaPv.cpp b/src/new_ZdaPv.cpp new file mode 100644 index 00000000..3dd52f43 --- /dev/null +++ b/src/new_ZdaPv.cpp @@ -0,0 +1,7 @@ +#include "new" + +void +operator delete[] (void* ptr) throw () +{ + ::operator delete (ptr); +} diff --git a/src/new_ZdaPvRKSt9nothrow_t.cpp b/src/new_ZdaPvRKSt9nothrow_t.cpp new file mode 100644 index 00000000..ee8be634 --- /dev/null +++ b/src/new_ZdaPvRKSt9nothrow_t.cpp @@ -0,0 +1,7 @@ +#include "new" + +void +operator delete[] (void* ptr, const std::nothrow_t&) throw () +{ + ::operator delete[](ptr); +} diff --git a/src/new_ZdlPv.cpp b/src/new_ZdlPv.cpp new file mode 100644 index 00000000..351ecbf9 --- /dev/null +++ b/src/new_ZdlPv.cpp @@ -0,0 +1,10 @@ +#include + +#include "new" + +void +operator delete(void* ptr) throw () +{ + if (ptr) + ::free(ptr); +} diff --git a/src/new_ZdlPvRKSt9nothrow_t.cpp b/src/new_ZdlPvRKSt9nothrow_t.cpp new file mode 100644 index 00000000..d309e3fb --- /dev/null +++ b/src/new_ZdlPvRKSt9nothrow_t.cpp @@ -0,0 +1,7 @@ +#include "new" + +void +operator delete(void* ptr, const std::nothrow_t&) throw () +{ + ::operator delete(ptr); +} diff --git a/src/new_Znay.cpp b/src/new_Znay.cpp new file mode 100644 index 00000000..2eb812de --- /dev/null +++ b/src/new_Znay.cpp @@ -0,0 +1,7 @@ +#include "new" + +void* +operator new[](size_t size) throw (std::bad_alloc) +{ + return ::operator new(size); +} diff --git a/src/new_ZnayRKSt9nothrow_t.cpp b/src/new_ZnayRKSt9nothrow_t.cpp new file mode 100644 index 00000000..bf9cd58b --- /dev/null +++ b/src/new_ZnayRKSt9nothrow_t.cpp @@ -0,0 +1,19 @@ +#include "new" + +void* +operator new[](size_t size, const std::nothrow_t& nothrow) throw() +{ + void* p = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + p = ::operator new[](size); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + return p; +} diff --git a/src/new_Znwy.cpp b/src/new_Znwy.cpp new file mode 100644 index 00000000..4b6825f4 --- /dev/null +++ b/src/new_Znwy.cpp @@ -0,0 +1,26 @@ +#include + +#include "new" + +void * +operator new(std::size_t size) throw (std::bad_alloc) +{ + if (size == 0) + size = 1; + void* p; + while ((p = ::malloc(size)) == 0) + { + // If malloc fails and there is a new_handler, + // call it to try free up memory. + std::new_handler nh = std::get_new_handler(); + if (nh) + nh(); + else +#ifndef _LIBCPP_NO_EXCEPTIONS + throw std::bad_alloc(); +#else + break; +#endif + } + return p; +} diff --git a/src/new_ZnwyRKSt9nothrow_t.cpp b/src/new_ZnwyRKSt9nothrow_t.cpp new file mode 100644 index 00000000..bec91658 --- /dev/null +++ b/src/new_ZnwyRKSt9nothrow_t.cpp @@ -0,0 +1,19 @@ +#include "new" + +void* +operator new(size_t size, const std::nothrow_t&) throw() +{ + void* p = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + p = ::operator new(size); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + return p; +}