vec.cc: Include <new> and <exception>.
* vec.cc: Include <new> and <exception>. (__cxa_vec_ctor): Use __cxa_vec_dtor for cleanup. (__cxa_vec_dtor): Catch dtor exceptions, and rethrow or terminate. (__cxa_vec_delete): Catch dtor exceptions. From-SVN: r33042
This commit is contained in:
parent
7e2d247261
commit
b8c1233b5e
@ -1,3 +1,11 @@
|
|||||||
|
2000-04-09 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
* vec.cc: Include <new> and <exception>.
|
||||||
|
(__cxa_vec_ctor): Use __cxa_vec_dtor for cleanup.
|
||||||
|
(__cxa_vec_dtor): Catch dtor exceptions, and rethrow or
|
||||||
|
terminate.
|
||||||
|
(__cxa_vec_delete): Catch dtor exceptions.
|
||||||
|
|
||||||
2000-04-09 Nathan Sidwell <nathan@codesourcery.com>
|
2000-04-09 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
Prepend __ to implementation defined names.
|
Prepend __ to implementation defined names.
|
||||||
|
@ -27,6 +27,12 @@
|
|||||||
|
|
||||||
#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
|
#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
|
#include <new>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
// Exception handling hook, to mark current exception as not caught --
|
||||||
|
// generally because we're about to rethrow it after some cleanup.
|
||||||
|
extern "C" void __uncatch_exception (void);
|
||||||
|
|
||||||
namespace __cxxabiv1
|
namespace __cxxabiv1
|
||||||
{
|
{
|
||||||
@ -54,6 +60,7 @@ __cxa_vec_new (size_t element_count,
|
|||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
// operator delete [] cannot throw, so no need to protect it
|
||||||
operator delete[] (base - padding_size);
|
operator delete[] (base - padding_size);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@ -79,18 +86,8 @@ __cxa_vec_ctor (void *array_address,
|
|||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
try
|
__uncatch_exception ();
|
||||||
{
|
__cxa_vec_dtor (array_address, ix, element_size, destructor);
|
||||||
if (destructor)
|
|
||||||
for (; ix--; ptr -= element_size)
|
|
||||||
destructor (ptr);
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
// [except.ctor]/3 If a destructor called during stack unwinding
|
|
||||||
// exists with an exception, terminate is called.
|
|
||||||
std::terminate ();
|
|
||||||
}
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,13 +102,28 @@ __cxa_vec_dtor (void *array_address,
|
|||||||
if (destructor)
|
if (destructor)
|
||||||
{
|
{
|
||||||
char *ptr = static_cast <char *> (array_address);
|
char *ptr = static_cast <char *> (array_address);
|
||||||
|
size_t ix = element_count;
|
||||||
|
bool unwinding = std::uncaught_exception ();
|
||||||
|
|
||||||
ptr += element_count * element_size;
|
ptr += element_count * element_size;
|
||||||
|
|
||||||
for (size_t ix = element_count; ix--;)
|
try
|
||||||
{
|
{
|
||||||
ptr -= element_size;
|
while (ix--)
|
||||||
destructor (ptr);
|
{
|
||||||
|
ptr -= element_size;
|
||||||
|
destructor (ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
if (unwinding)
|
||||||
|
// [except.ctor]/3 If a destructor called during stack unwinding
|
||||||
|
// exists with an exception, terminate is called.
|
||||||
|
std::terminate ();
|
||||||
|
__uncatch_exception ();
|
||||||
|
__cxa_vec_dtor (array_address, ix, element_size, destructor);
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,9 +140,18 @@ __cxa_vec_delete (void *array_address,
|
|||||||
if (padding_size)
|
if (padding_size)
|
||||||
{
|
{
|
||||||
size_t element_count = reinterpret_cast <size_t *> (base)[-1];
|
size_t element_count = reinterpret_cast <size_t *> (base)[-1];
|
||||||
|
|
||||||
__cxa_vec_dtor (base, element_count, element_size, destructor);
|
|
||||||
base -= padding_size;
|
base -= padding_size;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
__cxa_vec_dtor (array_address, element_count, element_size,
|
||||||
|
destructor);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
// operator delete [] cannot throw, so no need to protect it
|
||||||
|
operator delete[] (base);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
operator delete[] (base);
|
operator delete[] (base);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user