Add two Apple-compatible block introspection functions.

main
David Chisnall 7 years ago
parent e627c14b5f
commit da5e411d24

@ -39,12 +39,17 @@
static void *_HeapBlockByRef = (void*)1; static void *_HeapBlockByRef = (void*)1;
PUBLIC _Bool _Block_has_signature(id b)
{
const struct Block_layout *block = (struct Block_layout*)b;
return ((NULL != block) && (block->flags & BLOCK_HAS_SIGNATURE));
}
/** /**
* Returns the Objective-C type encoding for the block. * Returns the Objective-C type encoding for the block.
*/ */
PUBLIC const char *block_getType_np(const void *b) PUBLIC const char * _Block_signature(id b)
{ {
const struct Block_layout *block = b; const struct Block_layout *block = (struct Block_layout*)b;
if ((NULL == block) || !(block->flags & BLOCK_HAS_SIGNATURE)) if ((NULL == block) || !(block->flags & BLOCK_HAS_SIGNATURE))
{ {
return NULL; return NULL;
@ -55,6 +60,10 @@ PUBLIC const char *block_getType_np(const void *b)
} }
return block->descriptor->encoding; return block->descriptor->encoding;
} }
PUBLIC const char *block_getType_np(const void *b)
{
return _Block_signature(b);
}
static int increment24(int *ref) static int increment24(int *ref)
{ {

@ -16,6 +16,13 @@
PUBLIC BLOCKS_EXPORT void *_Block_copy(const void *); PUBLIC BLOCKS_EXPORT void *_Block_copy(const void *);
PUBLIC BLOCKS_EXPORT void _Block_release(const void *); PUBLIC BLOCKS_EXPORT void _Block_release(const void *);
PUBLIC BLOCKS_EXPORT const char *block_getType_np(const void *b) OBJC_NONPORTABLE; PUBLIC BLOCKS_EXPORT const char *block_getType_np(const void *b) OBJC_NONPORTABLE;
#ifdef __OBJC__
PUBLIC BLOCKS_EXPORT _Bool _Block_has_signature(id);
PUBLIC BLOCKS_EXPORT const char * _Block_signature(id);
#else
PUBLIC BLOCKS_EXPORT _Bool _Block_has_signature(void *);
PUBLIC BLOCKS_EXPORT const char * _Block_signature(void *);
#endif
#define Block_copy(x) ((__typeof(x))_Block_copy((const void *)(x))) #define Block_copy(x) ((__typeof(x))_Block_copy((const void *)(x)))
#define Block_release(x) _Block_release((const void *)(x)) #define Block_release(x) _Block_release((const void *)(x))

Loading…
Cancel
Save