00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #import "OFObject.h"
00018
00019 typedef struct of_block_literal_t {
00020 Class isa;
00021 int flags;
00022 int reserved;
00023 void (*invoke)(void *, ...);
00024 struct of_block_descriptor_t {
00025 unsigned long reserved;
00026 unsigned long size;
00027 void (*copy_helper)(void *dest, void *src);
00028 void (*dispose_helper)(void *src);
00029 const char *signature;
00030 } *descriptor;
00031 } of_block_literal_t;
00032
00033 typedef struct of_block_byref_t of_block_byref_t;
00034 struct of_block_byref_t {
00035 Class isa;
00036 of_block_byref_t *forwarding;
00037 int flags;
00038 int size;
00039 void (*byref_keep)(void *dest, void *src);
00040 void (*byref_dispose)(void*);
00041 };
00042
00043 enum {
00044 OF_BLOCK_HAS_COPY_DISPOSE = (1 << 25),
00045 OF_BLOCK_HAS_CTOR = (1 << 26),
00046 OF_BLOCK_IS_GLOBAL = (1 << 28),
00047 OF_BLOCK_HAS_STRET = (1 << 29),
00048 OF_BLOCK_HAS_SIGNATURE = (1 << 30),
00049 };
00050 #define OF_BLOCK_REFCOUNT_MASK \
00051 ~(OF_BLOCK_HAS_COPY_DISPOSE | OF_BLOCK_HAS_CTOR | OF_BLOCK_IS_GLOBAL | \
00052 OF_BLOCK_HAS_STRET | OF_BLOCK_HAS_SIGNATURE)
00053
00054 enum {
00055 OF_BLOCK_FIELD_IS_OBJECT = 3,
00056 OF_BLOCK_FIELD_IS_BLOCK = 7,
00057 OF_BLOCK_FIELD_IS_BYREF = 8,
00058 OF_BLOCK_FIELD_IS_WEAK = 16,
00059 OF_BLOCK_BYREF_CALLER = 128,
00060 };
00061
00062 #ifdef __cplusplus
00063 extern "C" {
00064 #endif
00065 extern void* _Block_copy(const void*);
00066 extern void _Block_release(const void*);
00067 #ifdef __cplusplus
00068 }
00069 #endif
00070
00071 #ifndef Block_copy
00072 # define Block_copy(x) ((__typeof__(x))_Block_copy((const void*)(x)))
00073 #endif
00074 #ifndef Block_release
00075 # define Block_release(x) _Block_release((const void*)(x))
00076 #endif
00077
00078 @interface OFBlock: OFObject
00079 @end
00080
00081 @interface OFStackBlock: OFBlock
00082 @end
00083
00084 @interface OFGlobalBlock: OFBlock
00085 @end
00086
00087 @interface OFMallocBlock: OFBlock
00088 @end