[cfe-commits] [libcxx] r103795 - in /libcxx/trunk: include/new include/typeinfo src/exception.cpp src/new.cpp src/typeinfo.cpp
Nick Kledzik
kledzik at apple.com
Fri May 14 13:19:37 PDT 2010
Author: kledzik
Date: Fri May 14 15:19:37 2010
New Revision: 103795
URL: http://llvm.org/viewvc/llvm-project?rev=103795&view=rev
Log:
add headers and implementation for <new>, <exception>, and <typeinfo>
Added:
libcxx/trunk/src/exception.cpp
libcxx/trunk/src/typeinfo.cpp
Modified:
libcxx/trunk/include/new
libcxx/trunk/include/typeinfo
libcxx/trunk/src/new.cpp
Modified: libcxx/trunk/include/new
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/new?rev=103795&r1=103794&r2=103795&view=diff
==============================================================================
--- libcxx/trunk/include/new (original)
+++ libcxx/trunk/include/new Fri May 14 15:19:37 2010
@@ -65,7 +65,7 @@
: public exception
{
public:
- _LIBCPP_INLINE_VISIBILITY bad_alloc() throw() {}
+ bad_alloc() throw();
virtual ~bad_alloc() throw();
virtual const char* what() const throw();
};
@@ -74,12 +74,12 @@
: public bad_alloc
{
public:
- _LIBCPP_INLINE_VISIBILITY bad_array_new_length() throw() {}
+ bad_array_new_length() throw();
virtual ~bad_array_new_length() throw();
virtual const char* what() const throw();
};
-void __throw_bad_alloc();
+void __throw_bad_alloc(); // not in C++ spec
struct nothrow_t {};
extern _LIBCPP_VISIBLE const nothrow_t nothrow;
Modified: libcxx/trunk/include/typeinfo
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/typeinfo?rev=103795&r1=103794&r2=103795&view=diff
==============================================================================
--- libcxx/trunk/include/typeinfo (original)
+++ libcxx/trunk/include/typeinfo Fri May 14 15:19:37 2010
@@ -63,17 +63,11 @@
#pragma GCC system_header
-#pragma GCC visibility push(default)
-
-namespace __cxxabiv1
-{
- class __class_type_info;
-}
namespace std // purposefully not using versioning namespace
{
-class type_info
+class _LIBCPP_EXCEPTION_ABI type_info
{
type_info& operator=(const type_info&);
type_info(const type_info&);
@@ -98,32 +92,29 @@
bool operator!=(const type_info& __arg) const
{return !operator==(__arg);}
- virtual bool __is_pointer_p() const;
- virtual bool __is_function_p() const;
- virtual bool __do_catch(const type_info*, void**, unsigned) const;
- virtual bool __do_upcast(const __cxxabiv1::__class_type_info*, void**) const;
};
-class bad_cast
+class _LIBCPP_EXCEPTION_ABI bad_cast
: public exception
{
public:
- bad_cast() throw() {}
+ bad_cast() throw();
virtual ~bad_cast() throw();
virtual const char* what() const throw();
};
-class bad_typeid
+class _LIBCPP_EXCEPTION_ABI bad_typeid
: public exception
{
public:
- bad_typeid () throw() { }
+ bad_typeid() throw();
virtual ~bad_typeid() throw();
virtual const char* what() const throw();
};
+
} // std
-#pragma GCC visibility pop
+
#endif // __LIBCPP_TYPEINFO
Added: libcxx/trunk/src/exception.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/exception.cpp?rev=103795&view=auto
==============================================================================
--- libcxx/trunk/src/exception.cpp (added)
+++ libcxx/trunk/src/exception.cpp Fri May 14 15:19:37 2010
@@ -0,0 +1,171 @@
+//===------------------------ exception.cpp -------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdlib.h>
+
+#include "exception"
+
+#if __APPLE__
+ #include <cxxabi.h>
+ using namespace __cxxabiv1;
+ // On Darwin, there are two STL shared libraries and a lower level ABI
+ // shared libray. The globals holding the current terminate handler and
+ // current unexpected handler are in the ABI library.
+ #define __terminate_handler __cxxabiapple::__cxa_terminate_handler
+ #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
+#else
+ static std::terminate_handler __terminate_handler;
+ static std::unexpected_handler __unexpected_handler;
+#endif
+
+
+
+std::unexpected_handler
+std::set_unexpected(std::unexpected_handler func) throw()
+{
+ std::terminate_handler old = __unexpected_handler;
+ __unexpected_handler = func;
+ return old;
+}
+
+void
+std::unexpected()
+{
+ (*__unexpected_handler)();
+ // unexpected handler should not return
+ std::terminate();
+}
+
+
+std::terminate_handler
+std::set_terminate(std::terminate_handler func) throw()
+{
+ std::terminate_handler old = __terminate_handler;
+ __terminate_handler = func;
+ return old;
+}
+
+
+void
+std::terminate()
+{
+ try {
+ (*__terminate_handler)();
+ // handler should not return
+ ::abort ();
+ }
+ catch (...) {
+ // handler should not throw exception
+ ::abort ();
+ }
+}
+
+
+bool std::uncaught_exception() throw()
+{
+#if __APPLE__
+ // on Darwin, there is a helper function so __cxa_get_globals is private
+ return __cxxabiapple::__cxa_uncaught_exception();
+#else
+ __cxa_eh_globals * globals = __cxa_get_globals();
+ return (globals->uncaughtExceptions != 0);
+#endif
+}
+
+
+namespace std
+{
+
+
+exception::~exception() throw()
+{
+}
+
+bad_exception::~bad_exception() throw()
+{
+}
+
+const char* exception::what() const throw()
+{
+ return "std::exception";
+}
+
+const char* bad_exception::what() const throw()
+{
+ return "std::bad_exception";
+}
+
+
+
+exception_ptr::~exception_ptr()
+{
+#if __APPLE__
+ __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_);
+#else
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif
+}
+
+exception_ptr::exception_ptr(const exception_ptr& other)
+ : __ptr_(other.__ptr_)
+{
+#if __APPLE__
+ __cxxabiapple::__cxa_increment_exception_refcount(__ptr_);
+#else
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif
+}
+
+exception_ptr& exception_ptr::operator=(const exception_ptr& other)
+{
+#if __APPLE__
+ if (__ptr_ != other.__ptr_)
+ {
+ __cxxabiapple::__cxa_increment_exception_refcount(other.__ptr_);
+ __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_);
+ __ptr_ = other.__ptr_;
+ }
+ return *this;
+#else
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif
+}
+
+} // std
+
+
+std::exception_ptr std::current_exception()
+{
+#if __APPLE__
+ // be nicer if there was a constructor that took a ptr, then
+ // this whole function would be just:
+ // return exception_ptr(__cxa_current_primary_exception());
+ std::exception_ptr ptr;
+ ptr.__ptr_ = __cxxabiapple::__cxa_current_primary_exception();
+ return ptr;
+#else
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif
+}
+
+void std::rethrow_exception(exception_ptr p)
+{
+#if __APPLE__
+ __cxxabiapple::__cxa_rethrow_primary_exception(p.__ptr_);
+ // if p.__ptr_ is NULL, above returns so we terminate
+ terminate();
+#else
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif
+}
+
Modified: libcxx/trunk/src/new.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/new.cpp?rev=103795&r1=103794&r2=103795&view=diff
==============================================================================
--- libcxx/trunk/src/new.cpp (original)
+++ libcxx/trunk/src/new.cpp Fri May 14 15:19:37 2010
@@ -7,11 +7,136 @@
//
//===----------------------------------------------------------------------===//
+#include <stdlib.h>
+#include <cxxabi.h>
+
#include "new"
+
+#if __APPLE__
+ // On Darwin, there are two STL shared libraries and a lower level ABI
+ // shared libray. The global holding the current new handler is
+ // in the ABI library and named __cxa_new_handler.
+ #define __new_handler __cxxabiapple::__cxa_new_handler
+#else
+ static std::new_handler __new_handler;
+#endif
+
+
+// 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.
+ if (__new_handler)
+ __new_handler();
+ else
+ throw std::bad_alloc();
+ }
+ return p;
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void*
+operator new(size_t size, const std::nothrow_t&) throw()
+{
+ void* p = 0;
+ try
+ {
+ p = ::operator new(size);
+ }
+ catch (...)
+ {
+ }
+ 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;
+ try
+ {
+ p = ::operator new[](size);
+ }
+ catch (...)
+ {
+ }
+ 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
{
+bad_alloc::bad_alloc() throw()
+{
+}
+
+bad_alloc::~bad_alloc() throw()
+{
+}
+
+const char*
+bad_alloc::what() const throw()
+{
+ return "std::bad_alloc";
+}
+
+
+bad_array_new_length::bad_array_new_length() throw()
+{
+}
+
bad_array_new_length::~bad_array_new_length() throw()
{
}
@@ -22,6 +147,8 @@
return "bad_array_new_length";
}
+
+
void
__throw_bad_alloc()
{
Added: libcxx/trunk/src/typeinfo.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/typeinfo.cpp?rev=103795&view=auto
==============================================================================
--- libcxx/trunk/src/typeinfo.cpp (added)
+++ libcxx/trunk/src/typeinfo.cpp Fri May 14 15:19:37 2010
@@ -0,0 +1,41 @@
+//===------------------------- typeinfo.cpp -------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdlib.h>
+
+#include "typeinfo"
+
+std::bad_cast::bad_cast() throw()
+{
+}
+
+std::bad_cast::~bad_cast() throw()
+{
+}
+
+const char*
+std::bad_cast::what() const throw()
+{
+ return "std::bad_cast";
+}
+
+
+std::bad_typeid::bad_typeid() throw()
+{
+}
+
+std::bad_typeid::~bad_typeid() throw()
+{
+}
+
+const char*
+std::bad_typeid::what() const throw()
+{
+ return "std::bad_typeid";
+}
+
More information about the cfe-commits
mailing list