Home | History | Annotate | Download | only in docs
      1 ==================================
      2 Block Implementation Specification
      3 ==================================
      4 
      5 .. contents::
      6    :local:
      7 
      8 History
      9 =======
     10 
     11 * 2008/7/14 - created.
     12 * 2008/8/21 - revised, C++.
     13 * 2008/9/24 - add ``NULL`` ``isa`` field to ``__block`` storage.
     14 * 2008/10/1 - revise block layout to use a ``static`` descriptor structure.
     15 * 2008/10/6 - revise block layout to use an unsigned long int flags.
     16 * 2008/10/28 - specify use of ``_Block_object_assign`` and
     17   ``_Block_object_dispose`` for all "Object" types in helper functions.
     18 * 2008/10/30 - revise new layout to have invoke function in same place.
     19 * 2008/10/30 - add ``__weak`` support.
     20 * 2010/3/16 - rev for stret return, signature field.
     21 * 2010/4/6 - improved wording.
     22 * 2013/1/6 - improved wording and converted to rst.
     23 
     24 This document describes the Apple ABI implementation specification of Blocks.
     25 
     26 The first shipping version of this ABI is found in Mac OS X 10.6, and shall be
     27 referred to as 10.6.ABI. As of 2010/3/16, the following describes the ABI
     28 contract with the runtime and the compiler, and, as necessary, will be referred
     29 to as ABI.2010.3.16.
     30 
     31 Since the Apple ABI references symbols from other elements of the system, any
     32 attempt to use this ABI on systems prior to SnowLeopard is undefined.
     33 
     34 High Level
     35 ==========
     36 
     37 The ABI of ``Blocks`` consist of their layout and the runtime functions required
     38 by the compiler.  A ``Block`` consists of a structure of the following form:
     39 
     40 .. code-block:: c
     41 
     42     struct Block_literal_1 {
     43         void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock
     44         int flags;
     45         int reserved; 
     46         void (*invoke)(void *, ...);
     47         struct Block_descriptor_1 {
     48         unsigned long int reserved;         // NULL
     49             unsigned long int size;         // sizeof(struct Block_literal_1)
     50             // optional helper functions
     51             void (*copy_helper)(void *dst, void *src);     // IFF (1<<25)
     52             void (*dispose_helper)(void *src);             // IFF (1<<25)
     53             // required ABI.2010.3.16
     54             const char *signature;                         // IFF (1<<30)
     55         } *descriptor;
     56         // imported variables
     57     };
     58 
     59 The following flags bits are in use thusly for a possible ABI.2010.3.16:
     60 
     61 .. code-block:: c
     62 
     63     enum {
     64         BLOCK_HAS_COPY_DISPOSE =  (1 << 25),
     65         BLOCK_HAS_CTOR =          (1 << 26), // helpers have C++ code
     66         BLOCK_IS_GLOBAL =         (1 << 28),
     67         BLOCK_HAS_STRET =         (1 << 29), // IFF BLOCK_HAS_SIGNATURE
     68         BLOCK_HAS_SIGNATURE =     (1 << 30), 
     69     };
     70 
     71 In 10.6.ABI the (1<<29) was usually set and was always ignored by the runtime -
     72 it had been a transitional marker that did not get deleted after the
     73 transition. This bit is now paired with (1<<30), and represented as the pair
     74 (3<<30), for the following combinations of valid bit settings, and their
     75 meanings:
     76 
     77 .. code-block:: c
     78 
     79     switch (flags & (3<<29)) {
     80       case (0<<29):      10.6.ABI, no signature field available
     81       case (1<<29):      10.6.ABI, no signature field available
     82       case (2<<29): ABI.2010.3.16, regular calling convention, presence of signature field
     83       case (3<<29): ABI.2010.3.16, stret calling convention, presence of signature field,
     84     }
     85 
     86 The signature field is not always populated.
     87 
     88 The following discussions are presented as 10.6.ABI otherwise.
     89 
     90 ``Block`` literals may occur within functions where the structure is created in
     91 stack local memory.  They may also appear as initialization expressions for
     92 ``Block`` variables of global or ``static`` local variables.
     93 
     94 When a ``Block`` literal expression is evaluated the stack based structure is
     95 initialized as follows:
     96 
     97 1. A ``static`` descriptor structure is declared and initialized as follows:
     98   
     99   a. The ``invoke`` function pointer is set to a function that takes the
    100   ``Block`` structure as its first argument and the rest of the arguments (if
    101   any) to the ``Block`` and executes the ``Block`` compound statement.
    102   
    103   b. The ``size`` field is set to the size of the following ``Block`` literal
    104   structure.
    105   
    106   c. The ``copy_helper`` and ``dispose_helper`` function pointers are set to
    107   respective helper functions if they are required by the ``Block`` literal.
    108 
    109 2. A stack (or global) ``Block`` literal data structure is created and
    110    initialized as follows:
    111    
    112    a. The ``isa`` field is set to the address of the external
    113    ``_NSConcreteStackBlock``, which is a block of uninitialized memory supplied
    114    in ``libSystem``, or ``_NSConcreteGlobalBlock`` if this is a static or file
    115    level ``Block`` literal.
    116    
    117    b. The ``flags`` field is set to zero unless there are variables imported
    118    into the ``Block`` that need helper functions for program level
    119    ``Block_copy()`` and ``Block_release()`` operations, in which case the
    120    (1<<25) flags bit is set.
    121 
    122 As an example, the ``Block`` literal expression:
    123 
    124 .. code-block:: c
    125 
    126     ^ { printf("hello world\n"); }
    127 
    128 would cause the following to be created on a 32-bit system:
    129 
    130 .. code-block:: c
    131 
    132     struct __block_literal_1 {
    133         void *isa;
    134         int flags;
    135         int reserved; 
    136         void (*invoke)(struct __block_literal_1 *);
    137         struct __block_descriptor_1 *descriptor;
    138     };
    139     
    140     void __block_invoke_1(struct __block_literal_1 *_block) {
    141         printf("hello world\n");
    142     }
    143     
    144     static struct __block_descriptor_1 {
    145         unsigned long int reserved;
    146         unsigned long int Block_size;
    147     } __block_descriptor_1 = { 0, sizeof(struct __block_literal_1), __block_invoke_1 };
    148 
    149 and where the ``Block`` literal itself appears:
    150 
    151 .. code-block:: c
    152 
    153     struct __block_literal_1 _block_literal = {
    154          &_NSConcreteStackBlock,
    155          (1<<29), <uninitialized>,
    156          __block_invoke_1,
    157          &__block_descriptor_1
    158     };
    159 
    160 A ``Block`` imports other ``Block`` references, ``const`` copies of other
    161 variables, and variables marked ``__block``.  In Objective-C, variables may
    162 additionally be objects.
    163 
    164 When a ``Block`` literal expression is used as the initial value of a global
    165 or ``static`` local variable, it is initialized as follows:
    166 
    167 .. code-block:: c
    168 
    169     struct __block_literal_1 __block_literal_1 = {
    170           &_NSConcreteGlobalBlock,
    171           (1<<28)|(1<<29), <uninitialized>,
    172           __block_invoke_1,
    173           &__block_descriptor_1
    174     };
    175 
    176 that is, a different address is provided as the first value and a particular
    177 (1<<28) bit is set in the ``flags`` field, and otherwise it is the same as for
    178 stack based ``Block`` literals.  This is an optimization that can be used for
    179 any ``Block`` literal that imports no ``const`` or ``__block`` storage
    180 variables.
    181 
    182 Imported Variables
    183 ==================
    184 
    185 Variables of ``auto`` storage class are imported as ``const`` copies.  Variables
    186 of ``__block`` storage class are imported as a pointer to an enclosing data
    187 structure.  Global variables are simply referenced and not considered as
    188 imported.
    189 
    190 Imported ``const`` copy variables
    191 ---------------------------------
    192 
    193 Automatic storage variables not marked with ``__block`` are imported as
    194 ``const`` copies.
    195 
    196 The simplest example is that of importing a variable of type ``int``:
    197 
    198 .. code-block:: c
    199 
    200     int x = 10;
    201     void (^vv)(void) = ^{ printf("x is %d\n", x); }
    202     x = 11;
    203     vv();
    204 
    205 which would be compiled to:
    206 
    207 .. code-block:: c
    208     
    209     struct __block_literal_2 {
    210         void *isa;
    211         int flags;
    212         int reserved; 
    213         void (*invoke)(struct __block_literal_2 *);
    214         struct __block_descriptor_2 *descriptor;
    215         const int x;
    216     };
    217     
    218     void __block_invoke_2(struct __block_literal_2 *_block) {
    219         printf("x is %d\n", _block->x);
    220     }
    221     
    222     static struct __block_descriptor_2 {
    223         unsigned long int reserved;
    224         unsigned long int Block_size;
    225     } __block_descriptor_2 = { 0, sizeof(struct __block_literal_2) };
    226 
    227 and:
    228 
    229 .. code-block:: c
    230 
    231     struct __block_literal_2 __block_literal_2 = {
    232           &_NSConcreteStackBlock,
    233           (1<<29), <uninitialized>,
    234           __block_invoke_2,
    235           &__block_descriptor_2,
    236           x
    237      };
    238 
    239 In summary, scalars, structures, unions, and function pointers are generally
    240 imported as ``const`` copies with no need for helper functions.
    241 
    242 Imported ``const`` copy of ``Block`` reference
    243 ----------------------------------------------
    244 
    245 The first case where copy and dispose helper functions are required is for the
    246 case of when a ``Block`` itself is imported.  In this case both a
    247 ``copy_helper`` function and a ``dispose_helper`` function are needed.  The
    248 ``copy_helper`` function is passed both the existing stack based pointer and the
    249 pointer to the new heap version and should call back into the runtime to
    250 actually do the copy operation on the imported fields within the ``Block``. The
    251 runtime functions are all described in :ref:`RuntimeHelperFunctions`.
    252 
    253 A quick example:
    254 
    255 .. code-block:: c
    256 
    257     void (^existingBlock)(void) = ...;
    258     void (^vv)(void) = ^{ existingBlock(); }
    259     vv();
    260     
    261     struct __block_literal_3 {
    262        ...; // existing block
    263     };
    264     
    265     struct __block_literal_4 {
    266         void *isa;
    267         int flags;
    268         int reserved; 
    269         void (*invoke)(struct __block_literal_4 *);
    270         struct __block_literal_3 *const existingBlock;
    271     };
    272     
    273     void __block_invoke_4(struct __block_literal_2 *_block) {
    274        __block->existingBlock->invoke(__block->existingBlock);
    275     }
    276     
    277     void __block_copy_4(struct __block_literal_4 *dst, struct __block_literal_4 *src) {
    278          //_Block_copy_assign(&dst->existingBlock, src->existingBlock, 0);
    279          _Block_object_assign(&dst->existingBlock, src->existingBlock, BLOCK_FIELD_IS_BLOCK);
    280     }
    281     
    282     void __block_dispose_4(struct __block_literal_4 *src) {
    283          // was _Block_destroy
    284          _Block_object_dispose(src->existingBlock, BLOCK_FIELD_IS_BLOCK);
    285     }
    286     
    287     static struct __block_descriptor_4 {
    288         unsigned long int reserved;
    289         unsigned long int Block_size;
    290         void (*copy_helper)(struct __block_literal_4 *dst, struct __block_literal_4 *src);
    291         void (*dispose_helper)(struct __block_literal_4 *);
    292     } __block_descriptor_4 = {
    293         0,
    294         sizeof(struct __block_literal_4),
    295         __block_copy_4,
    296         __block_dispose_4,
    297     };
    298 
    299 and where said ``Block`` is used:
    300 
    301 .. code-block:: c
    302 
    303     struct __block_literal_4 _block_literal = {
    304           &_NSConcreteStackBlock,
    305           (1<<25)|(1<<29), <uninitialized>
    306           __block_invoke_4,
    307           & __block_descriptor_4
    308           existingBlock,
    309     };
    310 
    311 Importing ``__attribute__((NSObject))`` variables
    312 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    313 
    314 GCC introduces ``__attribute__((NSObject))`` on structure pointers to mean "this
    315 is an object".  This is useful because many low level data structures are
    316 declared as opaque structure pointers, e.g. ``CFStringRef``, ``CFArrayRef``,
    317 etc.  When used from C, however, these are still really objects and are the
    318 second case where that requires copy and dispose helper functions to be
    319 generated.  The copy helper functions generated by the compiler should use the
    320 ``_Block_object_assign`` runtime helper function and in the dispose helper the
    321 ``_Block_object_dispose`` runtime helper function should be called.
    322 
    323 For example, ``Block`` foo in the following:
    324 
    325 .. code-block:: c
    326 
    327     struct Opaque *__attribute__((NSObject)) objectPointer = ...;
    328     ...
    329     void (^foo)(void) = ^{  CFPrint(objectPointer); };
    330 
    331 would have the following helper functions generated:
    332 
    333 .. code-block:: c
    334 
    335     void __block_copy_foo(struct __block_literal_5 *dst, struct __block_literal_5 *src) {
    336          _Block_object_assign(&dst->objectPointer, src-> objectPointer, BLOCK_FIELD_IS_OBJECT);
    337     }
    338     
    339     void __block_dispose_foo(struct __block_literal_5 *src) {
    340          _Block_object_dispose(src->objectPointer, BLOCK_FIELD_IS_OBJECT);
    341     }
    342 
    343 Imported ``__block`` marked variables
    344 -------------------------------------
    345 
    346 Layout of ``__block`` marked variables
    347 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    348 
    349 The compiler must embed variables that are marked ``__block`` in a specialized
    350 structure of the form:
    351 
    352 .. code-block:: c
    353 
    354     struct _block_byref_foo {
    355         void *isa;
    356         struct Block_byref *forwarding;
    357         int flags;   //refcount;
    358         int size;
    359         typeof(marked_variable) marked_variable;
    360     };
    361 
    362 Variables of certain types require helper functions for when ``Block_copy()``
    363 and ``Block_release()`` are performed upon a referencing ``Block``.  At the "C"
    364 level only variables that are of type ``Block`` or ones that have
    365 ``__attribute__((NSObject))`` marked require helper functions.  In Objective-C
    366 objects require helper functions and in C++ stack based objects require helper
    367 functions. Variables that require helper functions use the form:
    368 
    369 .. code-block:: c
    370 
    371     struct _block_byref_foo {
    372         void *isa;
    373         struct _block_byref_foo *forwarding;
    374         int flags;   //refcount;
    375         int size;
    376         // helper functions called via Block_copy() and Block_release()
    377         void (*byref_keep)(void  *dst, void *src);
    378         void (*byref_dispose)(void *);
    379         typeof(marked_variable) marked_variable;
    380     };
    381 
    382 The structure is initialized such that:
    383 
    384     a. The ``forwarding`` pointer is set to the beginning of its enclosing
    385     structure.
    386     
    387     b. The ``size`` field is initialized to the total size of the enclosing
    388     structure.    
    389     
    390     c. The ``flags`` field is set to either 0 if no helper functions are needed
    391     or (1<<25) if they are.    
    392     
    393     d. The helper functions are initialized (if present).    
    394     
    395     e. The variable itself is set to its initial value.    
    396     
    397     f. The ``isa`` field is set to ``NULL``.
    398 
    399 Access to ``__block`` variables from within its lexical scope
    400 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    401 
    402 In order to "move" the variable to the heap upon a ``copy_helper`` operation the
    403 compiler must rewrite access to such a variable to be indirect through the
    404 structures ``forwarding`` pointer.  For example:
    405 
    406 .. code-block:: c
    407 
    408     int __block i = 10;
    409     i = 11;
    410 
    411 would be rewritten to be:
    412 
    413 .. code-block:: c
    414 
    415     struct _block_byref_i {
    416       void *isa;
    417       struct _block_byref_i *forwarding;
    418       int flags;   //refcount;
    419       int size;
    420       int captured_i;
    421     } i = { NULL, &i, 0, sizeof(struct _block_byref_i), 10 };
    422     
    423     i.forwarding->captured_i = 11;
    424 
    425 In the case of a ``Block`` reference variable being marked ``__block`` the
    426 helper code generated must use the ``_Block_object_assign`` and
    427 ``_Block_object_dispose`` routines supplied by the runtime to make the
    428 copies. For example:
    429 
    430 .. code-block:: c
    431 
    432     __block void (voidBlock)(void) = blockA;
    433     voidBlock = blockB;
    434 
    435 would translate into:
    436 
    437 .. code-block:: c
    438 
    439     struct _block_byref_voidBlock {
    440         void *isa;
    441         struct _block_byref_voidBlock *forwarding;
    442         int flags;   //refcount;
    443         int size;
    444         void (*byref_keep)(struct _block_byref_voidBlock *dst, struct _block_byref_voidBlock *src);
    445         void (*byref_dispose)(struct _block_byref_voidBlock *);
    446         void (^captured_voidBlock)(void);
    447     };
    448     
    449     void _block_byref_keep_helper(struct _block_byref_voidBlock *dst, struct _block_byref_voidBlock *src) {
    450         //_Block_copy_assign(&dst->captured_voidBlock, src->captured_voidBlock, 0);
    451         _Block_object_assign(&dst->captured_voidBlock, src->captured_voidBlock, BLOCK_FIELD_IS_BLOCK | BLOCK_BYREF_CALLER);
    452     }
    453     
    454     void _block_byref_dispose_helper(struct _block_byref_voidBlock *param) {
    455         //_Block_destroy(param->captured_voidBlock, 0);
    456         _Block_object_dispose(param->captured_voidBlock, BLOCK_FIELD_IS_BLOCK | BLOCK_BYREF_CALLER)}
    457 
    458 and:
    459 
    460 .. code-block:: c
    461 
    462     struct _block_byref_voidBlock voidBlock = {( .forwarding=&voidBlock, .flags=(1<<25), .size=sizeof(struct _block_byref_voidBlock *),
    463         .byref_keep=_block_byref_keep_helper, .byref_dispose=_block_byref_dispose_helper,
    464         .captured_voidBlock=blockA )};
    465     
    466     voidBlock.forwarding->captured_voidBlock = blockB;
    467 
    468 Importing ``__block`` variables into ``Blocks``
    469 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    470 
    471 A ``Block`` that uses a ``__block`` variable in its compound statement body must
    472 import the variable and emit ``copy_helper`` and ``dispose_helper`` helper
    473 functions that, in turn, call back into the runtime to actually copy or release
    474 the ``byref`` data block using the functions ``_Block_object_assign`` and
    475 ``_Block_object_dispose``.
    476 
    477 For example:
    478 
    479 .. code-block:: c
    480 
    481     int __block i = 2;
    482     functioncall(^{ i = 10; });
    483 
    484 would translate to:
    485 
    486 .. code-block:: c
    487 
    488     struct _block_byref_i {
    489         void *isa;  // set to NULL
    490         struct _block_byref_voidBlock *forwarding;
    491         int flags;   //refcount;
    492         int size;
    493         void (*byref_keep)(struct _block_byref_i *dst, struct _block_byref_i *src);
    494         void (*byref_dispose)(struct _block_byref_i *);
    495         int captured_i;
    496     };
    497     
    498     
    499     struct __block_literal_5 {
    500         void *isa;
    501         int flags;
    502         int reserved; 
    503         void (*invoke)(struct __block_literal_5 *);
    504         struct __block_descriptor_5 *descriptor;
    505         struct _block_byref_i *i_holder;
    506     };
    507     
    508     void __block_invoke_5(struct __block_literal_5 *_block) {
    509        _block->forwarding->captured_i = 10;
    510     }
    511     
    512     void __block_copy_5(struct __block_literal_5 *dst, struct __block_literal_5 *src) {
    513          //_Block_byref_assign_copy(&dst->captured_i, src->captured_i);
    514          _Block_object_assign(&dst->captured_i, src->captured_i, BLOCK_FIELD_IS_BYREF | BLOCK_BYREF_CALLER);
    515     }
    516     
    517     void __block_dispose_5(struct __block_literal_5 *src) {
    518          //_Block_byref_release(src->captured_i);
    519          _Block_object_dispose(src->captured_i, BLOCK_FIELD_IS_BYREF | BLOCK_BYREF_CALLER);
    520     }
    521     
    522     static struct __block_descriptor_5 {
    523         unsigned long int reserved;
    524         unsigned long int Block_size;
    525         void (*copy_helper)(struct __block_literal_5 *dst, struct __block_literal_5 *src);
    526         void (*dispose_helper)(struct __block_literal_5 *);
    527     } __block_descriptor_5 = { 0, sizeof(struct __block_literal_5) __block_copy_5, __block_dispose_5 };
    528 
    529 and:
    530 
    531 .. code-block:: c
    532 
    533     struct _block_byref_i i = {( .forwarding=&i, .flags=0, .size=sizeof(struct _block_byref_i) )};
    534     struct __block_literal_5 _block_literal = {
    535           &_NSConcreteStackBlock,
    536           (1<<25)|(1<<29), <uninitialized>,
    537           __block_invoke_5,
    538           &__block_descriptor_5,
    539           2,
    540     };
    541 
    542 Importing ``__attribute__((NSObject))`` ``__block`` variables
    543 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    544 
    545 A ``__block`` variable that is also marked ``__attribute__((NSObject))`` should
    546 have ``byref_keep`` and ``byref_dispose`` helper functions that use
    547 ``_Block_object_assign`` and ``_Block_object_dispose``.
    548 
    549 ``__block`` escapes
    550 ^^^^^^^^^^^^^^^^^^^
    551 
    552 Because ``Blocks`` referencing ``__block`` variables may have ``Block_copy()``
    553 performed upon them the underlying storage for the variables may move to the
    554 heap.  In Objective-C Garbage Collection Only compilation environments the heap
    555 used is the garbage collected one and no further action is required.  Otherwise
    556 the compiler must issue a call to potentially release any heap storage for
    557 ``__block`` variables at all escapes or terminations of their scope.  The call
    558 should be:
    559 
    560 .. code-block:: c
    561 
    562     _Block_object_dispose(&_block_byref_foo, BLOCK_FIELD_IS_BYREF);
    563 
    564 Nesting
    565 ^^^^^^^
    566 
    567 ``Blocks`` may contain ``Block`` literal expressions.  Any variables used within
    568 inner blocks are imported into all enclosing ``Block`` scopes even if the
    569 variables are not used. This includes ``const`` imports as well as ``__block``
    570 variables.
    571 
    572 Objective C Extensions to ``Blocks``
    573 ====================================
    574 
    575 Importing Objects
    576 -----------------
    577 
    578 Objects should be treated as ``__attribute__((NSObject))`` variables; all
    579 ``copy_helper``, ``dispose_helper``, ``byref_keep``, and ``byref_dispose``
    580 helper functions should use ``_Block_object_assign`` and
    581 ``_Block_object_dispose``.  There should be no code generated that uses
    582 ``*-retain`` or ``*-release`` methods.
    583 
    584 ``Blocks`` as Objects
    585 ---------------------
    586 
    587 The compiler will treat ``Blocks`` as objects when synthesizing property setters
    588 and getters, will characterize them as objects when generating garbage
    589 collection strong and weak layout information in the same manner as objects, and
    590 will issue strong and weak write-barrier assignments in the same manner as
    591 objects.
    592 
    593 ``__weak __block`` Support
    594 --------------------------
    595 
    596 Objective-C (and Objective-C++) support the ``__weak`` attribute on ``__block``
    597 variables.  Under normal circumstances the compiler uses the Objective-C runtime
    598 helper support functions ``objc_assign_weak`` and ``objc_read_weak``.  Both
    599 should continue to be used for all reads and writes of ``__weak __block``
    600 variables:
    601 
    602 .. code-block:: c
    603 
    604     objc_read_weak(&block->byref_i->forwarding->i)
    605 
    606 The ``__weak`` variable is stored in a ``_block_byref_foo`` structure and the
    607 ``Block`` has copy and dispose helpers for this structure that call:
    608 
    609 .. code-block:: c
    610 
    611     _Block_object_assign(&dest->_block_byref_i, src-> _block_byref_i, BLOCK_FIELD_IS_WEAK | BLOCK_FIELD_IS_BYREF);
    612 
    613 and:
    614 
    615 .. code-block:: c
    616 
    617     _Block_object_dispose(src->_block_byref_i, BLOCK_FIELD_IS_WEAK | BLOCK_FIELD_IS_BYREF);
    618 
    619 In turn, the ``block_byref`` copy support helpers distinguish between whether
    620 the ``__block`` variable is a ``Block`` or not and should either call:
    621 
    622 .. code-block:: c
    623 
    624     _Block_object_assign(&dest->_block_byref_i, src->_block_byref_i, BLOCK_FIELD_IS_WEAK | BLOCK_FIELD_IS_OBJECT | BLOCK_BYREF_CALLER);
    625 
    626 for something declared as an object or:
    627 
    628 .. code-block:: c
    629 
    630     _Block_object_assign(&dest->_block_byref_i, src->_block_byref_i, BLOCK_FIELD_IS_WEAK | BLOCK_FIELD_IS_BLOCK | BLOCK_BYREF_CALLER);
    631 
    632 for something declared as a ``Block``.
    633 
    634 A full example follows:
    635 
    636 .. code-block:: c
    637 
    638     __block __weak id obj = <initialization expression>;
    639     functioncall(^{ [obj somemessage]; });
    640 
    641 would translate to:
    642 
    643 .. code-block:: c
    644 
    645     struct _block_byref_obj {
    646         void *isa;  // uninitialized
    647         struct _block_byref_obj *forwarding;
    648         int flags;   //refcount;
    649         int size;
    650         void (*byref_keep)(struct _block_byref_i *dst, struct _block_byref_i *src);
    651         void (*byref_dispose)(struct _block_byref_i *);
    652         id captured_obj;
    653     };
    654     
    655     void _block_byref_obj_keep(struct _block_byref_voidBlock *dst, struct _block_byref_voidBlock *src) {
    656         //_Block_copy_assign(&dst->captured_obj, src->captured_obj, 0);
    657         _Block_object_assign(&dst->captured_obj, src->captured_obj, BLOCK_FIELD_IS_OBJECT | BLOCK_FIELD_IS_WEAK | BLOCK_BYREF_CALLER);
    658     }
    659     
    660     void _block_byref_obj_dispose(struct _block_byref_voidBlock *param) {
    661         //_Block_destroy(param->captured_obj, 0);
    662         _Block_object_dispose(param->captured_obj, BLOCK_FIELD_IS_OBJECT | BLOCK_FIELD_IS_WEAK | BLOCK_BYREF_CALLER);
    663     };
    664 
    665 for the block ``byref`` part and:
    666 
    667 .. code-block:: c
    668 
    669     struct __block_literal_5 {
    670         void *isa;
    671         int flags;
    672         int reserved; 
    673         void (*invoke)(struct __block_literal_5 *);
    674         struct __block_descriptor_5 *descriptor;
    675         struct _block_byref_obj *byref_obj;
    676     };
    677     
    678     void __block_invoke_5(struct __block_literal_5 *_block) {
    679        [objc_read_weak(&_block->byref_obj->forwarding->captured_obj) somemessage];
    680     }
    681     
    682     void __block_copy_5(struct __block_literal_5 *dst, struct __block_literal_5 *src) {
    683          //_Block_byref_assign_copy(&dst->byref_obj, src->byref_obj);
    684          _Block_object_assign(&dst->byref_obj, src->byref_obj, BLOCK_FIELD_IS_BYREF | BLOCK_FIELD_IS_WEAK);
    685     }
    686     
    687     void __block_dispose_5(struct __block_literal_5 *src) {
    688          //_Block_byref_release(src->byref_obj);
    689          _Block_object_dispose(src->byref_obj, BLOCK_FIELD_IS_BYREF | BLOCK_FIELD_IS_WEAK);
    690     }
    691     
    692     static struct __block_descriptor_5 {
    693         unsigned long int reserved;
    694         unsigned long int Block_size;
    695         void (*copy_helper)(struct __block_literal_5 *dst, struct __block_literal_5 *src);
    696         void (*dispose_helper)(struct __block_literal_5 *);
    697     } __block_descriptor_5 = { 0, sizeof(struct __block_literal_5), __block_copy_5, __block_dispose_5 };
    698 
    699 and within the compound statement:
    700 
    701 .. code-block:: c
    702 
    703     truct _block_byref_obj obj = {( .forwarding=&obj, .flags=(1<<25), .size=sizeof(struct _block_byref_obj),
    704                      .byref_keep=_block_byref_obj_keep, .byref_dispose=_block_byref_obj_dispose,
    705                      .captured_obj = <initialization expression> )};
    706     
    707     truct __block_literal_5 _block_literal = {
    708          &_NSConcreteStackBlock,
    709          (1<<25)|(1<<29), <uninitialized>,
    710          __block_invoke_5,
    711          &__block_descriptor_5,
    712          &obj,        // a reference to the on-stack structure containing "captured_obj"
    713     };
    714     
    715     
    716     functioncall(_block_literal->invoke(&_block_literal));
    717 
    718 C++ Support
    719 ===========
    720 
    721 Within a block stack based C++ objects are copied into ``const`` copies using
    722 the copy constructor.  It is an error if a stack based C++ object is used within
    723 a block if it does not have a copy constructor.  In addition both copy and
    724 destroy helper routines must be synthesized for the block to support the
    725 ``Block_copy()`` operation, and the flags work marked with the (1<<26) bit in
    726 addition to the (1<<25) bit.  The copy helper should call the constructor using
    727 appropriate offsets of the variable within the supplied stack based block source
    728 and heap based destination for all ``const`` constructed copies, and similarly
    729 should call the destructor in the destroy routine.
    730 
    731 As an example, suppose a C++ class ``FOO`` existed with a copy constructor.
    732 Within a code block a stack version of a ``FOO`` object is declared and used
    733 within a ``Block`` literal expression:
    734 
    735 .. code-block:: c++
    736 
    737     {
    738         FOO foo;
    739         void (^block)(void) = ^{ printf("%d\n", foo.value()); };
    740     }
    741 
    742 The compiler would synthesize:
    743 
    744 .. code-block:: c++
    745 
    746     struct __block_literal_10 {
    747         void *isa;
    748         int flags;
    749         int reserved; 
    750         void (*invoke)(struct __block_literal_10 *);
    751         struct __block_descriptor_10 *descriptor;
    752         const FOO foo;
    753     };
    754     
    755     void __block_invoke_10(struct __block_literal_10 *_block) {
    756        printf("%d\n", _block->foo.value());
    757     }
    758     
    759     void __block_literal_10(struct __block_literal_10 *dst, struct __block_literal_10 *src) {
    760          FOO_ctor(&dst->foo, &src->foo);
    761     }
    762     
    763     void __block_dispose_10(struct __block_literal_10 *src) {
    764          FOO_dtor(&src->foo);
    765     }
    766     
    767     static struct __block_descriptor_10 {
    768         unsigned long int reserved;
    769         unsigned long int Block_size;
    770         void (*copy_helper)(struct __block_literal_10 *dst, struct __block_literal_10 *src);
    771         void (*dispose_helper)(struct __block_literal_10 *);
    772     } __block_descriptor_10 = { 0, sizeof(struct __block_literal_10), __block_copy_10, __block_dispose_10 };
    773 
    774 and the code would be:
    775 
    776 .. code-block:: c++
    777 
    778     {
    779       FOO foo;
    780       comp_ctor(&foo); // default constructor
    781       struct __block_literal_10 _block_literal = {
    782         &_NSConcreteStackBlock,
    783         (1<<25)|(1<<26)|(1<<29), <uninitialized>,
    784         __block_invoke_10,
    785         &__block_descriptor_10,
    786        };
    787        comp_ctor(&_block_literal->foo, &foo);  // const copy into stack version
    788        struct __block_literal_10 &block = &_block_literal;  // assign literal to block variable
    789        block->invoke(block);    // invoke block
    790        comp_dtor(&_block_literal->foo); // destroy stack version of const block copy
    791        comp_dtor(&foo); // destroy original version
    792     }
    793 
    794 
    795 C++ objects stored in ``__block`` storage start out on the stack in a
    796 ``block_byref`` data structure as do other variables.  Such objects (if not
    797 ``const`` objects) must support a regular copy constructor.  The ``block_byref``
    798 data structure will have copy and destroy helper routines synthesized by the
    799 compiler.  The copy helper will have code created to perform the copy
    800 constructor based on the initial stack ``block_byref`` data structure, and will
    801 also set the (1<<26) bit in addition to the (1<<25) bit.  The destroy helper
    802 will have code to do the destructor on the object stored within the supplied
    803 ``block_byref`` heap data structure.  For example,
    804 
    805 .. code-block:: c++
    806 
    807     __block FOO blockStorageFoo;
    808 
    809 requires the normal constructor for the embedded ``blockStorageFoo`` object:
    810 
    811 .. code-block:: c++
    812 
    813     FOO_ctor(& _block_byref_blockStorageFoo->blockStorageFoo);
    814 
    815 and at scope termination the destructor:
    816 
    817 .. code-block:: c++
    818 
    819     FOO_dtor(& _block_byref_blockStorageFoo->blockStorageFoo);
    820 
    821 Note that the forwarding indirection is *NOT* used.
    822 
    823 The compiler would need to generate (if used from a block literal) the following
    824 copy/dispose helpers:
    825 
    826 .. code-block:: c++
    827 
    828     void _block_byref_obj_keep(struct _block_byref_blockStorageFoo *dst, struct _block_byref_blockStorageFoo *src) {
    829          FOO_ctor(&dst->blockStorageFoo, &src->blockStorageFoo);
    830     }
    831     
    832     void _block_byref_obj_dispose(struct _block_byref_blockStorageFoo *src) {
    833          FOO_dtor(&src->blockStorageFoo);
    834     }
    835 
    836 for the appropriately named constructor and destructor for the class/struct
    837 ``FOO``.
    838 
    839 To support member variable and function access the compiler will synthesize a
    840 ``const`` pointer to a block version of the ``this`` pointer.
    841 
    842 .. _RuntimeHelperFunctions:
    843 
    844 Runtime Helper Functions
    845 ========================
    846 
    847 The runtime helper functions are described in
    848 ``/usr/local/include/Block_private.h``.  To summarize their use, a ``Block``
    849 requires copy/dispose helpers if it imports any block variables, ``__block``
    850 storage variables, ``__attribute__((NSObject))`` variables, or C++ ``const``
    851 copied objects with constructor/destructors.  The (1<<26) bit is set and
    852 functions are generated.
    853 
    854 The block copy helper function should, for each of the variables of the type
    855 mentioned above, call:
    856 
    857 .. code-block:: c
    858 
    859      _Block_object_assign(&dst->target, src->target, BLOCK_FIELD_<appropo>);
    860 
    861 in the copy helper and:
    862 
    863 .. code-block:: c
    864 
    865     _Block_object_dispose(->target, BLOCK_FIELD_<appropo>);
    866 
    867 in the dispose helper where ``<appropo>`` is:
    868 
    869 .. code-block:: c
    870 
    871     enum {
    872         BLOCK_FIELD_IS_OBJECT   =  3,  // id, NSObject, __attribute__((NSObject)), block, ...
    873         BLOCK_FIELD_IS_BLOCK    =  7,  // a block variable
    874         BLOCK_FIELD_IS_BYREF    =  8,  // the on stack structure holding the __block variable
    875     
    876         BLOCK_FIELD_IS_WEAK     = 16,  // declared __weak
    877     
    878         BLOCK_BYREF_CALLER      = 128, // called from byref copy/dispose helpers
    879     };
    880 
    881 and of course the constructors/destructors for ``const`` copied C++ objects.
    882 
    883 The ``block_byref`` data structure similarly requires copy/dispose helpers for
    884 block variables, ``__attribute__((NSObject))`` variables, or C++ ``const``
    885 copied objects with constructor/destructors, and again the (1<<26) bit is set
    886 and functions are generated in the same manner.
    887 
    888 Under ObjC we allow ``__weak`` as an attribute on ``__block`` variables, and
    889 this causes the addition of ``BLOCK_FIELD_IS_WEAK`` orred onto the
    890 ``BLOCK_FIELD_IS_BYREF`` flag when copying the ``block_byref`` structure in the
    891 ``Block`` copy helper, and onto the ``BLOCK_FIELD_<appropo>`` field within the
    892 ``block_byref`` copy/dispose helper calls.
    893 
    894 The prototypes, and summary, of the helper functions are:
    895 
    896 .. code-block:: c
    897     
    898     /* Certain field types require runtime assistance when being copied to the
    899        heap.  The following function is used to copy fields of types: blocks,
    900        pointers to byref structures, and objects (including
    901        __attribute__((NSObject)) pointers.  BLOCK_FIELD_IS_WEAK is orthogonal to
    902        the other choices which are mutually exclusive.  Only in a Block copy
    903        helper will one see BLOCK_FIELD_IS_BYREF.
    904     */
    905     void _Block_object_assign(void *destAddr, const void *object, const int flags);
    906     
    907     /* Similarly a compiler generated dispose helper needs to call back for each
    908        field of the byref data structure.  (Currently the implementation only
    909        packs one field into the byref structure but in principle there could be
    910        more).  The same flags used in the copy helper should be used for each
    911        call generated to this function:
    912     */
    913     void _Block_object_dispose(const void *object, const int flags);
    914 
    915 Copyright
    916 =========
    917 
    918 Copyright 2008-2010 Apple, Inc.
    919 Permission is hereby granted, free of charge, to any person obtaining a copy
    920 of this software and associated documentation files (the "Software"), to deal
    921 in the Software without restriction, including without limitation the rights
    922 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    923 copies of the Software, and to permit persons to whom the Software is
    924 furnished to do so, subject to the following conditions:
    925 
    926 The above copyright notice and this permission notice shall be included in
    927 all copies or substantial portions of the Software.
    928 
    929 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    930 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    931 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    932 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    933 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    934 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    935 THE SOFTWARE.
    936