• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1==================================
2Block Implementation Specification
3==================================
4
5.. contents::
6   :local:
7
8History
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
24This document describes the Apple ABI implementation specification of Blocks.
25
26The first shipping version of this ABI is found in Mac OS X 10.6, and shall be
27referred to as 10.6.ABI. As of 2010/3/16, the following describes the ABI
28contract with the runtime and the compiler, and, as necessary, will be referred
29to as ABI.2010.3.16.
30
31Since the Apple ABI references symbols from other elements of the system, any
32attempt to use this ABI on systems prior to SnowLeopard is undefined.
33
34High Level
35==========
36
37The ABI of ``Blocks`` consist of their layout and the runtime functions required
38by 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
59The 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
71In 10.6.ABI the (1<<29) was usually set and was always ignored by the runtime -
72it had been a transitional marker that did not get deleted after the
73transition. 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
75meanings:
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
86The signature field is not always populated.
87
88The following discussions are presented as 10.6.ABI otherwise.
89
90``Block`` literals may occur within functions where the structure is created in
91stack local memory.  They may also appear as initialization expressions for
92``Block`` variables of global or ``static`` local variables.
93
94When a ``Block`` literal expression is evaluated the stack based structure is
95initialized as follows:
96
971. 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
1092. 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
122As an example, the ``Block`` literal expression:
123
124.. code-block:: c
125
126    ^ { printf("hello world\n"); }
127
128would 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
149and 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
160A ``Block`` imports other ``Block`` references, ``const`` copies of other
161variables, and variables marked ``__block``.  In Objective-C, variables may
162additionally be objects.
163
164When a ``Block`` literal expression is used as the initial value of a global
165or ``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
176that 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
178stack based ``Block`` literals.  This is an optimization that can be used for
179any ``Block`` literal that imports no ``const`` or ``__block`` storage
180variables.
181
182Imported Variables
183==================
184
185Variables of ``auto`` storage class are imported as ``const`` copies.  Variables
186of ``__block`` storage class are imported as a pointer to an enclosing data
187structure.  Global variables are simply referenced and not considered as
188imported.
189
190Imported ``const`` copy variables
191---------------------------------
192
193Automatic storage variables not marked with ``__block`` are imported as
194``const`` copies.
195
196The 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
205which 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
227and:
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
239In summary, scalars, structures, unions, and function pointers are generally
240imported as ``const`` copies with no need for helper functions.
241
242Imported ``const`` copy of ``Block`` reference
243----------------------------------------------
244
245The first case where copy and dispose helper functions are required is for the
246case 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
249pointer to the new heap version and should call back into the runtime to
250actually do the copy operation on the imported fields within the ``Block``. The
251runtime functions are all described in :ref:`RuntimeHelperFunctions`.
252
253A 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
299and 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
311Importing ``__attribute__((NSObject))`` variables
312^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
313
314GCC introduces ``__attribute__((NSObject))`` on structure pointers to mean "this
315is an object".  This is useful because many low level data structures are
316declared as opaque structure pointers, e.g. ``CFStringRef``, ``CFArrayRef``,
317etc.  When used from C, however, these are still really objects and are the
318second case where that requires copy and dispose helper functions to be
319generated.  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
323For 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
331would 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
343Imported ``__block`` marked variables
344-------------------------------------
345
346Layout of ``__block`` marked variables
347^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
348
349The compiler must embed variables that are marked ``__block`` in a specialized
350structure 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
362Variables of certain types require helper functions for when ``Block_copy()``
363and ``Block_release()`` are performed upon a referencing ``Block``.  At the "C"
364level only variables that are of type ``Block`` or ones that have
365``__attribute__((NSObject))`` marked require helper functions.  In Objective-C
366objects require helper functions and in C++ stack based objects require helper
367functions. 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
382The 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
399Access to ``__block`` variables from within its lexical scope
400^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
401
402In order to "move" the variable to the heap upon a ``copy_helper`` operation the
403compiler must rewrite access to such a variable to be indirect through the
404structures ``forwarding`` pointer.  For example:
405
406.. code-block:: c
407
408    int __block i = 10;
409    i = 11;
410
411would 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
425In the case of a ``Block`` reference variable being marked ``__block`` the
426helper code generated must use the ``_Block_object_assign`` and
427``_Block_object_dispose`` routines supplied by the runtime to make the
428copies. For example:
429
430.. code-block:: c
431
432    __block void (voidBlock)(void) = blockA;
433    voidBlock = blockB;
434
435would 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
458and:
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
468Importing ``__block`` variables into ``Blocks``
469^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
470
471A ``Block`` that uses a ``__block`` variable in its compound statement body must
472import the variable and emit ``copy_helper`` and ``dispose_helper`` helper
473functions that, in turn, call back into the runtime to actually copy or release
474the ``byref`` data block using the functions ``_Block_object_assign`` and
475``_Block_object_dispose``.
476
477For example:
478
479.. code-block:: c
480
481    int __block i = 2;
482    functioncall(^{ i = 10; });
483
484would 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
529and:
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
542Importing ``__attribute__((NSObject))`` ``__block`` variables
543^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
544
545A ``__block`` variable that is also marked ``__attribute__((NSObject))`` should
546have ``byref_keep`` and ``byref_dispose`` helper functions that use
547``_Block_object_assign`` and ``_Block_object_dispose``.
548
549``__block`` escapes
550^^^^^^^^^^^^^^^^^^^
551
552Because ``Blocks`` referencing ``__block`` variables may have ``Block_copy()``
553performed upon them the underlying storage for the variables may move to the
554heap.  In Objective-C Garbage Collection Only compilation environments the heap
555used is the garbage collected one and no further action is required.  Otherwise
556the 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
558should be:
559
560.. code-block:: c
561
562    _Block_object_dispose(&_block_byref_foo, BLOCK_FIELD_IS_BYREF);
563
564Nesting
565^^^^^^^
566
567``Blocks`` may contain ``Block`` literal expressions.  Any variables used within
568inner blocks are imported into all enclosing ``Block`` scopes even if the
569variables are not used. This includes ``const`` imports as well as ``__block``
570variables.
571
572Objective C Extensions to ``Blocks``
573====================================
574
575Importing Objects
576-----------------
577
578Objects should be treated as ``__attribute__((NSObject))`` variables; all
579``copy_helper``, ``dispose_helper``, ``byref_keep``, and ``byref_dispose``
580helper 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
587The compiler will treat ``Blocks`` as objects when synthesizing property setters
588and getters, will characterize them as objects when generating garbage
589collection strong and weak layout information in the same manner as objects, and
590will issue strong and weak write-barrier assignments in the same manner as
591objects.
592
593``__weak __block`` Support
594--------------------------
595
596Objective-C (and Objective-C++) support the ``__weak`` attribute on ``__block``
597variables.  Under normal circumstances the compiler uses the Objective-C runtime
598helper support functions ``objc_assign_weak`` and ``objc_read_weak``.  Both
599should continue to be used for all reads and writes of ``__weak __block``
600variables:
601
602.. code-block:: c
603
604    objc_read_weak(&block->byref_i->forwarding->i)
605
606The ``__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
613and:
614
615.. code-block:: c
616
617    _Block_object_dispose(src->_block_byref_i, BLOCK_FIELD_IS_WEAK | BLOCK_FIELD_IS_BYREF);
618
619In turn, the ``block_byref`` copy support helpers distinguish between whether
620the ``__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
626for 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
632for something declared as a ``Block``.
633
634A full example follows:
635
636.. code-block:: c
637
638    __block __weak id obj = <initialization expression>;
639    functioncall(^{ [obj somemessage]; });
640
641would 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
665for 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
699and 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
718C++ Support
719===========
720
721Within a block stack based C++ objects are copied into ``const`` copies using
722the copy constructor.  It is an error if a stack based C++ object is used within
723a block if it does not have a copy constructor.  In addition both copy and
724destroy 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
726addition to the (1<<25) bit.  The copy helper should call the constructor using
727appropriate offsets of the variable within the supplied stack based block source
728and heap based destination for all ``const`` constructed copies, and similarly
729should call the destructor in the destroy routine.
730
731As an example, suppose a C++ class ``FOO`` existed with a copy constructor.
732Within a code block a stack version of a ``FOO`` object is declared and used
733within 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
742The 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
774and 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
795C++ 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``
798data structure will have copy and destroy helper routines synthesized by the
799compiler.  The copy helper will have code created to perform the copy
800constructor based on the initial stack ``block_byref`` data structure, and will
801also set the (1<<26) bit in addition to the (1<<25) bit.  The destroy helper
802will 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
809requires the normal constructor for the embedded ``blockStorageFoo`` object:
810
811.. code-block:: c++
812
813    FOO_ctor(& _block_byref_blockStorageFoo->blockStorageFoo);
814
815and at scope termination the destructor:
816
817.. code-block:: c++
818
819    FOO_dtor(& _block_byref_blockStorageFoo->blockStorageFoo);
820
821Note that the forwarding indirection is *NOT* used.
822
823The compiler would need to generate (if used from a block literal) the following
824copy/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
836for the appropriately named constructor and destructor for the class/struct
837``FOO``.
838
839To 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
844Runtime Helper Functions
845========================
846
847The runtime helper functions are described in
848``/usr/local/include/Block_private.h``.  To summarize their use, a ``Block``
849requires copy/dispose helpers if it imports any block variables, ``__block``
850storage variables, ``__attribute__((NSObject))`` variables, or C++ ``const``
851copied objects with constructor/destructors.  The (1<<26) bit is set and
852functions are generated.
853
854The block copy helper function should, for each of the variables of the type
855mentioned above, call:
856
857.. code-block:: c
858
859     _Block_object_assign(&dst->target, src->target, BLOCK_FIELD_<appropo>);
860
861in the copy helper and:
862
863.. code-block:: c
864
865    _Block_object_dispose(->target, BLOCK_FIELD_<appropo>);
866
867in 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
881and of course the constructors/destructors for ``const`` copied C++ objects.
882
883The ``block_byref`` data structure similarly requires copy/dispose helpers for
884block variables, ``__attribute__((NSObject))`` variables, or C++ ``const``
885copied objects with constructor/destructors, and again the (1<<26) bit is set
886and functions are generated in the same manner.
887
888Under ObjC we allow ``__weak`` as an attribute on ``__block`` variables, and
889this 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
894The 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
915Copyright
916=========
917
918Copyright 2008-2010 Apple, Inc.
919Permission is hereby granted, free of charge, to any person obtaining a copy
920of this software and associated documentation files (the "Software"), to deal
921in the Software without restriction, including without limitation the rights
922to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
923copies of the Software, and to permit persons to whom the Software is
924furnished to do so, subject to the following conditions:
925
926The above copyright notice and this permission notice shall be included in
927all copies or substantial portions of the Software.
928
929THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
930IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
931FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
932AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
933LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
934OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
935THE SOFTWARE.
936