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 | |