From 0f7cc4716ac79ac899e21b5dc6873e30519507b3 Mon Sep 17 00:00:00 2001 From: theraven Date: Thu, 1 Mar 2012 19:33:26 +0000 Subject: [PATCH] Fix a memory management issue with blocks. Patch by Jens Alfke! --- blocks_runtime.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blocks_runtime.m b/blocks_runtime.m index 45cd80b..dd1d66e 100644 --- a/blocks_runtime.m +++ b/blocks_runtime.m @@ -203,7 +203,7 @@ void _Block_object_dispose(const void *object, const int flags) int refcount = (src->flags & BLOCK_REFCOUNT_MASK) == 0 ? 0 : decrement24(&src->flags); if (refcount == 0) { - if (0 != src->byref_dispose) + if(IS_SET(src->flags, BLOCK_HAS_COPY_DISPOSE) && (0 != src->byref_dispose)) { src->byref_dispose(src); } @@ -212,8 +212,8 @@ void _Block_object_dispose(const void *object, const int flags) } else { - // Call nontrivial destructors, but don't - if (IS_SET(src->flags, BLOCK_HAS_COPY_DISPOSE)) + // 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); }