@@ -33,14 +33,27 @@ #endif #ifdef OF_HAVE_THREADS # import "mutex.h" #endif -typedef struct of_block_byref_t of_block_byref_t; -struct of_block_byref_t { +struct block { + Class isa; + int flags; + int reserved; + void (*invoke)(void *block, ...); + struct { + unsigned long reserved; + unsigned long size; + void (*_Nullable copy_helper)(void *dest, void *src); + void (*_Nullable dispose_helper)(void *src); + const char *signature; + } *descriptor; +}; + +struct byref { Class isa; - of_block_byref_t *forwarding; + struct byref *forwarding; int flags; int size; void (*byref_keep)(void *dest, void *src); void (*byref_dispose)(void *); }; @@ -74,11 +87,11 @@ sizeof(_NSConcreteStackBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteStackBlock = { &_NSConcreteStackBlock_metaclass, (Class)(void *)"OFBlock", - "OFStackBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFStackBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct block), NULL, NULL }; static struct objc_class _NSConcreteGlobalBlock_metaclass = { Nil, Nil, "OFGlobalBlock", 8, OBJC_CLASS_INFO_METACLASS, @@ -85,11 +98,11 @@ sizeof(_NSConcreteGlobalBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteGlobalBlock = { &_NSConcreteGlobalBlock_metaclass, (Class)(void *)"OFBlock", - "OFGlobalBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFGlobalBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct block), NULL, NULL }; static struct objc_class _NSConcreteMallocBlock_metaclass = { Nil, Nil, "OFMallocBlock", 8, OBJC_CLASS_INFO_METACLASS, @@ -96,11 +109,11 @@ sizeof(_NSConcreteMallocBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteMallocBlock = { &_NSConcreteMallocBlock_metaclass, (Class)(void *)"OFBlock", - "OFMallocBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFMallocBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct block), NULL, NULL }; static struct { unsigned long unknown; @@ -161,14 +174,14 @@ #endif void * _Block_copy(const void *block_) { - of_block_literal_t *block = (of_block_literal_t *)block_; + struct block *block = (struct block *)block_; if ([(id)block isMemberOfClass: (Class)&_NSConcreteStackBlock]) { - of_block_literal_t *copy; + struct block *copy; if ((copy = malloc(block->descriptor->size)) == NULL) { alloc_failed_exception.isa = [OFAllocFailedException class]; @throw (OFAllocFailedException *) @@ -201,11 +214,11 @@ } void _Block_release(const void *block_) { - of_block_literal_t *block = (of_block_literal_t *)block_; + struct block *block = (struct block *)block_; if (object_getClass((id)block) != (Class)&_NSConcreteMallocBlock) return; #ifdef OF_HAVE_ATOMIC_OPS @@ -242,19 +255,19 @@ if (src_ == NULL) return; switch (flags) { case OF_BLOCK_FIELD_IS_BLOCK: - *(of_block_literal_t **)dst_ = _Block_copy(src_); + *(struct block **)dst_ = _Block_copy(src_); break; case OF_BLOCK_FIELD_IS_OBJECT: 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_; + struct byref *src = (struct byref *)src_; + struct byref **dst = (struct byref **)dst_; src = src->forwarding; if ((src->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { if ((*dst = malloc(src->size)) == NULL) { @@ -327,11 +340,11 @@ case OF_BLOCK_FIELD_IS_OBJECT: if (!(flags_ & OF_BLOCK_BYREF_CALLER)) [(id)object_ release]; break; case OF_BLOCK_FIELD_IS_BYREF:; - of_block_byref_t *object = (of_block_byref_t *)object_; + struct byref *object = (struct byref *)object_; object = object->forwarding; #ifdef OF_HAVE_ATOMIC_OPS if ((of_atomic_int_dec(&object->flags) & @@ -461,11 +474,11 @@ } - (unsigned int)retainCount { if ([self isMemberOfClass: (Class)&_NSConcreteMallocBlock]) - return ((of_block_literal_t *)self)->flags & + return ((struct block *)self)->flags & OF_BLOCK_REFCOUNT_MASK; return OF_RETAIN_COUNT_MAX; }