summaryrefslogtreecommitdiffstats
path: root/libcxx/src/exception.cpp
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2010-05-14 20:19:37 +0000
committerNick Kledzik <kledzik@apple.com>2010-05-14 20:19:37 +0000
commit111e0cbe5159e1bb23c3beb60e959b656b509eab (patch)
tree72ef6077b7ad5cecda870de1dd31dc8b527e6141 /libcxx/src/exception.cpp
parent749c758632520b4ca64133c70aa4b775310fe5e7 (diff)
downloadbcm5719-llvm-111e0cbe5159e1bb23c3beb60e959b656b509eab.tar.gz
bcm5719-llvm-111e0cbe5159e1bb23c3beb60e959b656b509eab.zip
add headers and implementation for <new>, <exception>, and <typeinfo>
llvm-svn: 103795
Diffstat (limited to 'libcxx/src/exception.cpp')
-rw-r--r--libcxx/src/exception.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp
new file mode 100644
index 00000000000..336527df275
--- /dev/null
+++ b/libcxx/src/exception.cpp
@@ -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
+}
+
OpenPOWER on IntegriCloud