|  |  | 
|  | .. role:: block-term | 
|  |  | 
|  | ================================= | 
|  | Language Specification for Blocks | 
|  | ================================= | 
|  |  | 
|  | .. contents:: | 
|  | :local: | 
|  |  | 
|  | Revisions | 
|  | ========= | 
|  |  | 
|  | - 2008/2/25 --- created | 
|  | - 2008/7/28 --- revised, ``__block`` syntax | 
|  | - 2008/8/13 --- revised, Block globals | 
|  | - 2008/8/21 --- revised, C++ elaboration | 
|  | - 2008/11/1 --- revised, ``__weak`` support | 
|  | - 2009/1/12 --- revised, explicit return types | 
|  | - 2009/2/10 --- revised, ``__block`` objects need retain | 
|  |  | 
|  | Overview | 
|  | ======== | 
|  |  | 
|  | A new derived type is introduced to C and, by extension, Objective-C, | 
|  | C++, and Objective-C++ | 
|  |  | 
|  | The Block Type | 
|  | ============== | 
|  |  | 
|  | Like function types, the :block-term:`Block type` is a pair consisting | 
|  | of a result value type and a list of parameter types very similar to a | 
|  | function type. Blocks are intended to be used much like functions with | 
|  | the key distinction being that in addition to executable code they | 
|  | also contain various variable bindings to automatic (stack) or managed | 
|  | (heap) memory. | 
|  |  | 
|  | The abstract declarator, | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | int (^)(char, float) | 
|  |  | 
|  | describes a reference to a Block that, when invoked, takes two | 
|  | parameters, the first of type char and the second of type float, and | 
|  | returns a value of type int.  The Block referenced is of opaque data | 
|  | that may reside in automatic (stack) memory, global memory, or heap | 
|  | memory. | 
|  |  | 
|  | Block Variable Declarations | 
|  | =========================== | 
|  |  | 
|  | A :block-term:`variable with Block type` is declared using function | 
|  | pointer style notation substituting ``^`` for ``*``. The following are | 
|  | valid Block variable declarations: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | void (^blockReturningVoidWithVoidArgument)(void); | 
|  | int (^blockReturningIntWithIntAndCharArguments)(int, char); | 
|  | void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); | 
|  |  | 
|  | Variadic ``...`` arguments are supported. [variadic.c] A Block that | 
|  | takes no arguments must specify void in the argument list [voidarg.c]. | 
|  | An empty parameter list does not represent, as K&R provide, an | 
|  | unspecified argument list.  Note: both gcc and clang support K&R style | 
|  | as a convenience. | 
|  |  | 
|  | A Block reference may be cast to a pointer of arbitrary type and vice | 
|  | versa. [cast.c] A Block reference may not be dereferenced via the | 
|  | pointer dereference operator ``*``, and thus a Block's size may not be | 
|  | computed at compile time. [sizeof.c] | 
|  |  | 
|  | Block Literal Expressions | 
|  | ========================= | 
|  |  | 
|  | A :block-term:`Block literal expression` produces a reference to a | 
|  | Block. It is introduced by the use of the ``^`` token as a unary | 
|  | operator. | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | Block_literal_expression ::=   ^ block_decl compound_statement_body | 
|  | block_decl ::= | 
|  | block_decl ::= parameter_list | 
|  | block_decl ::= type_expression | 
|  |  | 
|  | where type expression is extended to allow ``^`` as a Block reference | 
|  | (pointer) where ``*`` is allowed as a function reference (pointer). | 
|  |  | 
|  | The following Block literal: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | ^ void (void) { printf("hello world\n"); } | 
|  |  | 
|  | produces a reference to a Block with no arguments with no return value. | 
|  |  | 
|  | The return type is optional and is inferred from the return | 
|  | statements. If the return statements return a value, they all must | 
|  | return a value of the same type. If there is no value returned the | 
|  | inferred type of the Block is void; otherwise it is the type of the | 
|  | return statement value. | 
|  |  | 
|  | If the return type is omitted and the argument list is ``( void )``, | 
|  | the ``( void )`` argument list may also be omitted. | 
|  |  | 
|  | So: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | ^ ( void ) { printf("hello world\n"); } | 
|  |  | 
|  | and: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | ^ { printf("hello world\n"); } | 
|  |  | 
|  | are exactly equivalent constructs for the same expression. | 
|  |  | 
|  | The type_expression extends C expression parsing to accommodate Block | 
|  | reference declarations as it accommodates function pointer | 
|  | declarations. | 
|  |  | 
|  | Given: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | typedef int (*pointerToFunctionThatReturnsIntWithCharArg)(char); | 
|  | pointerToFunctionThatReturnsIntWithCharArg functionPointer; | 
|  | ^ pointerToFunctionThatReturnsIntWithCharArg (float x) { return functionPointer; } | 
|  |  | 
|  | and: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | ^ int ((*)(float x))(char) { return functionPointer; } | 
|  |  | 
|  | are equivalent expressions, as is: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | ^(float x) { return functionPointer; } | 
|  |  | 
|  | [returnfunctionptr.c] | 
|  |  | 
|  | The compound statement body establishes a new lexical scope within | 
|  | that of its parent. Variables used within the scope of the compound | 
|  | statement are bound to the Block in the normal manner with the | 
|  | exception of those in automatic (stack) storage. Thus one may access | 
|  | functions and global variables as one would expect, as well as static | 
|  | local variables. [testme] | 
|  |  | 
|  | Local automatic (stack) variables referenced within the compound | 
|  | statement of a Block are imported and captured by the Block as const | 
|  | copies. The capture (binding) is performed at the time of the Block | 
|  | literal expression evaluation. | 
|  |  | 
|  | The compiler is not required to capture a variable if it can prove | 
|  | that no references to the variable will actually be evaluated. | 
|  | Programmers can force a variable to be captured by referencing it in a | 
|  | statement at the beginning of the Block, like so: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | (void) foo; | 
|  |  | 
|  | This matters when capturing the variable has side-effects, as it can | 
|  | in Objective-C or C++. | 
|  |  | 
|  | The lifetime of variables declared in a Block is that of a function; | 
|  | each activation frame contains a new copy of variables declared within | 
|  | the local scope of the Block. Such variable declarations should be | 
|  | allowed anywhere [testme] rather than only when C99 parsing is | 
|  | requested, including for statements. [testme] | 
|  |  | 
|  | Block literal expressions may occur within Block literal expressions | 
|  | (nest) and all variables captured by any nested blocks are implicitly | 
|  | also captured in the scopes of their enclosing Blocks. | 
|  |  | 
|  | A Block literal expression may be used as the initialization value for | 
|  | Block variables at global or local static scope. | 
|  |  | 
|  | The Invoke Operator | 
|  | =================== | 
|  |  | 
|  | Blocks are :block-term:`invoked` using function call syntax with a | 
|  | list of expression parameters of types corresponding to the | 
|  | declaration and returning a result type also according to the | 
|  | declaration. Given: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | int (^x)(char); | 
|  | void (^z)(void); | 
|  | int (^(*y))(char) = &x; | 
|  |  | 
|  | the following are all legal Block invocations: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | x('a'); | 
|  | (*y)('a'); | 
|  | (true ? x : *y)('a') | 
|  |  | 
|  | The Copy and Release Operations | 
|  | =============================== | 
|  |  | 
|  | The compiler and runtime provide :block-term:`copy` and | 
|  | :block-term:`release` operations for Block references that create and, | 
|  | in matched use, release allocated storage for referenced Blocks. | 
|  |  | 
|  | The copy operation ``Block_copy()`` is styled as a function that takes | 
|  | an arbitrary Block reference and returns a Block reference of the same | 
|  | type. The release operation, ``Block_release()``, is styled as a | 
|  | function that takes an arbitrary Block reference and, if dynamically | 
|  | matched to a Block copy operation, allows recovery of the referenced | 
|  | allocated memory. | 
|  |  | 
|  |  | 
|  | The ``__block`` Storage Qualifier | 
|  | ================================= | 
|  |  | 
|  | In addition to the new Block type we also introduce a new storage | 
|  | qualifier, :block-term:`__block`, for local variables. [testme: a | 
|  | __block declaration within a block literal] The ``__block`` storage | 
|  | qualifier is mutually exclusive to the existing local storage | 
|  | qualifiers auto, register, and static. [testme] Variables qualified by | 
|  | ``__block`` act as if they were in allocated storage and this storage | 
|  | is automatically recovered after last use of said variable.  An | 
|  | implementation may choose an optimization where the storage is | 
|  | initially automatic and only "moved" to allocated (heap) storage upon | 
|  | a Block_copy of a referencing Block.  Such variables may be mutated as | 
|  | normal variables are. | 
|  |  | 
|  | In the case where a ``__block`` variable is a Block one must assume | 
|  | that the ``__block`` variable resides in allocated storage and as such | 
|  | is assumed to reference a Block that is also in allocated storage | 
|  | (that it is the result of a ``Block_copy`` operation).  Despite this | 
|  | there is no provision to do a ``Block_copy`` or a ``Block_release`` if | 
|  | an implementation provides initial automatic storage for Blocks.  This | 
|  | is due to the inherent race condition of potentially several threads | 
|  | trying to update the shared variable and the need for synchronization | 
|  | around disposing of older values and copying new ones.  Such | 
|  | synchronization is beyond the scope of this language specification. | 
|  |  | 
|  |  | 
|  | Control Flow | 
|  | ============ | 
|  |  | 
|  | The compound statement of a Block is treated much like a function body | 
|  | with respect to control flow in that goto, break, and continue do not | 
|  | escape the Block.  Exceptions are treated *normally* in that when | 
|  | thrown they pop stack frames until a catch clause is found. | 
|  |  | 
|  |  | 
|  | Objective-C Extensions | 
|  | ====================== | 
|  |  | 
|  | Objective-C extends the definition of a Block reference type to be | 
|  | that also of id.  A variable or expression of Block type may be | 
|  | messaged or used as a parameter wherever an id may be. The converse is | 
|  | also true. Block references may thus appear as properties and are | 
|  | subject to the assign, retain, and copy attribute logic that is | 
|  | reserved for objects. | 
|  |  | 
|  | All Blocks are constructed to be Objective-C objects regardless of | 
|  | whether the Objective-C runtime is operational in the program or | 
|  | not. Blocks using automatic (stack) memory are objects and may be | 
|  | messaged, although they may not be assigned into ``__weak`` locations | 
|  | if garbage collection is enabled. | 
|  |  | 
|  | Within a Block literal expression within a method definition | 
|  | references to instance variables are also imported into the lexical | 
|  | scope of the compound statement. These variables are implicitly | 
|  | qualified as references from self, and so self is imported as a const | 
|  | copy. The net effect is that instance variables can be mutated. | 
|  |  | 
|  | The :block-term:`Block_copy` operator retains all objects held in | 
|  | variables of automatic storage referenced within the Block expression | 
|  | (or form strong references if running under garbage collection). | 
|  | Object variables of ``__block`` storage type are assumed to hold | 
|  | normal pointers with no provision for retain and release messages. | 
|  |  | 
|  | Foundation defines (and supplies) ``-copy`` and ``-release`` methods for | 
|  | Blocks. | 
|  |  | 
|  | In the Objective-C and Objective-C++ languages, we allow the | 
|  | ``__weak`` specifier for ``__block`` variables of object type.  If | 
|  | garbage collection is not enabled, this qualifier causes these | 
|  | variables to be kept without retain messages being sent. This | 
|  | knowingly leads to dangling pointers if the Block (or a copy) outlives | 
|  | the lifetime of this object. | 
|  |  | 
|  | In garbage collected environments, the ``__weak`` variable is set to | 
|  | nil when the object it references is collected, as long as the | 
|  | ``__block`` variable resides in the heap (either by default or via | 
|  | ``Block_copy()``).  The initial Apple implementation does in fact | 
|  | start ``__block`` variables on the stack and migrate them to the heap | 
|  | only as a result of a ``Block_copy()`` operation. | 
|  |  | 
|  | It is a runtime error to attempt to assign a reference to a | 
|  | stack-based Block into any storage marked ``__weak``, including | 
|  | ``__weak`` ``__block`` variables. | 
|  |  | 
|  |  | 
|  | C++ Extensions | 
|  | ============== | 
|  |  | 
|  | Block literal expressions within functions are extended to allow const | 
|  | use of C++ objects, pointers, or references held in automatic storage. | 
|  |  | 
|  | As usual, within the block, references to captured variables become | 
|  | const-qualified, as if they were references to members of a const | 
|  | object.  Note that this does not change the type of a variable of | 
|  | reference type. | 
|  |  | 
|  | For example, given a class Foo: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | Foo foo; | 
|  | Foo &fooRef = foo; | 
|  | Foo *fooPtr = &foo; | 
|  |  | 
|  | A Block that referenced these variables would import the variables as | 
|  | const variations: | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | const Foo block_foo = foo; | 
|  | Foo &block_fooRef = fooRef; | 
|  | Foo *const block_fooPtr = fooPtr; | 
|  |  | 
|  | Captured variables are copied into the Block at the instant of | 
|  | evaluating the Block literal expression.  They are also copied when | 
|  | calling ``Block_copy()`` on a Block allocated on the stack.  In both | 
|  | cases, they are copied as if the variable were const-qualified, and | 
|  | it's an error if there's no such constructor. | 
|  |  | 
|  | Captured variables in Blocks on the stack are destroyed when control | 
|  | leaves the compound statement that contains the Block literal | 
|  | expression.  Captured variables in Blocks on the heap are destroyed | 
|  | when the reference count of the Block drops to zero. | 
|  |  | 
|  | Variables declared as residing in ``__block`` storage may be initially | 
|  | allocated in the heap or may first appear on the stack and be copied | 
|  | to the heap as a result of a ``Block_copy()`` operation. When copied | 
|  | from the stack, ``__block`` variables are copied using their normal | 
|  | qualification (i.e. without adding const).  In C++11, ``__block`` | 
|  | variables are copied as x-values if that is possible, then as l-values | 
|  | if not; if both fail, it's an error.  The destructor for any initial | 
|  | stack-based version is called at the variable's normal end of scope. | 
|  |  | 
|  | References to ``this``, as well as references to non-static members of | 
|  | any enclosing class, are evaluated by capturing ``this`` just like a | 
|  | normal variable of C pointer type. | 
|  |  | 
|  | Member variables that are Blocks may not be overloaded by the types of | 
|  | their arguments. |