[cfe-commits] New files for libcxxabi

Howard Hinnant hhinnant at apple.com
Wed Jun 8 11:46:43 PDT 2011


On Jun 8, 2011, at 11:44 AM, Marshall Clow wrote:

> 
> On Jun 8, 2011, at 9:17 AM, Howard Hinnant wrote:
> 
>> On Jun 7, 2011, at 1:15 PM, Marshall Clow wrote:
>> 
>>> Implements the new [] and delete [] functionality.
>>> With tests.
>>> 
>>> Comments please.
>>> I'm not 100% sure that the exception handling is correct - so that's a good place to look ;-)
>> 
>> This is looking pretty good to me.  I have one trivial comment (1), and one non-trivial comment (2) that I'd like as many eyes as possible on.
>> 
>> Thanks Marshall!
>> 
>> 
>> 1.  test_vector.cpp needs a standard LLVM/banner header.
>> 
>> 2.  In the catch clause of __cxa_vec_dtor:
>> 
>>       catch(...) {
>>       //  if we've caught an exception while doing stack unwinding, then
>>       //  there's really nothing we can do.
>>           if ( std::uncaught_exception ())
>>               std::terminate ();
>>       //  otherwise, attempt to destruct the rest of the array and rethrow
>>           __cxa_vec_cleanup ( array_address, idx, element_size, destructor );
>>           throw ;         
>>       }
>> 
>> I'm thinking that even if we're in an unwind, we should still attempt __cxa_vec_cleanup:
>> 
>>       catch(...) {
>>       //  attempt to destruct the rest of the array and rethrow
>>           __cxa_vec_cleanup ( array_address, idx, element_size, destructor );
>>           throw ;         
>>       }
> 
> I think that this code is better - the call to uncaught_exception inside the catch block is wrong, I think.
> 
>>    if ( NULL != destructor ) {
>>        char *ptr = static_cast <char *> (array_address);
>>        size_t idx = element_count;
>>        const bool is_unwinding = std::uncaught_exception ();
>> 
>>        ptr +=  element_count * element_size;   // one past the last element
>>        try {
>>            while ( idx-- > 0 ) {
>>                ptr -= element_size;
>>                destructor ( ptr );
>>            }
>>        }
>> 
>>        catch(...) {
>>        //  [15.2.3] If a destructor called during stack unwinding exits with
>>        //  an exception, then std::terminate is called
>>            if ( is_unwinding )
>>                std::terminate ();
>>        //  otherwise, attempt to destruct the rest of the array and rethrow
>>            __cxa_vec_cleanup ( array_address, idx, element_size, destructor );
>>            throw ;         
>>        }
>>    }

We should come up with a test that detects this and thus demonstrates the need for it (or disproves the need for it).

Howard




More information about the cfe-commits mailing list