Fix double-free when making C++ objects __block

main
theraven 14 years ago
parent 26784adc0a
commit cec2be9431

@ -198,6 +198,7 @@ void _Block_object_dispose(const void *object, const int flags)
{
struct block_byref_obj *src =
(struct block_byref_obj*)object;
src = src->forwarding;
if (src->isa == _HeapBlockByRef)
{
int refcount = (src->flags & BLOCK_REFCOUNT_MASK) == 0 ? 0 : decrement24(&src->flags);
@ -210,21 +211,6 @@ void _Block_object_dispose(const void *object, const int flags)
gc->free(src);
}
}
else
{
// Call nontrivial destructors, but don't free the storage
if(IS_SET(src->flags, BLOCK_HAS_COPY_DISPOSE) && (0 != src->byref_dispose))
{
src->byref_dispose(src);
}
// If this block has been promoted to the heap, decrement its
// reference count / destroy it if the heap version is already
// dead.
if (src->forwarding != src)
{
_Block_object_dispose(src->forwarding, flags | BLOCK_BYREF_CALLER);
}
}
}
else if (IS_SET(flags, BLOCK_FIELD_IS_BLOCK))
{

Loading…
Cancel
Save