1 2 .. role:: block-term 3 4 ================================= 5 Language Specification for Blocks 6 ================================= 7 8 .. contents:: 9 :local: 10 11 Revisions 12 ========= 13 14 - 2008/2/25 --- created 15 - 2008/7/28 --- revised, ``__block`` syntax 16 - 2008/8/13 --- revised, Block globals 17 - 2008/8/21 --- revised, C++ elaboration 18 - 2008/11/1 --- revised, ``__weak`` support 19 - 2009/1/12 --- revised, explicit return types 20 - 2009/2/10 --- revised, ``__block`` objects need retain 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 84 block_decl ::= 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 286 Foundation defines (and supplies) ``-copy`` and ``-release`` methods for 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. 362