Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -239,19 +239,17 @@ OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF); if (src_ == NULL) return; - if (flags_ & OF_BLOCK_BYREF_CALLER) - return; - switch (flags) { case OF_BLOCK_FIELD_IS_BLOCK: *(of_block_literal_t**)dst_ = _Block_copy(src_); break; case OF_BLOCK_FIELD_IS_OBJECT: - *(id*)dst_ = [(id)src_ retain]; + if (!(flags_ & OF_BLOCK_BYREF_CALLER)) + *(id*)dst_ = [(id)src_ retain]; break; case OF_BLOCK_FIELD_IS_BYREF:; of_block_byref_t *src = (of_block_byref_t*)src_; of_block_byref_t **dst = (of_block_byref_t**)dst_; @@ -266,11 +264,11 @@ if (src->forwarding == src) (*dst)->forwarding = *dst; memcpy(*dst, src, src->size); - if (src->size >= sizeof(of_block_byref_t)) + if (src->flags & OF_BLOCK_HAS_COPY_DISPOSE) src->byref_keep(*dst, src); } else *dst = src; (*dst)->flags++; @@ -285,25 +283,23 @@ OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF); if (obj_ == NULL) return; - if (flags_ & OF_BLOCK_BYREF_CALLER) - return; - switch (flags) { case OF_BLOCK_FIELD_IS_BLOCK: _Block_release(obj_); break; case OF_BLOCK_FIELD_IS_OBJECT: - [(id)obj_ release]; + if (!(flags_ & OF_BLOCK_BYREF_CALLER)) + [(id)obj_ release]; break; case OF_BLOCK_FIELD_IS_BYREF:; of_block_byref_t *obj = (of_block_byref_t*)obj_; if ((--obj->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { - if (obj->size >= sizeof(of_block_byref_t)) + if (obj->flags & OF_BLOCK_HAS_COPY_DISPOSE) obj->byref_dispose(obj); free(obj); } break;