aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2001-03-20 11:59:44 -0500
committerJason Merrill <jason@gcc.gnu.org>2001-03-20 11:59:44 -0500
commitf8c02bc55a20d70e5edc71b42129909324eb5c8e (patch)
tree9d4ac3acff9751a13c92bb20b21eb226a39dc231 /libstdc++-v3
parente03a61f143b31bd50419ce19ee181064b90a532c (diff)
downloadgcc-f8c02bc55a20d70e5edc71b42129909324eb5c8e.zip
gcc-f8c02bc55a20d70e5edc71b42129909324eb5c8e.tar.gz
gcc-f8c02bc55a20d70e5edc71b42129909324eb5c8e.tar.bz2
vec.cc (__cxa_vec_cleanup): New fn.
* 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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/libsupc++/cxxabi.h7
-rw-r--r--libstdc++-v3/libsupc++/vec.cc46
3 files changed, 49 insertions, 10 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f6d3bc3..7ab9839 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/libsupc++/cxxabi.h b/libstdc++-v3/libsupc++/cxxabi.h
index e533f4d..1d4464a 100644
--- a/libstdc++-v3/libsupc++/cxxabi.h
+++ b/libstdc++-v3/libsupc++/cxxabi.h
@@ -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,
diff --git a/libstdc++-v3/libsupc++/vec.cc b/libstdc++-v3/libsupc++/vec.cc
index 8ee893b..037d052 100644
--- a/libstdc++-v3/libsupc++/vec.cc
+++ b/libstdc++-v3/libsupc++/vec.cc
@@ -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,