]> gcc.gnu.org Git - gcc.git/commitdiff
vec.cc (__cxa_vec_cleanup): New fn.
authorJason Merrill <jason@redhat.com>
Tue, 20 Mar 2001 16:59:44 +0000 (11:59 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 20 Mar 2001 16:59:44 +0000 (11:59 -0500)
        * libsupc++/vec.cc (__cxa_vec_cleanup): New fn.
        (__cxa_vec_ctor, __cxa_vec_cctor, __cxa_vec_dtor): Call it.
        * libsupc++/cxxabi.h: Declare it.

From-SVN: r40657

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/cxxabi.h
libstdc++-v3/libsupc++/vec.cc

index f6d3bc3bb38ddae2cb5addf69675a39a0e0e68e2..7ab9839fc8cff6f0cf036c04e1a656cdd0a9164f 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-20  Jason Merrill  <jason@redhat.com>
+
+       * libsupc++/vec.cc (__cxa_vec_cleanup): New fn.
+       (__cxa_vec_ctor, __cxa_vec_cctor, __cxa_vec_dtor): Call it.
+       * libsupc++/cxxabi.h: Declare it.
+
 2001-03-16  Alexandre Oliva  <aoliva@redhat.com>
 
        * src/gen-num-limits.cc (signal_adapter): Overloaded to match
index e533f4de7718199fd2db9491a0d5f7f791e25c1e..1d4464a274e95f174ae59487d7e49d6c270f6d6a 100644 (file)
@@ -473,6 +473,13 @@ void __cxa_vec_dtor (void *__array_address,
                      __SIZE_TYPE__ __element_size,
                      void (*__destructor) (void *));
 
+/* destruct array */
+extern "C"
+void __cxa_vec_cleanup (void *__array_address,
+                       __SIZE_TYPE__ __element_count,
+                       __SIZE_TYPE__ __element_size,
+                       void (*__destructor) (void *));
+
 /* destruct and release array */
 extern "C"
 void __cxa_vec_delete (void *__array_address,
index 8ee893bb5963162b652dad376127b86aa77b41ff..037d052bae6986786955bd35f87d4e75235490c6 100644 (file)
@@ -150,7 +150,7 @@ namespace __cxxabiv1
       {
        {
          uncatch_exception ue;
-         __cxa_vec_dtor(array_address, ix, element_size, destructor);
+         __cxa_vec_cleanup(array_address, ix, element_size, destructor);
        }
        __throw_exception_again;
       }
@@ -180,7 +180,7 @@ namespace __cxxabiv1
       {
        {
          uncatch_exception ue;
-         __cxa_vec_dtor (dest_array, ix, element_size, destructor);
+         __cxa_vec_cleanup(dest_array, ix, element_size, destructor);
        }
        __throw_exception_again;
       }
@@ -197,10 +197,9 @@ namespace __cxxabiv1
       {
        char *ptr = static_cast<char *>(array_address);
        std::size_t ix = element_count;
-       bool unwinding = std::uncaught_exception();
-      
+
        ptr += element_count * element_size;
-      
+
        try
          {
            while (ix--)
@@ -211,19 +210,46 @@ namespace __cxxabiv1
          }
        catch (...)
          {
-           if (unwinding)
-             // [except.ctor]/3 If a destructor called during stack unwinding
-             // exits with an exception, terminate is called.
-             std::terminate ();
            {
              uncatch_exception ue;
-             __cxa_vec_dtor(array_address, ix, element_size, destructor);
+             __cxa_vec_cleanup(array_address, ix, element_size, destructor);
            }
            __throw_exception_again;
          }
       }
   }
 
+  // Destruct array as a result of throwing an exception.
+  // [except.ctor]/3 If a destructor called during stack unwinding
+  // exits with an exception, terminate is called.
+  extern "C" void
+  __cxa_vec_cleanup(void *array_address,
+                   std::size_t element_count,
+                   std::size_t element_size,
+                   void (*destructor) (void *))
+  {
+    if (destructor)
+      {
+       char *ptr = static_cast <char *> (array_address);
+       std::size_t ix = element_count;
+
+       ptr += element_count * element_size;
+
+       try
+         {
+           while (ix--)
+             {
+               ptr -= element_size;
+               destructor(ptr);
+             }
+         }
+       catch (...)
+         {
+           std::terminate();
+         }
+      }
+  }
+
   // Destruct and release array.
   extern "C" void
   __cxa_vec_delete(void *array_address,
This page took 0.066731 seconds and 5 git commands to generate.