Michael Gottesman | 822dd4c | 2012-12-19 18:41:09 +0000 | [diff] [blame] | 1 | |
| 2 | .. role:: block-term |
| 3 | |
| 4 | ================================= |
| 5 | Language Specification for Blocks |
| 6 | ================================= |
| 7 | |
| 8 | .. contents:: |
| 9 | :local: |
| 10 | |
| 11 | Revisions |
| 12 | ========= |
| 13 | |
Michael Gottesman | 3714e75 | 2012-12-20 03:23:49 +0000 | [diff] [blame] | 14 | - 2008/2/25 --- created |
Dmitri Gribenko | 7b00b84 | 2012-12-20 20:51:59 +0000 | [diff] [blame] | 15 | - 2008/7/28 --- revised, ``__block`` syntax |
Michael Gottesman | 3714e75 | 2012-12-20 03:23:49 +0000 | [diff] [blame] | 16 | - 2008/8/13 --- revised, Block globals |
| 17 | - 2008/8/21 --- revised, C++ elaboration |
Dmitri Gribenko | 7b00b84 | 2012-12-20 20:51:59 +0000 | [diff] [blame] | 18 | - 2008/11/1 --- revised, ``__weak`` support |
Michael Gottesman | 3714e75 | 2012-12-20 03:23:49 +0000 | [diff] [blame] | 19 | - 2009/1/12 --- revised, explicit return types |
Dmitri Gribenko | 7b00b84 | 2012-12-20 20:51:59 +0000 | [diff] [blame] | 20 | - 2009/2/10 --- revised, ``__block`` objects need retain |
Michael Gottesman | 822dd4c | 2012-12-19 18:41:09 +0000 | [diff] [blame] | 21 | |
| 22 | Overview |
| 23 | ======== |
| 24 | |
| 25 | A new derived type is introduced to C and, by extension, Objective-C, |
| 26 | C++, and Objective-C++ |
| 27 | |
| 28 | The Block Type |
| 29 | ============== |
| 30 | |
| 31 | Like function types, the :block-term:`Block type` is a pair consisting |
| 32 | of a result value type and a list of parameter types very similar to a |
| 33 | function type. Blocks are intended to be used much like functions with |
| 34 | the key distinction being that in addition to executable code they |
| 35 | also contain various variable bindings to automatic (stack) or managed |
| 36 | (heap) memory. |
| 37 | |
| 38 | The abstract declarator, |
| 39 | |
| 40 | .. code-block:: c |
| 41 | |
| 42 | int (^)(char, float) |
| 43 | |
| 44 | describes a reference to a Block that, when invoked, takes two |
| 45 | parameters, the first of type char and the second of type float, and |
| 46 | returns a value of type int. The Block referenced is of opaque data |
| 47 | that may reside in automatic (stack) memory, global memory, or heap |
| 48 | memory. |
| 49 | |
| 50 | Block Variable Declarations |
| 51 | =========================== |
| 52 | |
| 53 | A :block-term:`variable with Block type` is declared using function |
| 54 | pointer style notation substituting ``^`` for ``*``. The following are |
| 55 | valid Block variable declarations: |
| 56 | |
| 57 | .. code-block:: c |
| 58 | |
| 59 | void (^blockReturningVoidWithVoidArgument)(void); |
| 60 | int (^blockReturningIntWithIntAndCharArguments)(int, char); |
| 61 | void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); |
| 62 | |
| 63 | Variadic ``...`` arguments are supported. [variadic.c] A Block that |
| 64 | takes no arguments must specify void in the argument list [voidarg.c]. |
| 65 | An empty parameter list does not represent, as K&R provide, an |
| 66 | unspecified argument list. Note: both gcc and clang support K&R style |
| 67 | as a convenience. |
| 68 | |
| 69 | A Block reference may be cast to a pointer of arbitrary type and vice |
| 70 | versa. [cast.c] A Block reference may not be dereferenced via the |
| 71 | pointer dereference operator ``*``, and thus a Block's size may not be |
| 72 | computed at compile time. [sizeof.c] |
| 73 | |
| 74 | Block Literal Expressions |
| 75 | ========================= |
| 76 | |
| 77 | A :block-term:`Block literal expression` produces a reference to a |
| 78 | Block. It is introduced by the use of the ``^`` token as a unary |
| 79 | operator. |
| 80 | |
| 81 | .. code-block:: c |
| 82 | |
| 83 | Block_literal_expression ::= ^ block_decl compound_statement_body |
Michael Gottesman | 0e704ed | 2012-12-19 18:42:42 +0000 | [diff] [blame] | 84 | block_decl ::= |
Michael Gottesman | 822dd4c | 2012-12-19 18:41:09 +0000 | [diff] [blame] | 85 | block_decl ::= parameter_list |
| 86 | block_decl ::= type_expression |
| 87 | |
| 88 | where type expression is extended to allow ``^`` as a Block reference |
| 89 | (pointer) where ``*`` is allowed as a function reference (pointer). |
| 90 | |
| 91 | The following Block literal: |
| 92 | |
| 93 | .. code-block:: c |
| 94 | |
| 95 | ^ void (void) { printf("hello world\n"); } |
| 96 | |
| 97 | produces a reference to a Block with no arguments with no return value. |
| 98 | |
| 99 | The return type is optional and is inferred from the return |
| 100 | statements. If the return statements return a value, they all must |
| 101 | return a value of the same type. If there is no value returned the |
| 102 | inferred type of the Block is void; otherwise it is the type of the |
| 103 | return statement value. |
| 104 | |
| 105 | If the return type is omitted and the argument list is ``( void )``, |
| 106 | the ``( void )`` argument list may also be omitted. |
| 107 | |
| 108 | So: |
| 109 | |
| 110 | .. code-block:: c |
| 111 | |
| 112 | ^ ( void ) { printf("hello world\n"); } |
| 113 | |
| 114 | and: |
| 115 | |
| 116 | .. code-block:: c |
| 117 | |
| 118 | ^ { printf("hello world\n"); } |
| 119 | |
| 120 | are exactly equivalent constructs for the same expression. |
| 121 | |
| 122 | The type_expression extends C expression parsing to accommodate Block |
| 123 | reference declarations as it accommodates function pointer |
| 124 | declarations. |
| 125 | |
| 126 | Given: |
| 127 | |
| 128 | .. code-block:: c |
| 129 | |
| 130 | typedef int (*pointerToFunctionThatReturnsIntWithCharArg)(char); |
| 131 | pointerToFunctionThatReturnsIntWithCharArg functionPointer; |
| 132 | ^ pointerToFunctionThatReturnsIntWithCharArg (float x) { return functionPointer; } |
| 133 | |
| 134 | and: |
| 135 | |
| 136 | .. code-block:: c |
| 137 | |
| 138 | ^ int ((*)(float x))(char) { return functionPointer; } |
| 139 | |
| 140 | are equivalent expressions, as is: |
| 141 | |
| 142 | .. code-block:: c |
| 143 | |
| 144 | ^(float x) { return functionPointer; } |
| 145 | |
| 146 | [returnfunctionptr.c] |
| 147 | |
| 148 | The compound statement body establishes a new lexical scope within |
| 149 | that of its parent. Variables used within the scope of the compound |
| 150 | statement are bound to the Block in the normal manner with the |
| 151 | exception of those in automatic (stack) storage. Thus one may access |
| 152 | functions and global variables as one would expect, as well as static |
| 153 | local variables. [testme] |
| 154 | |
| 155 | Local automatic (stack) variables referenced within the compound |
| 156 | statement of a Block are imported and captured by the Block as const |
| 157 | copies. The capture (binding) is performed at the time of the Block |
| 158 | literal expression evaluation. |
| 159 | |
| 160 | The compiler is not required to capture a variable if it can prove |
| 161 | that no references to the variable will actually be evaluated. |
| 162 | Programmers can force a variable to be captured by referencing it in a |
| 163 | statement at the beginning of the Block, like so: |
| 164 | |
| 165 | .. code-block:: c |
| 166 | |
| 167 | (void) foo; |
| 168 | |
| 169 | This matters when capturing the variable has side-effects, as it can |
| 170 | in Objective-C or C++. |
| 171 | |
| 172 | The lifetime of variables declared in a Block is that of a function; |
| 173 | each activation frame contains a new copy of variables declared within |
| 174 | the local scope of the Block. Such variable declarations should be |
| 175 | allowed anywhere [testme] rather than only when C99 parsing is |
| 176 | requested, including for statements. [testme] |
| 177 | |
| 178 | Block literal expressions may occur within Block literal expressions |
| 179 | (nest) and all variables captured by any nested blocks are implicitly |
| 180 | also captured in the scopes of their enclosing Blocks. |
| 181 | |
| 182 | A Block literal expression may be used as the initialization value for |
| 183 | Block variables at global or local static scope. |
| 184 | |
| 185 | The Invoke Operator |
| 186 | =================== |
| 187 | |
| 188 | Blocks are :block-term:`invoked` using function call syntax with a |
| 189 | list of expression parameters of types corresponding to the |
| 190 | declaration and returning a result type also according to the |
| 191 | declaration. Given: |
| 192 | |
| 193 | .. code-block:: c |
| 194 | |
| 195 | int (^x)(char); |
| 196 | void (^z)(void); |
| 197 | int (^(*y))(char) = &x; |
| 198 | |
| 199 | the following are all legal Block invocations: |
| 200 | |
| 201 | .. code-block:: c |
| 202 | |
| 203 | x('a'); |
| 204 | (*y)('a'); |
| 205 | (true ? x : *y)('a') |
| 206 | |
| 207 | The Copy and Release Operations |
| 208 | =============================== |
| 209 | |
| 210 | The compiler and runtime provide :block-term:`copy` and |
| 211 | :block-term:`release` operations for Block references that create and, |
| 212 | in matched use, release allocated storage for referenced Blocks. |
| 213 | |
| 214 | The copy operation ``Block_copy()`` is styled as a function that takes |
| 215 | an arbitrary Block reference and returns a Block reference of the same |
| 216 | type. The release operation, ``Block_release()``, is styled as a |
| 217 | function that takes an arbitrary Block reference and, if dynamically |
| 218 | matched to a Block copy operation, allows recovery of the referenced |
| 219 | allocated memory. |
| 220 | |
| 221 | |
| 222 | The ``__block`` Storage Qualifier |
| 223 | ================================= |
| 224 | |
| 225 | In addition to the new Block type we also introduce a new storage |
| 226 | qualifier, :block-term:`__block`, for local variables. [testme: a |
| 227 | __block declaration within a block literal] The ``__block`` storage |
| 228 | qualifier is mutually exclusive to the existing local storage |
| 229 | qualifiers auto, register, and static. [testme] Variables qualified by |
| 230 | ``__block`` act as if they were in allocated storage and this storage |
| 231 | is automatically recovered after last use of said variable. An |
| 232 | implementation may choose an optimization where the storage is |
| 233 | initially automatic and only "moved" to allocated (heap) storage upon |
| 234 | a Block_copy of a referencing Block. Such variables may be mutated as |
| 235 | normal variables are. |
| 236 | |
| 237 | In the case where a ``__block`` variable is a Block one must assume |
| 238 | that the ``__block`` variable resides in allocated storage and as such |
| 239 | is assumed to reference a Block that is also in allocated storage |
| 240 | (that it is the result of a ``Block_copy`` operation). Despite this |
| 241 | there is no provision to do a ``Block_copy`` or a ``Block_release`` if |
| 242 | an implementation provides initial automatic storage for Blocks. This |
| 243 | is due to the inherent race condition of potentially several threads |
| 244 | trying to update the shared variable and the need for synchronization |
| 245 | around disposing of older values and copying new ones. Such |
| 246 | synchronization is beyond the scope of this language specification. |
| 247 | |
| 248 | |
| 249 | Control Flow |
| 250 | ============ |
| 251 | |
| 252 | The compound statement of a Block is treated much like a function body |
| 253 | with respect to control flow in that goto, break, and continue do not |
| 254 | escape the Block. Exceptions are treated *normally* in that when |
| 255 | thrown they pop stack frames until a catch clause is found. |
| 256 | |
| 257 | |
| 258 | Objective-C Extensions |
| 259 | ====================== |
| 260 | |
| 261 | Objective-C extends the definition of a Block reference type to be |
| 262 | that also of id. A variable or expression of Block type may be |
| 263 | messaged or used as a parameter wherever an id may be. The converse is |
| 264 | also true. Block references may thus appear as properties and are |
| 265 | subject to the assign, retain, and copy attribute logic that is |
| 266 | reserved for objects. |
| 267 | |
| 268 | All Blocks are constructed to be Objective-C objects regardless of |
| 269 | whether the Objective-C runtime is operational in the program or |
| 270 | not. Blocks using automatic (stack) memory are objects and may be |
| 271 | messaged, although they may not be assigned into ``__weak`` locations |
| 272 | if garbage collection is enabled. |
| 273 | |
| 274 | Within a Block literal expression within a method definition |
| 275 | references to instance variables are also imported into the lexical |
| 276 | scope of the compound statement. These variables are implicitly |
| 277 | qualified as references from self, and so self is imported as a const |
| 278 | copy. The net effect is that instance variables can be mutated. |
| 279 | |
| 280 | The :block-term:`Block_copy` operator retains all objects held in |
| 281 | variables of automatic storage referenced within the Block expression |
| 282 | (or form strong references if running under garbage collection). |
| 283 | Object variables of ``__block`` storage type are assumed to hold |
| 284 | normal pointers with no provision for retain and release messages. |
| 285 | |
Dmitri Gribenko | 7b00b84 | 2012-12-20 20:51:59 +0000 | [diff] [blame] | 286 | Foundation defines (and supplies) ``-copy`` and ``-release`` methods for |
Michael Gottesman | 822dd4c | 2012-12-19 18:41:09 +0000 | [diff] [blame] | 287 | Blocks. |
| 288 | |
| 289 | In the Objective-C and Objective-C++ languages, we allow the |
| 290 | ``__weak`` specifier for ``__block`` variables of object type. If |
| 291 | garbage collection is not enabled, this qualifier causes these |
| 292 | variables to be kept without retain messages being sent. This |
| 293 | knowingly leads to dangling pointers if the Block (or a copy) outlives |
| 294 | the lifetime of this object. |
| 295 | |
| 296 | In garbage collected environments, the ``__weak`` variable is set to |
| 297 | nil when the object it references is collected, as long as the |
| 298 | ``__block`` variable resides in the heap (either by default or via |
| 299 | ``Block_copy()``). The initial Apple implementation does in fact |
| 300 | start ``__block`` variables on the stack and migrate them to the heap |
| 301 | only as a result of a ``Block_copy()`` operation. |
| 302 | |
| 303 | It is a runtime error to attempt to assign a reference to a |
| 304 | stack-based Block into any storage marked ``__weak``, including |
| 305 | ``__weak`` ``__block`` variables. |
| 306 | |
| 307 | |
| 308 | C++ Extensions |
| 309 | ============== |
| 310 | |
| 311 | Block literal expressions within functions are extended to allow const |
| 312 | use of C++ objects, pointers, or references held in automatic storage. |
| 313 | |
| 314 | As usual, within the block, references to captured variables become |
| 315 | const-qualified, as if they were references to members of a const |
| 316 | object. Note that this does not change the type of a variable of |
| 317 | reference type. |
| 318 | |
| 319 | For example, given a class Foo: |
| 320 | |
| 321 | .. code-block:: c |
| 322 | |
| 323 | Foo foo; |
| 324 | Foo &fooRef = foo; |
| 325 | Foo *fooPtr = &foo; |
| 326 | |
| 327 | A Block that referenced these variables would import the variables as |
| 328 | const variations: |
| 329 | |
| 330 | .. code-block:: c |
| 331 | |
| 332 | const Foo block_foo = foo; |
| 333 | Foo &block_fooRef = fooRef; |
| 334 | Foo *const block_fooPtr = fooPtr; |
| 335 | |
| 336 | Captured variables are copied into the Block at the instant of |
| 337 | evaluating the Block literal expression. They are also copied when |
| 338 | calling ``Block_copy()`` on a Block allocated on the stack. In both |
| 339 | cases, they are copied as if the variable were const-qualified, and |
| 340 | it's an error if there's no such constructor. |
| 341 | |
| 342 | Captured variables in Blocks on the stack are destroyed when control |
| 343 | leaves the compound statement that contains the Block literal |
| 344 | expression. Captured variables in Blocks on the heap are destroyed |
| 345 | when the reference count of the Block drops to zero. |
| 346 | |
| 347 | Variables declared as residing in ``__block`` storage may be initially |
| 348 | allocated in the heap or may first appear on the stack and be copied |
| 349 | to the heap as a result of a ``Block_copy()`` operation. When copied |
| 350 | from the stack, ``__block`` variables are copied using their normal |
| 351 | qualification (i.e. without adding const). In C++11, ``__block`` |
| 352 | variables are copied as x-values if that is possible, then as l-values |
| 353 | if not; if both fail, it's an error. The destructor for any initial |
| 354 | stack-based version is called at the variable's normal end of scope. |
| 355 | |
| 356 | References to ``this``, as well as references to non-static members of |
| 357 | any enclosing class, are evaluated by capturing ``this`` just like a |
| 358 | normal variable of C pointer type. |
| 359 | |
| 360 | Member variables that are Blocks may not be overloaded by the types of |
| 361 | their arguments. |