@@ -223,10 +223,12 @@ if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE) block->descriptor->dispose_helper(block); free(block); + + return; } assert(of_spinlock_unlock(&spinlocks[hash])); #endif } @@ -233,10 +235,16 @@ void _Block_object_assign(void *dst_, const void *src_, const int flags_) { int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK | 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; @@ -245,20 +253,20 @@ 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; } if (src->forwarding == src) - src->forwarding = *dst; + (*dst)->forwarding = *dst; memcpy(*dst, src, src->size); if (src->size >= sizeof(of_block_byref_t)) src->byref_keep(*dst, src); @@ -273,10 +281,16 @@ void _Block_object_dispose(const void *obj_, const int flags_) { const int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK | 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; @@ -284,11 +298,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); } @@ -422,11 +436,12 @@ return OF_RETAIN_COUNT_MAX; } - (void)release { - Block_release(self); + if (isa == (Class)&_NSConcreteMallocBlock) + Block_release(self); } - (void)dealloc { @throw [OFNotImplementedException newWithClass: isa