Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -253,11 +253,11 @@ 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_; - if ((src->flags & ~OF_BLOCK_HAS_COPY_DISPOSE) == 0) { + if ((src->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { if ((*dst = malloc(src->size)) == NULL) { alloc_failed_exception.isa = [OFAllocFailedException class]; @throw (OFAllocFailedException*) &alloc_failed_exception; @@ -265,10 +265,13 @@ if (src->forwarding == src) src->forwarding = *dst; memcpy(*dst, src, src->size); + + /* src->forwarding points to us -> that's a reference */ + (*dst)->flags++; if (src->size >= sizeof(of_block_byref_t)) src->byref_keep(*dst, src); } else *dst = src; @@ -298,11 +301,11 @@ [(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_HAS_COPY_DISPOSE) == 0) { + if ((--obj->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { if (obj->size >= sizeof(of_block_byref_t)) obj->byref_dispose(obj); free(obj); }