You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.1 KiB
C

#ifndef __LIBOBJC_BLOCKS_PRIVATE_H_INCLUDED__
#define __LIBOBJC_BLOCKS_PRIVATE_H_INCLUDED__
#if defined(__clang__) && !defined(__OBJC_RUNTIME_INTERNAL__)
#pragma clang system_header
#endif
#ifdef __cplusplus
#define BLOCKS_EXPORT extern "C"
#else
#define BLOCKS_EXPORT extern
#endif
#include <stdbool.h>
#include "Availability.h"
/*
* This header file exposes some implementation details of the blocks runtime
* that are needed, e.g., by libdispatch.
*/
/**
* Block descriptor that contains copy and dispose operations.
*/
struct Block_descriptor
{
/**
* Reserved for future use. Currently always 0.
*/
unsigned long int reserved;
/** Size of the block. */
unsigned long int size;
/**
* Copy function, generated by the compiler to help copy the block if it
* contains nontrivial copy operations.
*/
void (*copy_helper)(void *dst, void *src);
/**
* Dispose function, generated by the compiler to help copy the block if it
* contains nontrivial destructors.
*/
void (*dispose_helper)(void *src);
/**
* Objective-C type encoding of the block.
*/
const char *encoding;
};
/**
* Checks whether the block is currently being deallocated.
*
* Used by ARC weak reference management. Only call this after the weak
* reference lock is acquired.
*/
OBJC_PUBLIC BLOCKS_EXPORT bool _Block_isDeallocating(const void *aBlock);
/**
* Atomically increments the reference count of the block.
* Returns true if the block was retained, and false if it is already
* being deallocated.
*
* Used by ARC weak reference management. Only call this after the weak
* reference lock is acquired.
*/
OBJC_PUBLIC BLOCKS_EXPORT bool _Block_tryRetain(const void *aBlock);
// Helper structure
struct Block_layout
{
/**
* Class pointer. Always initialised to &_NSConcreteStackBlock for blocks
* that are created on the stack or &_NSConcreteGlobalBlock for blocks that
* are created in global storage.
*/
void *isa;
/**
* Flags. See the block_flags enumerated type for possible values.
*/
int flags;
/**
* Reserved - always initialised to 0 by the compiler. Used for the
* reference count in this implementation.
*/
int reserved;
/**
* The function that implements the block. The first argument is this
* structure, the subsequent arguments are the block's explicit parameters.
* If the BLOCK_USE_SRET flag is set, there is an additional hidden
* argument, which is a pointer to the space on the stack allocated to hold
* the return value.
*/
void (*invoke)(void *, ...);
/**
* The block's descriptor. This is either Block_descriptor_basic or
* Block_descriptor, depending on whether the
* BLOCK_HAS_COPY_DISPOSE flag is set.
*/
struct Block_descriptor *descriptor;
/**
* Block variables are appended to this structure.
*/
};
#ifndef __OBJC_RUNTIME_INTERNAL__
/*
* Deprecated Block_basic datastructure needed by libdispatch
*/
struct Block_basic {
void *isa;
int Block_flags;
int Block_size;
void (*Block_invoke)(void *);
void (*Block_copy)(void *dst, void *src);
void (*Block_dispose)(void *);
};
#endif // __OBJC_RUNTIME_INTERNAL__
#endif //__LIBOBJC_BLOCKS_PRIVATE_H_INCLUDED__