123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- #ifndef _BLOCK_PRIVATE_H_
- #define _BLOCK_PRIVATE_H_
- #include <Availability.h>
- #include <AvailabilityMacros.h>
- #include <TargetConditionals.h>
- #include <stdbool.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <Block.h>
- #if __has_include(<ptrauth.h>)
- #include <ptrauth.h>
- #endif
- #if __has_feature(ptrauth_calls) && __cplusplus < 201103L
- #define _Block_set_function_pointer(field, value) \
- ((value) \
- ? ((field) = \
- (__typeof__(field)) \
- ptrauth_auth_and_resign((void*)(value), \
- ptrauth_key_function_pointer, 0, \
- ptrauth_key_block_function, &(field))) \
- : ((field) = 0))
- #define _Block_get_function_pointer(field) \
- ((field) \
- ? (__typeof__(field)) \
- ptrauth_auth_function((void*)(field), \
- ptrauth_key_block_function, &(field)) \
- : (__typeof__(field))0)
- #else
- #define _Block_set_function_pointer(field, value) \
- (field) = (value)
- #define _Block_get_function_pointer(field) \
- (field)
- #endif
- #if __has_feature(ptrauth_calls) && __cplusplus >= 201103L
- template <typename Fn, ptrauth_key Key>
- class StorageSignedFunctionPointer {
- uintptr_t bits;
- public:
-
-
-
- uintptr_t prepareWrite(Fn fn) const
- {
- if (fn == nullptr) {
- return 0;
- } else {
- return (uintptr_t)
- ptrauth_auth_and_resign(fn, ptrauth_key_function_pointer, 0,
- Key, &bits);
- }
- }
-
-
-
- uintptr_t prepareWrite(const StorageSignedFunctionPointer& other) const
- {
- if (other.bits == 0) {
- return 0;
- } else {
- return (uintptr_t)
- ptrauth_auth_and_resign((void*)other.bits, Key, &other.bits,
- Key, &bits);
- }
- }
-
-
-
- Fn completeReadFn(uintptr_t ptr) const
- {
- if (ptr == 0) {
- return nullptr;
- } else {
- return ptrauth_auth_function((Fn)ptr, Key, &bits);
- }
- }
-
-
-
- void* completeReadRaw(uintptr_t ptr) const
- {
- if (ptr == 0) {
- return nullptr;
- } else {
- return ptrauth_auth_data((void*)ptr, Key, &bits);
- }
- }
- StorageSignedFunctionPointer() { }
- StorageSignedFunctionPointer(Fn value)
- : bits(prepareWrite(value)) { }
- StorageSignedFunctionPointer(const StorageSignedFunctionPointer& value)
- : bits(prepareWrite(value)) { }
- StorageSignedFunctionPointer&
- operator = (Fn rhs) {
- bits = prepareWrite(rhs);
- return *this;
- }
- StorageSignedFunctionPointer&
- operator = (const StorageSignedFunctionPointer& rhs) {
- bits = prepareWrite(rhs);
- return *this;
- }
- operator Fn () const {
- return completeReadFn(bits);
- }
- explicit operator void* () const {
- return completeReadRaw(bits);
- }
- explicit operator bool () const {
- return completeReadRaw(bits) != nullptr;
- }
- };
- using BlockCopyFunction = StorageSignedFunctionPointer
- <void(*)(void *, const void *),
- ptrauth_key_block_function>;
- using BlockDisposeFunction = StorageSignedFunctionPointer
- <void(*)(const void *),
- ptrauth_key_block_function>;
- using BlockInvokeFunction = StorageSignedFunctionPointer
- <void(*)(void *, ...),
- ptrauth_key_block_function>;
- using BlockByrefKeepFunction = StorageSignedFunctionPointer
- <void(*)(struct Block_byref *, struct Block_byref *),
- ptrauth_key_block_function>;
- using BlockByrefDestroyFunction = StorageSignedFunctionPointer
- <void(*)(struct Block_byref *),
- ptrauth_key_block_function>;
- #elif !__has_feature(ptrauth_calls)
- typedef void(*BlockCopyFunction)(void *, const void *);
- typedef void(*BlockDisposeFunction)(const void *);
- typedef void(*BlockInvokeFunction)(void *, ...);
- typedef void(*BlockByrefKeepFunction)(struct Block_byref*, struct Block_byref*);
- typedef void(*BlockByrefDestroyFunction)(struct Block_byref *);
- #else
- typedef uintptr_t BlockCopyFunction;
- typedef uintptr_t BlockDisposeFunction;
- typedef uintptr_t BlockInvokeFunction;
- typedef uintptr_t BlockByrefKeepFunction;
- typedef uintptr_t BlockByrefDestroyFunction;
- #endif
- enum {
- BLOCK_DEALLOCATING = (0x0001),
- BLOCK_REFCOUNT_MASK = (0xfffe),
- BLOCK_NEEDS_FREE = (1 << 24),
- BLOCK_HAS_COPY_DISPOSE = (1 << 25),
- BLOCK_HAS_CTOR = (1 << 26),
- BLOCK_IS_GC = (1 << 27),
- BLOCK_IS_GLOBAL = (1 << 28),
- BLOCK_USE_STRET = (1 << 29),
- BLOCK_HAS_SIGNATURE = (1 << 30),
- BLOCK_HAS_EXTENDED_LAYOUT=(1 << 31)
- };
- #define BLOCK_DESCRIPTOR_1 1
- struct Block_descriptor_1 {
- uintptr_t reserved;
- uintptr_t size;
- };
- #define BLOCK_DESCRIPTOR_2 1
- struct Block_descriptor_2 {
-
- BlockCopyFunction copy;
- BlockDisposeFunction dispose;
- };
- #define BLOCK_DESCRIPTOR_3 1
- struct Block_descriptor_3 {
-
- const char *signature;
- const char *layout;
- };
- struct Block_layout {
- void *isa;
- volatile int32_t flags;
- int32_t reserved;
- BlockInvokeFunction invoke;
- struct Block_descriptor_1 *descriptor;
-
- };
- enum {
-
-
-
- BLOCK_BYREF_LAYOUT_MASK = (0xf << 28),
- BLOCK_BYREF_LAYOUT_EXTENDED = ( 1 << 28),
- BLOCK_BYREF_LAYOUT_NON_OBJECT = ( 2 << 28),
- BLOCK_BYREF_LAYOUT_STRONG = ( 3 << 28),
- BLOCK_BYREF_LAYOUT_WEAK = ( 4 << 28),
- BLOCK_BYREF_LAYOUT_UNRETAINED = ( 5 << 28),
- BLOCK_BYREF_IS_GC = ( 1 << 27),
- BLOCK_BYREF_HAS_COPY_DISPOSE = ( 1 << 25),
- BLOCK_BYREF_NEEDS_FREE = ( 1 << 24),
- };
- struct Block_byref {
- void *isa;
- struct Block_byref *forwarding;
- volatile int32_t flags;
- uint32_t size;
- };
- struct Block_byref_2 {
-
- BlockByrefKeepFunction byref_keep;
- BlockByrefDestroyFunction byref_destroy;
- };
- struct Block_byref_3 {
-
- const char *layout;
- };
- enum {
- BLOCK_LAYOUT_ESCAPE = 0,
- BLOCK_LAYOUT_NON_OBJECT_BYTES = 1,
- BLOCK_LAYOUT_NON_OBJECT_WORDS = 2,
- BLOCK_LAYOUT_STRONG = 3,
- BLOCK_LAYOUT_BYREF = 4,
- BLOCK_LAYOUT_WEAK = 5,
- BLOCK_LAYOUT_UNRETAINED = 6,
- BLOCK_LAYOUT_UNKNOWN_WORDS_7 = 7,
- BLOCK_LAYOUT_UNKNOWN_WORDS_8 = 8,
- BLOCK_LAYOUT_UNKNOWN_WORDS_9 = 9,
- BLOCK_LAYOUT_UNKNOWN_WORDS_A = 0xA,
- BLOCK_LAYOUT_UNUSED_B = 0xB,
- BLOCK_LAYOUT_UNUSED_C = 0xC,
- BLOCK_LAYOUT_UNUSED_D = 0xD,
- BLOCK_LAYOUT_UNUSED_E = 0xE,
- BLOCK_LAYOUT_UNUSED_F = 0xF,
- };
- enum {
-
- BLOCK_FIELD_IS_OBJECT = 3,
- BLOCK_FIELD_IS_BLOCK = 7,
- BLOCK_FIELD_IS_BYREF = 8,
- BLOCK_FIELD_IS_WEAK = 16,
- BLOCK_BYREF_CALLER = 128,
- };
- enum {
- BLOCK_ALL_COPY_DISPOSE_FLAGS =
- BLOCK_FIELD_IS_OBJECT | BLOCK_FIELD_IS_BLOCK | BLOCK_FIELD_IS_BYREF |
- BLOCK_FIELD_IS_WEAK | BLOCK_BYREF_CALLER
- };
- static inline __typeof__(void (*)(void *, ...))
- _Block_get_invoke_fn(struct Block_layout *block)
- {
- return (void (*)(void *, ...))_Block_get_function_pointer(block->invoke);
- }
- static inline void
- _Block_set_invoke_fn(struct Block_layout *block, void (*fn)(void *, ...))
- {
- _Block_set_function_pointer(block->invoke, fn);
- }
- static inline __typeof__(void (*)(void *, const void *))
- _Block_get_copy_fn(struct Block_descriptor_2 *desc)
- {
- return (void (*)(void *, const void *))_Block_get_function_pointer(desc->copy);
- }
- static inline void
- _Block_set_copy_fn(struct Block_descriptor_2 *desc,
- void (*fn)(void *, const void *))
- {
- _Block_set_function_pointer(desc->copy, fn);
- }
- static inline __typeof__(void (*)(const void *))
- _Block_get_dispose_fn(struct Block_descriptor_2 *desc)
- {
- return (void (*)(const void *))_Block_get_function_pointer(desc->dispose);
- }
- static inline void
- _Block_set_dispose_fn(struct Block_descriptor_2 *desc,
- void (*fn)(const void *))
- {
- _Block_set_function_pointer(desc->dispose, fn);
- }
- BLOCK_EXPORT size_t Block_size(void *aBlock);
- BLOCK_EXPORT bool _Block_has_signature(void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT bool _Block_use_stret(void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT const char * _Block_signature(void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT const char * _Block_layout(void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT const char * _Block_extended_layout(void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_7_0);
- BLOCK_EXPORT bool _Block_tryRetain(const void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT bool _Block_isDeallocating(const void *aBlock)
- __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
- BLOCK_EXPORT void * _NSConcreteMallocBlock[32]
- __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
- BLOCK_EXPORT void * _NSConcreteAutoBlock[32]
- __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
- BLOCK_EXPORT void * _NSConcreteFinalizingBlock[32]
- __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
- BLOCK_EXPORT void * _NSConcreteWeakBlockVariable[32]
- __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
- struct Block_callbacks_RR {
- size_t size;
- void (*retain)(const void *);
- void (*release)(const void *);
- void (*destructInstance)(const void *);
- };
- typedef struct Block_callbacks_RR Block_callbacks_RR;
- BLOCK_EXPORT void _Block_use_RR2(const Block_callbacks_RR *callbacks);
- #endif
|