Home | History | Annotate | Download | only in BlocksRuntime
      1 /*
      2  * Block_private.h
      3  *
      4  * Copyright 2008-2009 Apple, Inc. Permission is hereby granted, free of charge,
      5  * to any person obtaining a copy of this software and associated documentation
      6  * files (the "Software"), to deal in the Software without restriction,
      7  * including without limitation the rights to use, copy, modify, merge, publish,
      8  * distribute, sublicense, and/or sell copies of the Software, and to permit
      9  * persons to whom the Software is furnished to do so, subject to the following
     10  * conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included in
     13  * all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     21  * SOFTWARE.
     22  *
     23  */
     24 
     25 #ifndef _BLOCK_PRIVATE_H_
     26 #define _BLOCK_PRIVATE_H_
     27 
     28 #if !defined(BLOCK_EXPORT)
     29 #   if defined(__cplusplus)
     30 #       define BLOCK_EXPORT extern "C"
     31 #   else
     32 #       define BLOCK_EXPORT extern
     33 #   endif
     34 #endif
     35 
     36 #include <stdbool.h>
     37 
     38 #if defined(__cplusplus)
     39 extern "C" {
     40 #endif
     41 
     42 
     43 enum {
     44     BLOCK_REFCOUNT_MASK =     (0xffff),
     45     BLOCK_NEEDS_FREE =        (1 << 24),
     46     BLOCK_HAS_COPY_DISPOSE =  (1 << 25),
     47     BLOCK_HAS_CTOR =          (1 << 26), /* Helpers have C++ code. */
     48     BLOCK_IS_GC =             (1 << 27),
     49     BLOCK_IS_GLOBAL =         (1 << 28),
     50     BLOCK_HAS_DESCRIPTOR =    (1 << 29)
     51 };
     52 
     53 
     54 /* Revised new layout. */
     55 struct Block_descriptor {
     56     unsigned long int reserved;
     57     unsigned long int size;
     58     void (*copy)(void *dst, void *src);
     59     void (*dispose)(void *);
     60 };
     61 
     62 
     63 struct Block_layout {
     64     void *isa;
     65     int flags;
     66     int reserved;
     67     void (*invoke)(void *, ...);
     68     struct Block_descriptor *descriptor;
     69     /* Imported variables. */
     70 };
     71 
     72 
     73 struct Block_byref {
     74     void *isa;
     75     struct Block_byref *forwarding;
     76     int flags; /* refcount; */
     77     int size;
     78     void (*byref_keep)(struct Block_byref *dst, struct Block_byref *src);
     79     void (*byref_destroy)(struct Block_byref *);
     80     /* long shared[0]; */
     81 };
     82 
     83 
     84 struct Block_byref_header {
     85     void *isa;
     86     struct Block_byref *forwarding;
     87     int flags;
     88     int size;
     89 };
     90 
     91 
     92 /* Runtime support functions used by compiler when generating copy/dispose helpers. */
     93 
     94 enum {
     95     /* See function implementation for a more complete description of these fields and combinations */
     96     BLOCK_FIELD_IS_OBJECT   =  3,  /* id, NSObject, __attribute__((NSObject)), block, ... */
     97     BLOCK_FIELD_IS_BLOCK    =  7,  /* a block variable */
     98     BLOCK_FIELD_IS_BYREF    =  8,  /* the on stack structure holding the __block variable */
     99     BLOCK_FIELD_IS_WEAK     = 16,  /* declared __weak, only used in byref copy helpers */
    100     BLOCK_BYREF_CALLER      = 128  /* called from __block (byref) copy/dispose support routines. */
    101 };
    102 
    103 /* Runtime entry point called by compiler when assigning objects inside copy helper routines */
    104 BLOCK_EXPORT void _Block_object_assign(void *destAddr, const void *object, const int flags);
    105     /* BLOCK_FIELD_IS_BYREF is only used from within block copy helpers */
    106 
    107 
    108 /* runtime entry point called by the compiler when disposing of objects inside dispose helper routine */
    109 BLOCK_EXPORT void _Block_object_dispose(const void *object, const int flags);
    110 
    111 
    112 
    113 /* Other support functions */
    114 
    115 /* Runtime entry to get total size of a closure */
    116 BLOCK_EXPORT unsigned long int Block_size(void *block_basic);
    117 
    118 
    119 
    120 /* the raw data space for runtime classes for blocks */
    121 /* class+meta used for stack, malloc, and collectable based blocks */
    122 BLOCK_EXPORT void * _NSConcreteStackBlock[32];
    123 BLOCK_EXPORT void * _NSConcreteMallocBlock[32];
    124 BLOCK_EXPORT void * _NSConcreteAutoBlock[32];
    125 BLOCK_EXPORT void * _NSConcreteFinalizingBlock[32];
    126 BLOCK_EXPORT void * _NSConcreteGlobalBlock[32];
    127 BLOCK_EXPORT void * _NSConcreteWeakBlockVariable[32];
    128 
    129 
    130 /* the intercept routines that must be used under GC */
    131 BLOCK_EXPORT void _Block_use_GC( void *(*alloc)(const unsigned long, const bool isOne, const bool isObject),
    132                                   void (*setHasRefcount)(const void *, const bool),
    133                                   void (*gc_assign_strong)(void *, void **),
    134                                   void (*gc_assign_weak)(const void *, void *),
    135                                   void (*gc_memmove)(void *, void *, unsigned long));
    136 
    137 /* earlier version, now simply transitional */
    138 BLOCK_EXPORT void _Block_use_GC5( void *(*alloc)(const unsigned long, const bool isOne, const bool isObject),
    139                                   void (*setHasRefcount)(const void *, const bool),
    140                                   void (*gc_assign_strong)(void *, void **),
    141                                   void (*gc_assign_weak)(const void *, void *));
    142 
    143 BLOCK_EXPORT void _Block_use_RR( void (*retain)(const void *),
    144                                  void (*release)(const void *));
    145 
    146 /* make a collectable GC heap based Block.  Not useful under non-GC. */
    147 BLOCK_EXPORT void *_Block_copy_collectable(const void *aBlock);
    148 
    149 /* thread-unsafe diagnostic */
    150 BLOCK_EXPORT const char *_Block_dump(const void *block);
    151 
    152 
    153 /* Obsolete */
    154 
    155 /* first layout */
    156 struct Block_basic {
    157     void *isa;
    158     int Block_flags;  /* int32_t */
    159     int Block_size;  /* XXX should be packed into Block_flags */
    160     void (*Block_invoke)(void *);
    161     void (*Block_copy)(void *dst, void *src);  /* iff BLOCK_HAS_COPY_DISPOSE */
    162     void (*Block_dispose)(void *);             /* iff BLOCK_HAS_COPY_DISPOSE */
    163     /* long params[0];  // where const imports, __block storage references, etc. get laid down */
    164 };
    165 
    166 
    167 #if defined(__cplusplus)
    168 }
    169 #endif
    170 
    171 
    172 #endif /* _BLOCK_PRIVATE_H_ */
    173