[cfe-commits] [libcxxabi] r149329 - in /libcxxabi/trunk/src: cxa_handlers.cpp cxa_personality.cpp

Howard Hinnant hhinnant at apple.com
Mon Jan 30 17:51:15 PST 2012


Author: hhinnant
Date: Mon Jan 30 19:51:15 2012
New Revision: 149329

URL: http://llvm.org/viewvc/llvm-project?rev=149329&view=rev
Log:
Minor bug fix in __cxa_call_unexpected.  Changed std::terminate to detect a caught-but-unhandled exception, and choose the handler out of that if found.

Modified:
    libcxxabi/trunk/src/cxa_handlers.cpp
    libcxxabi/trunk/src/cxa_personality.cpp

Modified: libcxxabi/trunk/src/cxa_handlers.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_handlers.cpp?rev=149329&r1=149328&r2=149329&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_handlers.cpp (original)
+++ libcxxabi/trunk/src/cxa_handlers.cpp Mon Jan 30 19:51:15 2012
@@ -150,6 +150,25 @@
 void
 terminate() _NOEXCEPT
 {
+    // If there might be an uncaught exception
+    using namespace __cxxabiv1;
+    __cxa_eh_globals* globals = __cxa_get_globals_fast();
+    if (globals)
+    {
+        __cxa_exception* exception_header = globals->caughtExceptions;
+        if (exception_header)
+        {
+            _Unwind_Exception* unwind_exception =
+                reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;
+            bool native_exception = (unwind_exception->exception_class & get_language) ==
+                                                   (kOurExceptionClass & get_language);
+            if (native_exception)
+            {
+                __cxa_exception* exception_header = (__cxa_exception*)(unwind_exception+1) - 1;
+                __terminate(exception_header->terminateHandler);
+            }
+        }
+    }
     __terminate(get_terminate());
 }
 

Modified: libcxxabi/trunk/src/cxa_personality.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_personality.cpp?rev=149329&r1=149328&r2=149329&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_personality.cpp (original)
+++ libcxxabi/trunk/src/cxa_personality.cpp Mon Jan 30 19:51:15 2012
@@ -840,7 +840,7 @@
 {
     _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(arg);
     if (unwind_exception == 0)
-        call_terminate(true, unwind_exception);
+        call_terminate(false, unwind_exception);
     __cxa_begin_catch(unwind_exception);
     bool native_old_exception = (unwind_exception->exception_class & get_language) ==
                                 (kOurExceptionClass                & get_language);





More information about the cfe-commits mailing list