Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: tool/input_sdk/lib/async/zone.dart

Issue 1953153002: Update dart:async to match the Dart repo. (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.async; 5 part of dart.async;
6 6
7 typedef dynamic ZoneCallback(); 7 typedef R ZoneCallback<R>();
8 typedef dynamic ZoneUnaryCallback(arg); 8 typedef R ZoneUnaryCallback<R, T>(T arg);
9 typedef dynamic ZoneBinaryCallback(arg1, arg2); 9 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
10 10
11 typedef dynamic HandleUncaughtErrorHandler( 11 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic
12 // functions.
13 /*ABUSE*/
14 typedef R HandleUncaughtErrorHandler<R>(
12 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace); 15 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace);
13 typedef dynamic RunHandler(Zone self, ZoneDelegate parent, Zone zone, f()); 16 /*ABUSE*/
14 typedef dynamic RunUnaryHandler( 17 typedef R RunHandler<R>(Zone self, ZoneDelegate parent, Zone zone, R f());
15 Zone self, ZoneDelegate parent, Zone zone, f(arg), arg); 18 /*ABUSE*/
16 typedef dynamic RunBinaryHandler( 19 typedef R RunUnaryHandler<R, T>(
17 Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2), arg1, arg2); 20 Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg);
18 typedef ZoneCallback RegisterCallbackHandler( 21 /*ABUSE*/
19 Zone self, ZoneDelegate parent, Zone zone, f()); 22 typedef R RunBinaryHandler<R, T1, T2>(
20 typedef ZoneUnaryCallback RegisterUnaryCallbackHandler( 23 Zone self, ZoneDelegate parent, Zone zone,
21 Zone self, ZoneDelegate parent, Zone zone, f(arg)); 24 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
22 typedef ZoneBinaryCallback RegisterBinaryCallbackHandler( 25 /*ABUSE*/
23 Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)); 26 typedef ZoneCallback<R> RegisterCallbackHandler<R>(
27 Zone self, ZoneDelegate parent, Zone zone, R f());
28 /*ABUSE*/
29 typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>(
30 Zone self, ZoneDelegate parent, Zone zone, R f(T arg));
31 /*ABUSE*/
32 typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>(
33 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2));
24 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent, 34 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
25 Zone zone, Object error, StackTrace stackTrace); 35 Zone zone, Object error, StackTrace stackTrace);
26 typedef void ScheduleMicrotaskHandler( 36 typedef void ScheduleMicrotaskHandler(
27 Zone self, ZoneDelegate parent, Zone zone, f()); 37 Zone self, ZoneDelegate parent, Zone zone, void f());
28 typedef Timer CreateTimerHandler( 38 typedef Timer CreateTimerHandler(
29 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()); 39 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f());
30 typedef Timer CreatePeriodicTimerHandler( 40 typedef Timer CreatePeriodicTimerHandler(
31 Zone self, ZoneDelegate parent, Zone zone, 41 Zone self, ZoneDelegate parent, Zone zone,
32 Duration period, void f(Timer timer)); 42 Duration period, void f(Timer timer));
33 typedef void PrintHandler( 43 typedef void PrintHandler(
34 Zone self, ZoneDelegate parent, Zone zone, String line); 44 Zone self, ZoneDelegate parent, Zone zone, String line);
35 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone, 45 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
36 ZoneSpecification specification, 46 ZoneSpecification specification,
37 Map zoneValues); 47 Map zoneValues);
38 48
39 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */ 49 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
40 class AsyncError implements Error { 50 class AsyncError implements Error {
41 final error; 51 final Object error;
42 final StackTrace stackTrace; 52 final StackTrace stackTrace;
43 53
44 AsyncError(this.error, this.stackTrace); 54 AsyncError(this.error, this.stackTrace);
45 55
46 String toString() => error.toString(); 56 String toString() => '$error';
47 } 57 }
48 58
49 59
50 class _ZoneFunction { 60 class _ZoneFunction<T extends Function> {
51 final _Zone zone; 61 final _Zone zone;
52 final Function function; 62 final T function;
53 const _ZoneFunction(this.zone, this.function); 63 const _ZoneFunction(this.zone, this.function);
54 } 64 }
55 65
56 /** 66 /**
57 * This class provides the specification for a forked zone. 67 * This class provides the specification for a forked zone.
58 * 68 *
59 * When forking a new zone (see [Zone.fork]) one can override the default 69 * When forking a new zone (see [Zone.fork]) one can override the default
60 * behavior of the zone by providing callbacks. These callbacks must be 70 * behavior of the zone by providing callbacks. These callbacks must be
61 * given in an instance of this class. 71 * given in an instance of this class.
62 * 72 *
63 * Handlers have the same signature as the same-named methods on [Zone] but 73 * Handlers have the same signature as the same-named methods on [Zone] but
64 * receive three additional arguments: 74 * receive three additional arguments:
65 * 75 *
66 * 1. the zone the handlers are attached to (the "self" zone). 76 * 1. the zone the handlers are attached to (the "self" zone).
67 * 2. a [ZoneDelegate] to the parent zone. 77 * 2. a [ZoneDelegate] to the parent zone.
68 * 3. the zone that first received the request (before the request was 78 * 3. the zone that first received the request (before the request was
69 * bubbled up). 79 * bubbled up).
70 * 80 *
71 * Handlers can either stop propagation the request (by simply not calling the 81 * Handlers can either stop propagation the request (by simply not calling the
72 * parent handler), or forward to the parent zone, potentially modifying the 82 * parent handler), or forward to the parent zone, potentially modifying the
73 * arguments on the way. 83 * arguments on the way.
74 */ 84 */
75 abstract class ZoneSpecification { 85 abstract class ZoneSpecification {
76 /** 86 /**
77 * Creates a specification with the provided handlers. 87 * Creates a specification with the provided handlers.
78 */ 88 */
79 const factory ZoneSpecification({ 89 const factory ZoneSpecification({
80 dynamic handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone, 90 HandleUncaughtErrorHandler handleUncaughtError,
81 error, StackTrace stackTrace), 91 RunHandler run,
82 dynamic run(Zone self, ZoneDelegate parent, Zone zone, f()), 92 RunUnaryHandler runUnary,
83 dynamic runUnary( 93 RunBinaryHandler runBinary,
84 Zone self, ZoneDelegate parent, Zone zone, f(arg), arg), 94 RegisterCallbackHandler registerCallback,
85 dynamic runBinary(Zone self, ZoneDelegate parent, Zone zone, 95 RegisterUnaryCallbackHandler registerUnaryCallback,
86 f(arg1, arg2), arg1, arg2), 96 RegisterBinaryCallbackHandler registerBinaryCallback,
87 ZoneCallback registerCallback( 97 ErrorCallbackHandler errorCallback,
88 Zone self, ZoneDelegate parent, Zone zone, f()), 98 ScheduleMicrotaskHandler scheduleMicrotask,
89 ZoneUnaryCallback registerUnaryCallback( 99 CreateTimerHandler createTimer,
90 Zone self, ZoneDelegate parent, Zone zone, f(arg)), 100 CreatePeriodicTimerHandler createPeriodicTimer,
91 ZoneBinaryCallback registerBinaryCallback( 101 PrintHandler print,
92 Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)), 102 ForkHandler fork
93 AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
94 Object error, StackTrace stackTrace),
95 void scheduleMicrotask(
96 Zone self, ZoneDelegate parent, Zone zone, f()),
97 Timer createTimer(Zone self, ZoneDelegate parent, Zone zone,
98 Duration duration, void f()),
99 Timer createPeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
100 Duration period, void f(Timer timer)),
101 void print(Zone self, ZoneDelegate parent, Zone zone, String line),
102 Zone fork(Zone self, ZoneDelegate parent, Zone zone,
103 ZoneSpecification specification, Map zoneValues)
104 }) = _ZoneSpecification; 103 }) = _ZoneSpecification;
105 104
106 /** 105 /**
107 * Creates a specification from [other] with the provided handlers overriding 106 * Creates a specification from [other] with the provided handlers overriding
108 * the ones in [other]. 107 * the ones in [other].
109 */ 108 */
110 factory ZoneSpecification.from(ZoneSpecification other, { 109 factory ZoneSpecification.from(ZoneSpecification other, {
111 dynamic handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone, 110 HandleUncaughtErrorHandler handleUncaughtError: null,
112 error, StackTrace stackTrace): null, 111 RunHandler run: null,
113 dynamic run(Zone self, ZoneDelegate parent, Zone zone, f()): null, 112 RunUnaryHandler runUnary: null,
114 dynamic runUnary( 113 RunBinaryHandler runBinary: null,
115 Zone self, ZoneDelegate parent, Zone zone, f(arg), arg): null, 114 RegisterCallbackHandler registerCallback: null,
116 dynamic runBinary(Zone self, ZoneDelegate parent, Zone zone, 115 RegisterUnaryCallbackHandler registerUnaryCallback: null,
117 f(arg1, arg2), arg1, arg2): null, 116 RegisterBinaryCallbackHandler registerBinaryCallback: null,
118 ZoneCallback registerCallback( 117 ErrorCallbackHandler errorCallback: null,
119 Zone self, ZoneDelegate parent, Zone zone, f()): null, 118 ScheduleMicrotaskHandler scheduleMicrotask: null,
120 ZoneUnaryCallback registerUnaryCallback( 119 CreateTimerHandler createTimer: null,
121 Zone self, ZoneDelegate parent, Zone zone, f(arg)): null, 120 CreatePeriodicTimerHandler createPeriodicTimer: null,
122 ZoneBinaryCallback registerBinaryCallback( 121 PrintHandler print: null,
123 Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)): null, 122 ForkHandler fork: null
124 AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
125 Object error, StackTrace stackTrace),
126 void scheduleMicrotask(
127 Zone self, ZoneDelegate parent, Zone zone, f()): null,
128 Timer createTimer(Zone self, ZoneDelegate parent, Zone zone,
129 Duration duration, void f()): null,
130 Timer createPeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
131 Duration period, void f(Timer timer)): null,
132 void print(Zone self, ZoneDelegate parent, Zone zone, String line): null,
133 Zone fork(Zone self, ZoneDelegate parent, Zone zone,
134 ZoneSpecification specification,
135 Map zoneValues): null
136 }) { 123 }) {
137 return new ZoneSpecification( 124 return new ZoneSpecification(
138 handleUncaughtError: handleUncaughtError != null 125 handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError,
139 ? handleUncaughtError 126 run: run ?? other.run,
140 : other.handleUncaughtError, 127 runUnary: runUnary ?? other.runUnary,
141 run: run != null ? run : other.run, 128 runBinary: runBinary ?? other.runBinary,
142 runUnary: runUnary != null ? runUnary : other.runUnary, 129 registerCallback: registerCallback ?? other.registerCallback,
143 runBinary: runBinary != null ? runBinary : other.runBinary, 130 registerUnaryCallback: registerUnaryCallback ??
144 registerCallback: registerCallback != null 131 other.registerUnaryCallback,
145 ? registerCallback 132 registerBinaryCallback: registerBinaryCallback ??
146 : other.registerCallback, 133 other.registerBinaryCallback,
147 registerUnaryCallback: registerUnaryCallback != null 134 errorCallback: errorCallback ?? other.errorCallback,
148 ? registerUnaryCallback 135 scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask,
149 : other.registerUnaryCallback, 136 createTimer : createTimer ?? other.createTimer,
150 registerBinaryCallback: registerBinaryCallback != null 137 createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer,
151 ? registerBinaryCallback 138 print : print ?? other.print,
152 : other.registerBinaryCallback, 139 fork: fork ?? other.fork);
153 errorCallback: errorCallback != null
154 ? errorCallback
155 : other.errorCallback,
156 scheduleMicrotask: scheduleMicrotask != null
157 ? scheduleMicrotask
158 : other.scheduleMicrotask,
159 createTimer : createTimer != null ? createTimer : other.createTimer,
160 createPeriodicTimer: createPeriodicTimer != null
161 ? createPeriodicTimer
162 : other.createPeriodicTimer,
163 print : print != null ? print : other.print,
164 fork: fork != null ? fork : other.fork);
165 } 140 }
166 141
167 HandleUncaughtErrorHandler get handleUncaughtError; 142 HandleUncaughtErrorHandler get handleUncaughtError;
168 RunHandler get run; 143 RunHandler get run;
169 RunUnaryHandler get runUnary; 144 RunUnaryHandler get runUnary;
170 RunBinaryHandler get runBinary; 145 RunBinaryHandler get runBinary;
171 RegisterCallbackHandler get registerCallback; 146 RegisterCallbackHandler get registerCallback;
172 RegisterUnaryCallbackHandler get registerUnaryCallback; 147 RegisterUnaryCallbackHandler get registerUnaryCallback;
173 RegisterBinaryCallbackHandler get registerBinaryCallback; 148 RegisterBinaryCallbackHandler get registerBinaryCallback;
174 ErrorCallbackHandler get errorCallback; 149 ErrorCallbackHandler get errorCallback;
(...skipping 21 matching lines...) Expand all
196 this.registerUnaryCallback: null, 171 this.registerUnaryCallback: null,
197 this.registerBinaryCallback: null, 172 this.registerBinaryCallback: null,
198 this.errorCallback: null, 173 this.errorCallback: null,
199 this.scheduleMicrotask: null, 174 this.scheduleMicrotask: null,
200 this.createTimer: null, 175 this.createTimer: null,
201 this.createPeriodicTimer: null, 176 this.createPeriodicTimer: null,
202 this.print: null, 177 this.print: null,
203 this.fork: null 178 this.fork: null
204 }); 179 });
205 180
206 // TODO(13406): Enable types when dart2js supports it. 181 final HandleUncaughtErrorHandler handleUncaughtError;
207 final /*HandleUncaughtErrorHandler*/ handleUncaughtError; 182 final RunHandler run;
208 final /*RunHandler*/ run; 183 final RunUnaryHandler runUnary;
209 final /*RunUnaryHandler*/ runUnary; 184 final RunBinaryHandler runBinary;
210 final /*RunBinaryHandler*/ runBinary; 185 final RegisterCallbackHandler registerCallback;
211 final /*RegisterCallbackHandler*/ registerCallback; 186 final RegisterUnaryCallbackHandler registerUnaryCallback;
212 final /*RegisterUnaryCallbackHandler*/ registerUnaryCallback; 187 final RegisterBinaryCallbackHandler registerBinaryCallback;
213 final /*RegisterBinaryCallbackHandler*/ registerBinaryCallback; 188 final ErrorCallbackHandler errorCallback;
214 final /*ErrorCallbackHandler*/ errorCallback; 189 final ScheduleMicrotaskHandler scheduleMicrotask;
215 final /*ScheduleMicrotaskHandler*/ scheduleMicrotask; 190 final CreateTimerHandler createTimer;
216 final /*CreateTimerHandler*/ createTimer; 191 final CreatePeriodicTimerHandler createPeriodicTimer;
217 final /*CreatePeriodicTimerHandler*/ createPeriodicTimer; 192 final PrintHandler print;
218 final /*PrintHandler*/ print; 193 final ForkHandler fork;
219 final /*ForkHandler*/ fork;
220 } 194 }
221 195
222 /** 196 /**
223 * This class wraps zones for delegation. 197 * This class wraps zones for delegation.
224 * 198 *
225 * When forwarding to parent zones one can't just invoke the parent zone's 199 * When forwarding to parent zones one can't just invoke the parent zone's
226 * exposed functions (like [Zone.run]), but one needs to provide more 200 * exposed functions (like [Zone.run]), but one needs to provide more
227 * information (like the zone the `run` was initiated). Zone callbacks thus 201 * information (like the zone the `run` was initiated). Zone callbacks thus
228 * receive more information including this [ZoneDelegate] class. When delegating 202 * receive more information including this [ZoneDelegate] class. When delegating
229 * to the parent zone one should go through the given instance instead of 203 * to the parent zone one should go through the given instance instead of
230 * directly invoking the parent zone. 204 * directly invoking the parent zone.
231 */ 205 */
232 abstract class ZoneDelegate { 206 abstract class ZoneDelegate {
233 dynamic handleUncaughtError(Zone zone, error, StackTrace stackTrace); 207 /*=R*/ handleUncaughtError/*<R>*/(
234 dynamic run(Zone zone, f()); 208 Zone zone, error, StackTrace stackTrace);
235 dynamic runUnary(Zone zone, f(arg), arg); 209 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f());
236 dynamic runBinary(Zone zone, f(arg1, arg2), arg1, arg2); 210 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg);
237 ZoneCallback registerCallback(Zone zone, f()); 211 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone,
238 ZoneUnaryCallback registerUnaryCallback(Zone zone, f(arg)); 212 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
239 ZoneBinaryCallback registerBinaryCallback(Zone zone, f(arg1, arg2)); 213 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f());
214 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
215 Zone zone, /*=R*/ f(/*=T*/ arg));
216 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
217 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2));
240 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); 218 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
241 void scheduleMicrotask(Zone zone, f()); 219 void scheduleMicrotask(Zone zone, void f());
242 Timer createTimer(Zone zone, Duration duration, void f()); 220 Timer createTimer(Zone zone, Duration duration, void f());
243 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); 221 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
244 void print(Zone zone, String line); 222 void print(Zone zone, String line);
245 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); 223 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
246 } 224 }
247 225
248 /** 226 /**
249 * A Zone represents the asynchronous version of a dynamic extent. Asynchronous 227 * A Zone represents the asynchronous version of a dynamic extent. Asynchronous
250 * callbacks are executed in the zone they have been queued in. For example, 228 * callbacks are executed in the zone they have been queued in. For example,
251 * the callback of a `future.then` is executed in the same zone as the one where 229 * the callback of a `future.then` is executed in the same zone as the one where
252 * the `then` was invoked. 230 * the `then` was invoked.
253 */ 231 */
254 abstract class Zone { 232 abstract class Zone {
255 // Private constructor so that it is not possible instantiate a Zone class. 233 // Private constructor so that it is not possible instantiate a Zone class.
256 Zone._(); 234 Zone._();
257 235
258 /** The root zone that is implicitly created. */ 236 /** The root zone that is implicitly created. */
259 static const Zone ROOT = _ROOT_ZONE; 237 static const Zone ROOT = _ROOT_ZONE;
260 238
261 /** The currently running zone. */ 239 /** The currently running zone. */
262 static Zone _current = _ROOT_ZONE; 240 static Zone _current = _ROOT_ZONE;
263 241
264 static Zone get current => _current; 242 static Zone get current => _current;
265 243
266 dynamic handleUncaughtError(error, StackTrace stackTrace); 244 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace);
267 245
268 /** 246 /**
269 * Returns the parent zone. 247 * Returns the parent zone.
270 * 248 *
271 * Returns `null` if `this` is the [ROOT] zone. 249 * Returns `null` if `this` is the [ROOT] zone.
272 */ 250 */
273 Zone get parent; 251 Zone get parent;
274 252
275 /** 253 /**
276 * The error zone is the one that is responsible for dealing with uncaught 254 * The error zone is the one that is responsible for dealing with uncaught
(...skipping 23 matching lines...) Expand all
300 * `operator []`) as this zone, but updated with the keys and values 278 * `operator []`) as this zone, but updated with the keys and values
301 * in [zoneValues]. If a key is in both this zone's values and in 279 * in [zoneValues]. If a key is in both this zone's values and in
302 * `zoneValues`, the new zone will use the value from `zoneValues``. 280 * `zoneValues`, the new zone will use the value from `zoneValues``.
303 */ 281 */
304 Zone fork({ ZoneSpecification specification, 282 Zone fork({ ZoneSpecification specification,
305 Map zoneValues }); 283 Map zoneValues });
306 284
307 /** 285 /**
308 * Executes the given function [f] in this zone. 286 * Executes the given function [f] in this zone.
309 */ 287 */
310 dynamic run(f()); 288 /*=R*/ run/*<R>*/(/*=R*/ f());
311 289
312 /** 290 /**
313 * Executes the given callback [f] with argument [arg] in this zone. 291 * Executes the given callback [f] with argument [arg] in this zone.
314 */ 292 */
315 dynamic runUnary(f(arg), var arg); 293 /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg);
316 294
317 /** 295 /**
318 * Executes the given callback [f] with argument [arg1] and [arg2] in this 296 * Executes the given callback [f] with argument [arg1] and [arg2] in this
319 * zone. 297 * zone.
320 */ 298 */
321 dynamic runBinary(f(arg1, arg2), var arg1, var arg2); 299 /*=R*/ runBinary/*<R, T1, T2>*/(
300 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
322 301
323 /** 302 /**
324 * Executes the given function [f] in this zone. 303 * Executes the given function [f] in this zone.
325 * 304 *
326 * Same as [run] but catches uncaught errors and gives them to 305 * Same as [run] but catches uncaught errors and gives them to
327 * [handleUncaughtError]. 306 * [handleUncaughtError].
328 */ 307 */
329 dynamic runGuarded(f()); 308 /*=R*/ runGuarded/*<R>*/(/*=R*/ f());
330 309
331 /** 310 /**
332 * Executes the given callback [f] in this zone. 311 * Executes the given callback [f] in this zone.
333 * 312 *
334 * Same as [runUnary] but catches uncaught errors and gives them to 313 * Same as [runUnary] but catches uncaught errors and gives them to
335 * [handleUncaughtError]. 314 * [handleUncaughtError].
336 */ 315 */
337 dynamic runUnaryGuarded(f(arg), var arg); 316 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg);
338 317
339 /** 318 /**
340 * Executes the given callback [f] in this zone. 319 * Executes the given callback [f] in this zone.
341 * 320 *
342 * Same as [runBinary] but catches uncaught errors and gives them to 321 * Same as [runBinary] but catches uncaught errors and gives them to
343 * [handleUncaughtError]. 322 * [handleUncaughtError].
344 */ 323 */
345 dynamic runBinaryGuarded(f(arg1, arg2), var arg1, var arg2); 324 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
325 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
346 326
347 /** 327 /**
348 * Registers the given callback in this zone. 328 * Registers the given callback in this zone.
349 * 329 *
350 * It is good practice to register asynchronous or delayed callbacks before 330 * It is good practice to register asynchronous or delayed callbacks before
351 * invoking [run]. This gives the zone a chance to wrap the callback and 331 * invoking [run]. This gives the zone a chance to wrap the callback and
352 * to store information with the callback. For example, a zone may decide 332 * to store information with the callback. For example, a zone may decide
353 * to store the stack trace (at the time of the registration) with the 333 * to store the stack trace (at the time of the registration) with the
354 * callback. 334 * callback.
355 * 335 *
356 * Returns a potentially new callback that should be used in place of the 336 * Returns a potentially new callback that should be used in place of the
357 * given [callback]. 337 * given [callback].
358 */ 338 */
359 ZoneCallback registerCallback(callback()); 339 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback());
360 340
361 /** 341 /**
362 * Registers the given callback in this zone. 342 * Registers the given callback in this zone.
363 * 343 *
364 * Similar to [registerCallback] but with a unary callback. 344 * Similar to [registerCallback] but with a unary callback.
365 */ 345 */
366 ZoneUnaryCallback registerUnaryCallback(callback(arg)); 346 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
347 /*=R*/ callback(/*=T*/ arg));
367 348
368 /** 349 /**
369 * Registers the given callback in this zone. 350 * Registers the given callback in this zone.
370 * 351 *
371 * Similar to [registerCallback] but with a unary callback. 352 * Similar to [registerCallback] but with a unary callback.
372 */ 353 */
373 ZoneBinaryCallback registerBinaryCallback(callback(arg1, arg2)); 354 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
355 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2));
374 356
375 /** 357 /**
376 * Equivalent to: 358 * Equivalent to:
377 * 359 *
378 * ZoneCallback registered = registerCallback(f); 360 * ZoneCallback registered = registerCallback(f);
379 * if (runGuarded) return () => this.runGuarded(registered); 361 * if (runGuarded) return () => this.runGuarded(registered);
380 * return () => this.run(registered); 362 * return () => this.run(registered);
381 * 363 *
382 */ 364 */
383 ZoneCallback bindCallback(f(), { bool runGuarded: true }); 365 ZoneCallback/*<R>*/ bindCallback/*<R>*/(
366 /*=R*/ f(), { bool runGuarded: true });
384 367
385 /** 368 /**
386 * Equivalent to: 369 * Equivalent to:
387 * 370 *
388 * ZoneCallback registered = registerUnaryCallback(f); 371 * ZoneCallback registered = registerUnaryCallback(f);
389 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg); 372 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg);
390 * return (arg) => thin.runUnary(registered, arg); 373 * return (arg) => thin.runUnary(registered, arg);
391 */ 374 */
392 ZoneUnaryCallback bindUnaryCallback(f(arg), { bool runGuarded: true }); 375 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
376 /*=R*/ f(/*=T*/ arg), { bool runGuarded: true });
393 377
394 /** 378 /**
395 * Equivalent to: 379 * Equivalent to:
396 * 380 *
397 * ZoneCallback registered = registerBinaryCallback(f); 381 * ZoneCallback registered = registerBinaryCallback(f);
398 * if (runGuarded) { 382 * if (runGuarded) {
399 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg); 383 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg);
400 * } 384 * }
401 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2); 385 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2);
402 */ 386 */
403 ZoneBinaryCallback bindBinaryCallback( 387 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
404 f(arg1, arg2), { bool runGuarded: true }); 388 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true });
405 389
406 /** 390 /**
407 * Intercepts errors when added programmtically to a `Future` or `Stream`. 391 * Intercepts errors when added programmatically to a `Future` or `Stream`.
408 * 392 *
409 * When caling [Completer.completeError], [Stream.addError], 393 * When caling [Completer.completeError], [Stream.addError],
410 * or [Future] constructors that take an error or a callback that may throw, 394 * or [Future] constructors that take an error or a callback that may throw,
411 * the current zone is allowed to intercept and replace the error. 395 * the current zone is allowed to intercept and replace the error.
412 * 396 *
413 * When other libraries use intermediate controllers or completers, such 397 * When other libraries use intermediate controllers or completers, such
414 * calls may contain errors that have already been processed. 398 * calls may contain errors that have already been processed.
415 * 399 *
416 * Return `null` if no replacement is desired. 400 * Return `null` if no replacement is desired.
417 * The original error is used unchanged in that case. 401 * The original error is used unchanged in that case.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 ZoneDelegate _parentDelegate(_Zone zone) { 465 ZoneDelegate _parentDelegate(_Zone zone) {
482 if (zone.parent == null) return null; 466 if (zone.parent == null) return null;
483 return zone.parent._delegate; 467 return zone.parent._delegate;
484 } 468 }
485 469
486 class _ZoneDelegate implements ZoneDelegate { 470 class _ZoneDelegate implements ZoneDelegate {
487 final _Zone _delegationTarget; 471 final _Zone _delegationTarget;
488 472
489 _ZoneDelegate(this._delegationTarget); 473 _ZoneDelegate(this._delegationTarget);
490 474
491 dynamic handleUncaughtError(Zone zone, error, StackTrace stackTrace) { 475 /*=R*/ handleUncaughtError/*<R>*/(
492 _ZoneFunction implementation = _delegationTarget._handleUncaughtError; 476 Zone zone, error, StackTrace stackTrace) {
477 var implementation = _delegationTarget._handleUncaughtError;
493 _Zone implZone = implementation.zone; 478 _Zone implZone = implementation.zone;
494 return (implementation.function)( 479 HandleUncaughtErrorHandler handler = implementation.function;
495 implZone, _parentDelegate(implZone), zone, error, stackTrace); 480 // TODO(floitsch): make this a generic method call on '<R>' once it's
481 // supported. Remove the unnecessary cast.
482 return handler(
483 implZone, _parentDelegate(implZone), zone, error, stackTrace)
484 as Object/*=R*/;
496 } 485 }
497 486
498 dynamic run(Zone zone, f()) { 487 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()) {
499 _ZoneFunction implementation = _delegationTarget._run; 488 var implementation = _delegationTarget._run;
500 _Zone implZone = implementation.zone; 489 _Zone implZone = implementation.zone;
501 return (implementation.function)( 490 RunHandler handler = implementation.function;
502 implZone, _parentDelegate(implZone), zone, f); 491 // TODO(floitsch): make this a generic method call on '<R>' once it's
492 // supported. Remove the unnecessary cast.
493 return handler(implZone, _parentDelegate(implZone), zone, f)
494 as Object/*=R*/;
503 } 495 }
504 496
505 dynamic runUnary(Zone zone, f(arg), arg) { 497 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
506 _ZoneFunction implementation = _delegationTarget._runUnary; 498 var implementation = _delegationTarget._runUnary;
507 _Zone implZone = implementation.zone; 499 _Zone implZone = implementation.zone;
508 return (implementation.function)( 500 RunUnaryHandler handler = implementation.function;
509 implZone, _parentDelegate(implZone), zone, f, arg); 501 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
502 // supported. Remove the unnecessary cast.
503 return handler(
504 implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/;
510 } 505 }
511 506
512 dynamic runBinary(Zone zone, f(arg1, arg2), arg1, arg2) { 507 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone,
513 _ZoneFunction implementation = _delegationTarget._runBinary; 508 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
509 var implementation = _delegationTarget._runBinary;
514 _Zone implZone = implementation.zone; 510 _Zone implZone = implementation.zone;
515 return (implementation.function)( 511 RunBinaryHandler handler = implementation.function;
516 implZone, _parentDelegate(implZone), zone, f, arg1, arg2); 512 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
513 // it's supported. Remove the unnecessary cast.
514 return handler(
515 implZone, _parentDelegate(implZone), zone, f, arg1, arg2)
516 as Object/*=R*/;
517 } 517 }
518 518
519 ZoneCallback registerCallback(Zone zone, f()) { 519 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) {
520 _ZoneFunction implementation = _delegationTarget._registerCallback; 520 var implementation = _delegationTarget._registerCallback;
521 _Zone implZone = implementation.zone; 521 _Zone implZone = implementation.zone;
522 return (implementation.function)( 522 RegisterCallbackHandler handler = implementation.function;
523 implZone, _parentDelegate(implZone), zone, f); 523 // TODO(floitsch): make this a generic method call on '<R>' once it's
524 // supported. Remove the unnecessary cast.
525 return handler(implZone, _parentDelegate(implZone), zone, f)
526 as Object/*=ZoneCallback<R>*/;
524 } 527 }
525 528
526 ZoneUnaryCallback registerUnaryCallback(Zone zone, f(arg)) { 529 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
527 _ZoneFunction implementation = _delegationTarget._registerUnaryCallback; 530 Zone zone, /*=R*/ f(/*=T*/ arg)) {
531 var implementation = _delegationTarget._registerUnaryCallback;
528 _Zone implZone = implementation.zone; 532 _Zone implZone = implementation.zone;
529 return (implementation.function)( 533 RegisterUnaryCallbackHandler handler = implementation.function;
530 implZone, _parentDelegate(implZone), zone, f); 534 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
535 // supported. Remove the unnecessary cast.
536 return handler(implZone, _parentDelegate(implZone), zone, f)
537 as Object/*=ZoneUnaryCallback<R, T>*/;
531 } 538 }
532 539
533 ZoneBinaryCallback registerBinaryCallback(Zone zone, f(arg1, arg2)) { 540 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
534 _ZoneFunction implementation = _delegationTarget._registerBinaryCallback; 541 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) {
542 var implementation = _delegationTarget._registerBinaryCallback;
535 _Zone implZone = implementation.zone; 543 _Zone implZone = implementation.zone;
536 return (implementation.function)( 544 RegisterBinaryCallbackHandler handler = implementation.function;
537 implZone, _parentDelegate(implZone), zone, f); 545 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
546 // it's supported. Remove the unnecessary cast.
547 return handler(implZone, _parentDelegate(implZone), zone, f)
548 as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
538 } 549 }
539 550
540 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { 551 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
541 _ZoneFunction implementation = _delegationTarget._errorCallback; 552 var implementation = _delegationTarget._errorCallback;
542 _Zone implZone = implementation.zone; 553 _Zone implZone = implementation.zone;
543 if (identical(implZone, _ROOT_ZONE)) return null; 554 if (identical(implZone, _ROOT_ZONE)) return null;
544 return (implementation.function)(implZone, _parentDelegate(implZone), zone, 555 ErrorCallbackHandler handler = implementation.function;
545 error, stackTrace); 556 return handler(implZone, _parentDelegate(implZone), zone,
557 error, stackTrace);
546 } 558 }
547 559
548 void scheduleMicrotask(Zone zone, f()) { 560 void scheduleMicrotask(Zone zone, f()) {
549 _ZoneFunction implementation = _delegationTarget._scheduleMicrotask; 561 var implementation = _delegationTarget._scheduleMicrotask;
550 _Zone implZone = implementation.zone; 562 _Zone implZone = implementation.zone;
551 (implementation.function)( 563 ScheduleMicrotaskHandler handler = implementation.function;
552 implZone, _parentDelegate(implZone), zone, f); 564 handler(implZone, _parentDelegate(implZone), zone, f);
553 } 565 }
554 566
555 Timer createTimer(Zone zone, Duration duration, void f()) { 567 Timer createTimer(Zone zone, Duration duration, void f()) {
556 _ZoneFunction implementation = _delegationTarget._createTimer; 568 var implementation = _delegationTarget._createTimer;
557 _Zone implZone = implementation.zone; 569 _Zone implZone = implementation.zone;
558 return (implementation.function)( 570 CreateTimerHandler handler = implementation.function;
559 implZone, _parentDelegate(implZone), zone, duration, f); 571 return handler(implZone, _parentDelegate(implZone), zone, duration, f);
560 } 572 }
561 573
562 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) { 574 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) {
563 _ZoneFunction implementation = _delegationTarget._createPeriodicTimer; 575 var implementation = _delegationTarget._createPeriodicTimer;
564 _Zone implZone = implementation.zone; 576 _Zone implZone = implementation.zone;
565 return (implementation.function)( 577 CreatePeriodicTimerHandler handler = implementation.function;
566 implZone, _parentDelegate(implZone), zone, period, f); 578 return handler(implZone, _parentDelegate(implZone), zone, period, f);
567 } 579 }
568 580
569 void print(Zone zone, String line) { 581 void print(Zone zone, String line) {
570 _ZoneFunction implementation = _delegationTarget._print; 582 var implementation = _delegationTarget._print;
571 _Zone implZone = implementation.zone; 583 _Zone implZone = implementation.zone;
572 (implementation.function)( 584 PrintHandler handler = implementation.function;
573 implZone, _parentDelegate(implZone), zone, line); 585 handler(implZone, _parentDelegate(implZone), zone, line);
574 } 586 }
575 587
576 Zone fork(Zone zone, ZoneSpecification specification, 588 Zone fork(Zone zone, ZoneSpecification specification,
577 Map zoneValues) { 589 Map zoneValues) {
578 _ZoneFunction implementation = _delegationTarget._fork; 590 var implementation = _delegationTarget._fork;
579 _Zone implZone = implementation.zone; 591 _Zone implZone = implementation.zone;
580 return (implementation.function)( 592 ForkHandler handler = implementation.function;
593 return handler(
581 implZone, _parentDelegate(implZone), zone, specification, zoneValues); 594 implZone, _parentDelegate(implZone), zone, specification, zoneValues);
582 } 595 }
583 } 596 }
584 597
585 598
586 /** 599 /**
587 * Base class for Zone implementations. 600 * Base class for Zone implementations.
588 */ 601 */
589 abstract class _Zone implements Zone { 602 abstract class _Zone implements Zone {
590 const _Zone(); 603 const _Zone();
591 604
592 _ZoneFunction get _runUnary; 605 _ZoneFunction<RunHandler> get _run;
593 _ZoneFunction get _run; 606 _ZoneFunction<RunUnaryHandler> get _runUnary;
594 _ZoneFunction get _runBinary; 607 _ZoneFunction<RunBinaryHandler> get _runBinary;
595 _ZoneFunction get _registerCallback; 608 _ZoneFunction<RegisterCallbackHandler> get _registerCallback;
596 _ZoneFunction get _registerUnaryCallback; 609 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback;
597 _ZoneFunction get _registerBinaryCallback; 610 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback;
598 _ZoneFunction get _errorCallback; 611 _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
599 _ZoneFunction get _scheduleMicrotask; 612 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
600 _ZoneFunction get _createTimer; 613 _ZoneFunction<CreateTimerHandler> get _createTimer;
601 _ZoneFunction get _createPeriodicTimer; 614 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer;
602 _ZoneFunction get _print; 615 _ZoneFunction<PrintHandler> get _print;
603 _ZoneFunction get _fork; 616 _ZoneFunction<ForkHandler> get _fork;
604 _ZoneFunction get _handleUncaughtError; 617 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError;
605 _Zone get parent; 618 _Zone get parent;
606 ZoneDelegate get _delegate; 619 ZoneDelegate get _delegate;
607 Map get _map; 620 Map get _map;
608 621
609 bool inSameErrorZone(Zone otherZone) { 622 bool inSameErrorZone(Zone otherZone) {
610 return identical(this, otherZone) || 623 return identical(this, otherZone) ||
611 identical(errorZone, otherZone.errorZone); 624 identical(errorZone, otherZone.errorZone);
612 } 625 }
613 } 626 }
614 627
615 class _CustomZone extends _Zone { 628 class _CustomZone extends _Zone {
616 // The actual zone and implementation of each of these 629 // The actual zone and implementation of each of these
617 // inheritable zone functions. 630 // inheritable zone functions.
618 _ZoneFunction _runUnary; 631 _ZoneFunction<RunHandler> _run;
619 _ZoneFunction _run; 632 _ZoneFunction<RunUnaryHandler> _runUnary;
620 _ZoneFunction _runBinary; 633 _ZoneFunction<RunBinaryHandler> _runBinary;
621 _ZoneFunction _registerCallback; 634 _ZoneFunction<RegisterCallbackHandler> _registerCallback;
622 _ZoneFunction _registerUnaryCallback; 635 _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback;
623 _ZoneFunction _registerBinaryCallback; 636 _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback;
624 _ZoneFunction _errorCallback; 637 _ZoneFunction<ErrorCallbackHandler> _errorCallback;
625 _ZoneFunction _scheduleMicrotask; 638 _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
626 _ZoneFunction _createTimer; 639 _ZoneFunction<CreateTimerHandler> _createTimer;
627 _ZoneFunction _createPeriodicTimer; 640 _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer;
628 _ZoneFunction _print; 641 _ZoneFunction<PrintHandler> _print;
629 _ZoneFunction _fork; 642 _ZoneFunction<ForkHandler> _fork;
630 _ZoneFunction _handleUncaughtError; 643 _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError;
631 644
632 // A cached delegate to this zone. 645 // A cached delegate to this zone.
633 ZoneDelegate _delegateCache; 646 ZoneDelegate _delegateCache;
634 647
635 /// The parent zone. 648 /// The parent zone.
636 final _Zone parent; 649 final _Zone parent;
637 650
638 /// The zone's scoped value declaration map. 651 /// The zone's scoped value declaration map.
639 /// 652 ///
640 /// This is always a [HashMap]. 653 /// This is always a [HashMap].
641 final Map _map; 654 final Map _map;
642 655
643 ZoneDelegate get _delegate { 656 ZoneDelegate get _delegate {
644 if (_delegateCache != null) return _delegateCache; 657 if (_delegateCache != null) return _delegateCache;
645 _delegateCache = new _ZoneDelegate(this); 658 _delegateCache = new _ZoneDelegate(this);
646 return _delegateCache; 659 return _delegateCache;
647 } 660 }
648 661
649 _CustomZone(this.parent, ZoneSpecification specification, this._map) { 662 _CustomZone(this.parent, ZoneSpecification specification, this._map) {
650 // The root zone will have implementations of all parts of the 663 // The root zone will have implementations of all parts of the
651 // specification, so it will never try to access the (null) parent. 664 // specification, so it will never try to access the (null) parent.
652 // All other zones have a non-null parent. 665 // All other zones have a non-null parent.
653 _run = (specification.run != null) 666 _run = (specification.run != null)
654 ? new _ZoneFunction(this, specification.run) 667 ? new _ZoneFunction<RunHandler>(this, specification.run)
655 : parent._run; 668 : parent._run;
656 _runUnary = (specification.runUnary != null) 669 _runUnary = (specification.runUnary != null)
657 ? new _ZoneFunction(this, specification.runUnary) 670 ? new _ZoneFunction<RunUnaryHandler>(this, specification.runUnary)
658 : parent._runUnary; 671 : parent._runUnary;
659 _runBinary = (specification.runBinary != null) 672 _runBinary = (specification.runBinary != null)
660 ? new _ZoneFunction(this, specification.runBinary) 673 ? new _ZoneFunction<RunBinaryHandler>(this, specification.runBinary)
661 : parent._runBinary; 674 : parent._runBinary;
662 _registerCallback = (specification.registerCallback != null) 675 _registerCallback = (specification.registerCallback != null)
663 ? new _ZoneFunction(this, specification.registerCallback) 676 ? new _ZoneFunction<RegisterCallbackHandler>(
677 this, specification.registerCallback)
664 : parent._registerCallback; 678 : parent._registerCallback;
665 _registerUnaryCallback = (specification.registerUnaryCallback != null) 679 _registerUnaryCallback = (specification.registerUnaryCallback != null)
666 ? new _ZoneFunction(this, specification.registerUnaryCallback) 680 ? new _ZoneFunction<RegisterUnaryCallbackHandler>(
681 this, specification.registerUnaryCallback)
667 : parent._registerUnaryCallback; 682 : parent._registerUnaryCallback;
668 _registerBinaryCallback = (specification.registerBinaryCallback != null) 683 _registerBinaryCallback = (specification.registerBinaryCallback != null)
669 ? new _ZoneFunction(this, specification.registerBinaryCallback) 684 ? new _ZoneFunction<RegisterBinaryCallbackHandler>(
685 this, specification.registerBinaryCallback)
670 : parent._registerBinaryCallback; 686 : parent._registerBinaryCallback;
671 _errorCallback = (specification.errorCallback != null) 687 _errorCallback = (specification.errorCallback != null)
672 ? new _ZoneFunction(this, specification.errorCallback) 688 ? new _ZoneFunction<ErrorCallbackHandler>(
689 this, specification.errorCallback)
673 : parent._errorCallback; 690 : parent._errorCallback;
674 _scheduleMicrotask = (specification.scheduleMicrotask != null) 691 _scheduleMicrotask = (specification.scheduleMicrotask != null)
675 ? new _ZoneFunction(this, specification.scheduleMicrotask) 692 ? new _ZoneFunction<ScheduleMicrotaskHandler>(
693 this, specification.scheduleMicrotask)
676 : parent._scheduleMicrotask; 694 : parent._scheduleMicrotask;
677 _createTimer = (specification.createTimer != null) 695 _createTimer = (specification.createTimer != null)
678 ? new _ZoneFunction(this, specification.createTimer) 696 ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer)
679 : parent._createTimer; 697 : parent._createTimer;
680 _createPeriodicTimer = (specification.createPeriodicTimer != null) 698 _createPeriodicTimer = (specification.createPeriodicTimer != null)
681 ? new _ZoneFunction(this, specification.createPeriodicTimer) 699 ? new _ZoneFunction<CreatePeriodicTimerHandler>(
700 this, specification.createPeriodicTimer)
682 : parent._createPeriodicTimer; 701 : parent._createPeriodicTimer;
683 _print = (specification.print != null) 702 _print = (specification.print != null)
684 ? new _ZoneFunction(this, specification.print) 703 ? new _ZoneFunction<PrintHandler>(this, specification.print)
685 : parent._print; 704 : parent._print;
686 _fork = (specification.fork != null) 705 _fork = (specification.fork != null)
687 ? new _ZoneFunction(this, specification.fork) 706 ? new _ZoneFunction<ForkHandler>(this, specification.fork)
688 : parent._fork; 707 : parent._fork;
689 _handleUncaughtError = (specification.handleUncaughtError != null) 708 _handleUncaughtError = (specification.handleUncaughtError != null)
690 ? new _ZoneFunction(this, specification.handleUncaughtError) 709 ? new _ZoneFunction<HandleUncaughtErrorHandler>(
710 this, specification.handleUncaughtError)
691 : parent._handleUncaughtError; 711 : parent._handleUncaughtError;
692 } 712 }
693 713
694 /** 714 /**
695 * The closest error-handling zone. 715 * The closest error-handling zone.
696 * 716 *
697 * Returns `this` if `this` has an error-handler. Otherwise returns the 717 * Returns `this` if `this` has an error-handler. Otherwise returns the
698 * parent's error-zone. 718 * parent's error-zone.
699 */ 719 */
700 Zone get errorZone => _handleUncaughtError.zone; 720 Zone get errorZone => _handleUncaughtError.zone;
701 721
702 dynamic runGuarded(f()) { 722 /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) {
703 try { 723 try {
704 return run(f); 724 return run(f);
705 } catch (e, s) { 725 } catch (e, s) {
706 return handleUncaughtError(e, s); 726 return handleUncaughtError(e, s);
707 } 727 }
708 } 728 }
709 729
710 dynamic runUnaryGuarded(f(arg), arg) { 730 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
711 try { 731 try {
712 return runUnary(f, arg); 732 return runUnary(f, arg);
713 } catch (e, s) { 733 } catch (e, s) {
714 return handleUncaughtError(e, s); 734 return handleUncaughtError(e, s);
715 } 735 }
716 } 736 }
717 737
718 dynamic runBinaryGuarded(f(arg1, arg2), arg1, arg2) { 738 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
739 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
719 try { 740 try {
720 return runBinary(f, arg1, arg2); 741 return runBinary(f, arg1, arg2);
721 } catch (e, s) { 742 } catch (e, s) {
722 return handleUncaughtError(e, s); 743 return handleUncaughtError(e, s);
723 } 744 }
724 } 745 }
725 746
726 ZoneCallback bindCallback(f(), { bool runGuarded: true }) { 747 ZoneCallback/*<R>*/ bindCallback/*<R>*/(
727 ZoneCallback registered = registerCallback(f); 748 /*=R*/ f(), { bool runGuarded: true }) {
749 var registered = registerCallback(f);
728 if (runGuarded) { 750 if (runGuarded) {
729 return () => this.runGuarded(registered); 751 return () => this.runGuarded(registered);
730 } else { 752 } else {
731 return () => this.run(registered); 753 return () => this.run(registered);
732 } 754 }
733 } 755 }
734 756
735 ZoneUnaryCallback bindUnaryCallback(f(arg), { bool runGuarded: true }) { 757 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
736 ZoneUnaryCallback registered = registerUnaryCallback(f); 758 /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) {
759 var registered = registerUnaryCallback(f);
737 if (runGuarded) { 760 if (runGuarded) {
738 return (arg) => this.runUnaryGuarded(registered, arg); 761 return (arg) => this.runUnaryGuarded(registered, arg);
739 } else { 762 } else {
740 return (arg) => this.runUnary(registered, arg); 763 return (arg) => this.runUnary(registered, arg);
741 } 764 }
742 } 765 }
743 766
744 ZoneBinaryCallback bindBinaryCallback( 767 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
745 f(arg1, arg2), { bool runGuarded: true }) { 768 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) {
746 ZoneBinaryCallback registered = registerBinaryCallback(f); 769 var registered = registerBinaryCallback(f);
747 if (runGuarded) { 770 if (runGuarded) {
748 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2); 771 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2);
749 } else { 772 } else {
750 return (arg1, arg2) => this.runBinary(registered, arg1, arg2); 773 return (arg1, arg2) => this.runBinary(registered, arg1, arg2);
751 } 774 }
752 } 775 }
753 776
754 operator [](Object key) { 777 operator [](Object key) {
755 var result = _map[key]; 778 var result = _map[key];
756 if (result != null || _map.containsKey(key)) return result; 779 if (result != null || _map.containsKey(key)) return result;
757 // If we are not the root zone, look up in the parent zone. 780 // If we are not the root zone, look up in the parent zone.
758 if (parent != null) { 781 if (parent != null) {
759 // We do not optimize for repeatedly looking up a key which isn't 782 // We do not optimize for repeatedly looking up a key which isn't
760 // there. That would require storing the key and keeping it alive. 783 // there. That would require storing the key and keeping it alive.
761 // Copying the key/value from the parent does not keep any new values 784 // Copying the key/value from the parent does not keep any new values
762 // alive. 785 // alive.
763 var value = parent[key]; 786 var value = parent[key];
764 if (value != null) { 787 if (value != null) {
765 _map[key] = value; 788 _map[key] = value;
766 } 789 }
767 return value; 790 return value;
768 } 791 }
769 assert(this == _ROOT_ZONE); 792 assert(this == _ROOT_ZONE);
770 return null; 793 return null;
771 } 794 }
772 795
773 // Methods that can be customized by the zone specification. 796 // Methods that can be customized by the zone specification.
774 797
775 dynamic handleUncaughtError(error, StackTrace stackTrace) { 798 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) {
776 _ZoneFunction implementation = this._handleUncaughtError; 799 var implementation = this._handleUncaughtError;
777 assert(implementation != null); 800 assert(implementation != null);
778 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 801 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
779 return (implementation.function)( 802 HandleUncaughtErrorHandler handler = implementation.function;
780 implementation.zone, parentDelegate, this, error, stackTrace); 803 // TODO(floitsch): make this a generic method call on '<R>' once it's
804 // supported. Remove the unnecessary cast.
805 return handler(
806 implementation.zone, parentDelegate, this, error, stackTrace)
807 as Object/*=R*/;
781 } 808 }
782 809
783 Zone fork({ZoneSpecification specification, Map zoneValues}) { 810 Zone fork({ZoneSpecification specification, Map zoneValues}) {
784 _ZoneFunction implementation = this._fork; 811 var implementation = this._fork;
785 assert(implementation != null); 812 assert(implementation != null);
786 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 813 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
787 return (implementation.function)( 814 ForkHandler handler = implementation.function;
788 implementation.zone, parentDelegate, this, 815 return handler(implementation.zone, parentDelegate, this,
789 specification, zoneValues); 816 specification, zoneValues);
790 } 817 }
791 818
792 dynamic run(f()) { 819 /*=R*/ run/*<R>*/(/*=R*/ f()) {
793 _ZoneFunction implementation = this._run; 820 var implementation = this._run;
794 assert(implementation != null); 821 assert(implementation != null);
795 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 822 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
796 return (implementation.function)( 823 RunHandler handler = implementation.function;
797 implementation.zone, parentDelegate, this, f); 824 // TODO(floitsch): make this a generic method call on '<R>' once it's
825 // supported. Remove the unnecessary cast.
826 return handler(implementation.zone, parentDelegate, this, f)
827 as Object/*=R*/;
798 } 828 }
799 829
800 dynamic runUnary(f(arg), arg) { 830 /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
801 _ZoneFunction implementation = this._runUnary; 831 var implementation = this._runUnary;
802 assert(implementation != null); 832 assert(implementation != null);
803 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 833 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
804 return (implementation.function)( 834 RunUnaryHandler handler = implementation.function;
805 implementation.zone, parentDelegate, this, f, arg); 835 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
836 // supported. Remove the unnecessary cast.
837 return handler(implementation.zone, parentDelegate, this, f, arg)
838 as Object/*=R*/;
806 } 839 }
807 840
808 dynamic runBinary(f(arg1, arg2), arg1, arg2) { 841 /*=R*/ runBinary/*<R, T1, T2>*/(
809 _ZoneFunction implementation = this._runBinary; 842 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
843 var implementation = this._runBinary;
810 assert(implementation != null); 844 assert(implementation != null);
811 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 845 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
812 return (implementation.function)( 846 RunBinaryHandler handler = implementation.function;
813 implementation.zone, parentDelegate, this, f, arg1, arg2); 847 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
848 // it's supported. Remove the unnecessary cast.
849 return handler(
850 implementation.zone, parentDelegate, this, f, arg1, arg2)
851 as Object/*=R*/;
814 } 852 }
815 853
816 ZoneCallback registerCallback(f()) { 854 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) {
817 _ZoneFunction implementation = this._registerCallback; 855 var implementation = this._registerCallback;
818 assert(implementation != null); 856 assert(implementation != null);
819 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 857 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
820 return (implementation.function)( 858 RegisterCallbackHandler handler = implementation.function;
821 implementation.zone, parentDelegate, this, f); 859 // TODO(floitsch): make this a generic method call on '<R>' once it's
860 // supported. Remove the unnecessary cast.
861 return handler(implementation.zone, parentDelegate, this, callback)
862 as Object/*=ZoneCallback<R>*/;
822 } 863 }
823 864
824 ZoneUnaryCallback registerUnaryCallback(f(arg)) { 865 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
825 _ZoneFunction implementation = this._registerUnaryCallback; 866 /*=R*/ callback(/*=T*/ arg)) {
867 var implementation = this._registerUnaryCallback;
826 assert(implementation != null); 868 assert(implementation != null);
827 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 869 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
828 return (implementation.function)( 870 RegisterUnaryCallbackHandler handler = implementation.function;
829 implementation.zone, parentDelegate, this, f); 871 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
872 // supported. Remove the unnecessary cast.
873 return handler(implementation.zone, parentDelegate, this, callback)
874 as Object/*=ZoneUnaryCallback<R, T>*/;
830 } 875 }
831 876
832 ZoneBinaryCallback registerBinaryCallback(f(arg1, arg2)) { 877 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
833 _ZoneFunction implementation = this._registerBinaryCallback; 878 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) {
879 var implementation = this._registerBinaryCallback;
834 assert(implementation != null); 880 assert(implementation != null);
835 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 881 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
836 return (implementation.function)( 882 RegisterBinaryCallbackHandler handler = implementation.function;
837 implementation.zone, parentDelegate, this, f); 883 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
884 // it's supported. Remove the unnecessary cast.
885 return handler(implementation.zone, parentDelegate, this, callback)
886 as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
838 } 887 }
839 888
840 AsyncError errorCallback(Object error, StackTrace stackTrace) { 889 AsyncError errorCallback(Object error, StackTrace stackTrace) {
841 final _ZoneFunction implementation = this._errorCallback; 890 var implementation = this._errorCallback;
842 assert(implementation != null); 891 assert(implementation != null);
843 final Zone implementationZone = implementation.zone; 892 final Zone implementationZone = implementation.zone;
844 if (identical(implementationZone, _ROOT_ZONE)) return null; 893 if (identical(implementationZone, _ROOT_ZONE)) return null;
845 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone); 894 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone);
846 return (implementation.function)( 895 ErrorCallbackHandler handler = implementation.function;
896 return handler(
847 implementationZone, parentDelegate, this, error, stackTrace); 897 implementationZone, parentDelegate, this, error, stackTrace);
848 } 898 }
849 899
850 void scheduleMicrotask(void f()) { 900 void scheduleMicrotask(void f()) {
851 _ZoneFunction implementation = this._scheduleMicrotask; 901 var implementation = this._scheduleMicrotask;
852 assert(implementation != null); 902 assert(implementation != null);
853 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 903 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
854 return (implementation.function)( 904 ScheduleMicrotaskHandler handler = implementation.function;
855 implementation.zone, parentDelegate, this, f); 905 return handler(implementation.zone, parentDelegate, this, f);
856 } 906 }
857 907
858 Timer createTimer(Duration duration, void f()) { 908 Timer createTimer(Duration duration, void f()) {
859 _ZoneFunction implementation = this._createTimer; 909 var implementation = this._createTimer;
860 assert(implementation != null); 910 assert(implementation != null);
861 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 911 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
862 return (implementation.function)( 912 CreateTimerHandler handler = implementation.function;
863 implementation.zone, parentDelegate, this, duration, f); 913 return handler(implementation.zone, parentDelegate, this, duration, f);
864 } 914 }
865 915
866 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { 916 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
867 _ZoneFunction implementation = this._createPeriodicTimer; 917 var implementation = this._createPeriodicTimer;
868 assert(implementation != null); 918 assert(implementation != null);
869 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 919 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
870 return (implementation.function)( 920 CreatePeriodicTimerHandler handler = implementation.function;
921 return handler(
871 implementation.zone, parentDelegate, this, duration, f); 922 implementation.zone, parentDelegate, this, duration, f);
872 } 923 }
873 924
874 void print(String line) { 925 void print(String line) {
875 _ZoneFunction implementation = this._print; 926 var implementation = this._print;
876 assert(implementation != null); 927 assert(implementation != null);
877 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 928 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
878 return (implementation.function)( 929 PrintHandler handler = implementation.function;
879 implementation.zone, parentDelegate, this, line); 930 return handler(implementation.zone, parentDelegate, this, line);
880 } 931 }
881 } 932 }
882 933
883 void _rootHandleUncaughtError( 934 /*=R*/ _rootHandleUncaughtError/*<R>*/(
884 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { 935 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
885 _schedulePriorityAsyncCallback(() { 936 _schedulePriorityAsyncCallback(() {
886 throw new _UncaughtAsyncError(error, stackTrace); 937 if (error == null) error = new NullThrownError();
938 if (stackTrace == null) throw error;
939 _rethrow(error, stackTrace);
887 }); 940 });
888 } 941 }
889 942
890 dynamic _rootRun(Zone self, ZoneDelegate parent, Zone zone, f()) { 943 external void _rethrow(Object error, StackTrace stackTrace);
944
945 /*=R*/ _rootRun/*<R>*/(Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) {
891 if (Zone._current == zone) return f(); 946 if (Zone._current == zone) return f();
892 947
893 Zone old = Zone._enter(zone); 948 Zone old = Zone._enter(zone);
894 try { 949 try {
895 return f(); 950 return f();
896 } finally { 951 } finally {
897 Zone._leave(old); 952 Zone._leave(old);
898 } 953 }
899 } 954 }
900 955
901 dynamic _rootRunUnary(Zone self, ZoneDelegate parent, Zone zone, f(arg), arg) { 956 /*=R*/ _rootRunUnary/*<R, T>*/(Zone self, ZoneDelegate parent, Zone zone,
957 /*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
902 if (Zone._current == zone) return f(arg); 958 if (Zone._current == zone) return f(arg);
903 959
904 Zone old = Zone._enter(zone); 960 Zone old = Zone._enter(zone);
905 try { 961 try {
906 return f(arg); 962 return f(arg);
907 } finally { 963 } finally {
908 Zone._leave(old); 964 Zone._leave(old);
909 } 965 }
910 } 966 }
911 967
912 dynamic _rootRunBinary(Zone self, ZoneDelegate parent, Zone zone, 968 /*=R*/ _rootRunBinary/*<R, T1, T2>*/(Zone self, ZoneDelegate parent, Zone zone,
913 f(arg1, arg2), arg1, arg2) { 969 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
914 if (Zone._current == zone) return f(arg1, arg2); 970 if (Zone._current == zone) return f(arg1, arg2);
915 971
916 Zone old = Zone._enter(zone); 972 Zone old = Zone._enter(zone);
917 try { 973 try {
918 return f(arg1, arg2); 974 return f(arg1, arg2);
919 } finally { 975 } finally {
920 Zone._leave(old); 976 Zone._leave(old);
921 } 977 }
922 } 978 }
923 979
924 ZoneCallback _rootRegisterCallback( 980 ZoneCallback/*<R>*/ _rootRegisterCallback/*<R>*/(
925 Zone self, ZoneDelegate parent, Zone zone, f()) { 981 Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) {
926 return f; 982 return f;
927 } 983 }
928 984
929 ZoneUnaryCallback _rootRegisterUnaryCallback( 985 ZoneUnaryCallback/*<R, T>*/ _rootRegisterUnaryCallback/*<R, T>*/(
930 Zone self, ZoneDelegate parent, Zone zone, f(arg)) { 986 Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f(/*=T*/ arg)) {
931 return f; 987 return f;
932 } 988 }
933 989
934 ZoneBinaryCallback _rootRegisterBinaryCallback( 990 ZoneBinaryCallback/*<R, T1, T2>*/ _rootRegisterBinaryCallback/*<R, T1, T2>*/(
935 Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)) { 991 Zone self, ZoneDelegate parent, Zone zone,
992 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) {
936 return f; 993 return f;
937 } 994 }
938 995
939 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone, 996 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
940 Object error, StackTrace stackTrace) => null; 997 Object error, StackTrace stackTrace) => null;
941 998
942 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { 999 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) {
943 if (!identical(_ROOT_ZONE, zone)) { 1000 if (!identical(_ROOT_ZONE, zone)) {
944 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); 1001 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone);
945 f = zone.bindCallback(f, runGuarded: hasErrorHandler); 1002 f = zone.bindCallback(f, runGuarded: hasErrorHandler);
1003 // Use root zone as event zone if the function is already bound.
1004 zone = _ROOT_ZONE;
946 } 1005 }
947 _scheduleAsyncCallback(f); 1006 _scheduleAsyncCallback(f);
948 } 1007 }
949 1008
950 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, 1009 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone,
951 Duration duration, void callback()) { 1010 Duration duration, void callback()) {
952 if (!identical(_ROOT_ZONE, zone)) { 1011 if (!identical(_ROOT_ZONE, zone)) {
953 callback = zone.bindCallback(callback); 1012 callback = zone.bindCallback(callback);
954 } 1013 }
955 return Timer._createTimer(duration, callback); 1014 return Timer._createTimer(duration, callback);
956 } 1015 }
957 1016
958 Timer _rootCreatePeriodicTimer( 1017 Timer _rootCreatePeriodicTimer(
959 Zone self, ZoneDelegate parent, Zone zone, 1018 Zone self, ZoneDelegate parent, Zone zone,
960 Duration duration, void callback(Timer timer)) { 1019 Duration duration, void callback(Timer timer)) {
961 if (!identical(_ROOT_ZONE, zone)) { 1020 if (!identical(_ROOT_ZONE, zone)) {
962 callback = zone.bindUnaryCallback(callback); 1021 // TODO(floitsch): the return type should be 'void'.
1022 callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback);
963 } 1023 }
964 return Timer._createPeriodicTimer(duration, callback); 1024 return Timer._createPeriodicTimer(duration, callback);
965 } 1025 }
966 1026
967 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { 1027 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
968 printToConsole(line); 1028 printToConsole(line);
969 } 1029 }
970 1030
971 void _printToZone(String line) { 1031 void _printToZone(String line) {
972 Zone.current.print(line); 1032 Zone.current.print(line);
(...skipping 19 matching lines...) Expand all
992 valueMap = zone._map; 1052 valueMap = zone._map;
993 } else { 1053 } else {
994 valueMap = new HashMap(); 1054 valueMap = new HashMap();
995 } 1055 }
996 } else { 1056 } else {
997 valueMap = new HashMap.from(zoneValues); 1057 valueMap = new HashMap.from(zoneValues);
998 } 1058 }
999 return new _CustomZone(zone, specification, valueMap); 1059 return new _CustomZone(zone, specification, valueMap);
1000 } 1060 }
1001 1061
1002 class _RootZoneSpecification implements ZoneSpecification {
1003 HandleUncaughtErrorHandler get handleUncaughtError =>
1004 _rootHandleUncaughtError;
1005 RunHandler get run => _rootRun;
1006 RunUnaryHandler get runUnary => _rootRunUnary;
1007 RunBinaryHandler get runBinary => _rootRunBinary;
1008 RegisterCallbackHandler get registerCallback => _rootRegisterCallback;
1009 RegisterUnaryCallbackHandler get registerUnaryCallback =>
1010 _rootRegisterUnaryCallback;
1011 RegisterBinaryCallbackHandler get registerBinaryCallback =>
1012 _rootRegisterBinaryCallback;
1013 ErrorCallbackHandler get errorCallback => _rootErrorCallback;
1014 ScheduleMicrotaskHandler get scheduleMicrotask => _rootScheduleMicrotask;
1015 CreateTimerHandler get createTimer => _rootCreateTimer;
1016 CreatePeriodicTimerHandler get createPeriodicTimer =>
1017 _rootCreatePeriodicTimer;
1018 PrintHandler get print => _rootPrint;
1019 ForkHandler get fork => _rootFork;
1020 }
1021
1022 class _RootZone extends _Zone { 1062 class _RootZone extends _Zone {
1023 const _RootZone(); 1063 const _RootZone();
1024 1064
1025 _ZoneFunction get _run => 1065 _ZoneFunction<RunHandler> get _run =>
1026 const _ZoneFunction(_ROOT_ZONE, _rootRun); 1066 const _ZoneFunction<RunHandler>(_ROOT_ZONE, _rootRun);
1027 _ZoneFunction get _runUnary => 1067 _ZoneFunction<RunUnaryHandler> get _runUnary =>
1028 const _ZoneFunction(_ROOT_ZONE, _rootRunUnary); 1068 const _ZoneFunction<RunUnaryHandler>(_ROOT_ZONE, _rootRunUnary);
1029 _ZoneFunction get _runBinary => 1069 _ZoneFunction<RunBinaryHandler> get _runBinary =>
1030 const _ZoneFunction(_ROOT_ZONE, _rootRunBinary); 1070 const _ZoneFunction<RunBinaryHandler>(_ROOT_ZONE, _rootRunBinary);
1031 _ZoneFunction get _registerCallback => 1071 _ZoneFunction<RegisterCallbackHandler> get _registerCallback =>
1032 const _ZoneFunction(_ROOT_ZONE, _rootRegisterCallback); 1072 const _ZoneFunction<RegisterCallbackHandler>(
1033 _ZoneFunction get _registerUnaryCallback => 1073 _ROOT_ZONE, _rootRegisterCallback);
1034 const _ZoneFunction(_ROOT_ZONE, _rootRegisterUnaryCallback); 1074 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback =>
1035 _ZoneFunction get _registerBinaryCallback => 1075 const _ZoneFunction<RegisterUnaryCallbackHandler>(
1036 const _ZoneFunction(_ROOT_ZONE, _rootRegisterBinaryCallback); 1076 _ROOT_ZONE, _rootRegisterUnaryCallback);
1037 _ZoneFunction get _errorCallback => 1077 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback =>
1038 const _ZoneFunction(_ROOT_ZONE, _rootErrorCallback); 1078 const _ZoneFunction<RegisterBinaryCallbackHandler>(
1039 _ZoneFunction get _scheduleMicrotask => 1079 _ROOT_ZONE, _rootRegisterBinaryCallback);
1040 const _ZoneFunction(_ROOT_ZONE, _rootScheduleMicrotask); 1080 _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
1041 _ZoneFunction get _createTimer => 1081 const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback);
1042 const _ZoneFunction(_ROOT_ZONE, _rootCreateTimer); 1082 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
1043 _ZoneFunction get _createPeriodicTimer => 1083 const _ZoneFunction<ScheduleMicrotaskHandler>(
1044 const _ZoneFunction(_ROOT_ZONE, _rootCreatePeriodicTimer); 1084 _ROOT_ZONE, _rootScheduleMicrotask);
1045 _ZoneFunction get _print => 1085 _ZoneFunction<CreateTimerHandler> get _createTimer =>
1046 const _ZoneFunction(_ROOT_ZONE, _rootPrint); 1086 const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer);
1047 _ZoneFunction get _fork => 1087 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer =>
1048 const _ZoneFunction(_ROOT_ZONE, _rootFork); 1088 const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePer iodicTimer);
1049 _ZoneFunction get _handleUncaughtError => 1089 _ZoneFunction<PrintHandler> get _print =>
1050 const _ZoneFunction(_ROOT_ZONE, _rootHandleUncaughtError); 1090 const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint);
1091 _ZoneFunction<ForkHandler> get _fork =>
1092 const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork);
1093 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError =>
1094 const _ZoneFunction<HandleUncaughtErrorHandler>(
1095 _ROOT_ZONE, _rootHandleUncaughtError);
1051 1096
1052 // The parent zone. 1097 // The parent zone.
1053 _Zone get parent => null; 1098 _Zone get parent => null;
1054 1099
1055 /// The zone's scoped value declaration map. 1100 /// The zone's scoped value declaration map.
1056 /// 1101 ///
1057 /// This is always a [HashMap]. 1102 /// This is always a [HashMap].
1058 Map get _map => _rootMap; 1103 Map get _map => _rootMap;
1059 1104
1060 static Map _rootMap = new HashMap(); 1105 static Map _rootMap = new HashMap();
1061 1106
1062 static ZoneDelegate _rootDelegate; 1107 static ZoneDelegate _rootDelegate;
1063 1108
1064 ZoneDelegate get _delegate { 1109 ZoneDelegate get _delegate {
1065 if (_rootDelegate != null) return _rootDelegate; 1110 if (_rootDelegate != null) return _rootDelegate;
1066 return _rootDelegate = new _ZoneDelegate(this); 1111 return _rootDelegate = new _ZoneDelegate(this);
1067 } 1112 }
1068 1113
1069 /** 1114 /**
1070 * The closest error-handling zone. 1115 * The closest error-handling zone.
1071 * 1116 *
1072 * Returns `this` if `this` has an error-handler. Otherwise returns the 1117 * Returns `this` if `this` has an error-handler. Otherwise returns the
1073 * parent's error-zone. 1118 * parent's error-zone.
1074 */ 1119 */
1075 Zone get errorZone => this; 1120 Zone get errorZone => this;
1076 1121
1077 // Zone interface. 1122 // Zone interface.
1078 1123
1079 dynamic runGuarded(f()) { 1124 /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) {
1080 try { 1125 try {
1081 if (identical(_ROOT_ZONE, Zone._current)) { 1126 if (identical(_ROOT_ZONE, Zone._current)) {
1082 return f(); 1127 return f();
1083 } 1128 }
1084 return _rootRun(null, null, this, f); 1129 return _rootRun/*<R>*/(null, null, this, f);
1085 } catch (e, s) { 1130 } catch (e, s) {
1086 return handleUncaughtError(e, s); 1131 return handleUncaughtError/*<R>*/(e, s);
1087 } 1132 }
1088 } 1133 }
1089 1134
1090 dynamic runUnaryGuarded(f(arg), arg) { 1135 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
1091 try { 1136 try {
1092 if (identical(_ROOT_ZONE, Zone._current)) { 1137 if (identical(_ROOT_ZONE, Zone._current)) {
1093 return f(arg); 1138 return f(arg);
1094 } 1139 }
1095 return _rootRunUnary(null, null, this, f, arg); 1140 return _rootRunUnary/*<R, T>*/(null, null, this, f, arg);
1096 } catch (e, s) { 1141 } catch (e, s) {
1097 return handleUncaughtError(e, s); 1142 return handleUncaughtError/*<R>*/(e, s);
1098 } 1143 }
1099 } 1144 }
1100 1145
1101 dynamic runBinaryGuarded(f(arg1, arg2), arg1, arg2) { 1146 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
1147 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
1102 try { 1148 try {
1103 if (identical(_ROOT_ZONE, Zone._current)) { 1149 if (identical(_ROOT_ZONE, Zone._current)) {
1104 return f(arg1, arg2); 1150 return f(arg1, arg2);
1105 } 1151 }
1106 return _rootRunBinary(null, null, this, f, arg1, arg2); 1152 return _rootRunBinary/*<R, T1, T2>*/(null, null, this, f, arg1, arg2);
1107 } catch (e, s) { 1153 } catch (e, s) {
1108 return handleUncaughtError(e, s); 1154 return handleUncaughtError/*<R>*/(e, s);
1109 } 1155 }
1110 } 1156 }
1111 1157
1112 ZoneCallback bindCallback(f(), { bool runGuarded: true }) { 1158 ZoneCallback/*<R>*/ bindCallback/*<R>*/(
1159 /*=R*/ f(), { bool runGuarded: true }) {
1113 if (runGuarded) { 1160 if (runGuarded) {
1114 return () => this.runGuarded(f); 1161 return () => this.runGuarded/*<R>*/(f);
1115 } else { 1162 } else {
1116 return () => this.run(f); 1163 return () => this.run/*<R>*/(f);
1117 } 1164 }
1118 } 1165 }
1119 1166
1120 ZoneUnaryCallback bindUnaryCallback(f(arg), { bool runGuarded: true }) { 1167 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
1168 /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) {
1121 if (runGuarded) { 1169 if (runGuarded) {
1122 return (arg) => this.runUnaryGuarded(f, arg); 1170 return (arg) => this.runUnaryGuarded/*<R, T>*/(f, arg);
1123 } else { 1171 } else {
1124 return (arg) => this.runUnary(f, arg); 1172 return (arg) => this.runUnary/*<R, T>*/(f, arg);
1125 } 1173 }
1126 } 1174 }
1127 1175
1128 ZoneBinaryCallback bindBinaryCallback( 1176 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
1129 f(arg1, arg2), { bool runGuarded: true }) { 1177 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) {
1130 if (runGuarded) { 1178 if (runGuarded) {
1131 return (arg1, arg2) => this.runBinaryGuarded(f, arg1, arg2); 1179 return (arg1, arg2) =>
1180 this.runBinaryGuarded/*<R, T1, T2>*/(f, arg1, arg2);
1132 } else { 1181 } else {
1133 return (arg1, arg2) => this.runBinary(f, arg1, arg2); 1182 return (arg1, arg2) => this.runBinary/*<R, T1, T2>*/(f, arg1, arg2);
1134 } 1183 }
1135 } 1184 }
1136 1185
1137 operator [](Object key) => null; 1186 operator [](Object key) => null;
1138 1187
1139 // Methods that can be customized by the zone specification. 1188 // Methods that can be customized by the zone specification.
1140 1189
1141 dynamic handleUncaughtError(error, StackTrace stackTrace) { 1190 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) {
1142 return _rootHandleUncaughtError(null, null, this, error, stackTrace); 1191 return _rootHandleUncaughtError(null, null, this, error, stackTrace);
1143 } 1192 }
1144 1193
1145 Zone fork({ZoneSpecification specification, Map zoneValues}) { 1194 Zone fork({ZoneSpecification specification, Map zoneValues}) {
1146 return _rootFork(null, null, this, specification, zoneValues); 1195 return _rootFork(null, null, this, specification, zoneValues);
1147 } 1196 }
1148 1197
1149 dynamic run(f()) { 1198 /*=R*/ run/*<R>*/(/*=R*/ f()) {
1150 if (identical(Zone._current, _ROOT_ZONE)) return f(); 1199 if (identical(Zone._current, _ROOT_ZONE)) return f();
1151 return _rootRun(null, null, this, f); 1200 return _rootRun(null, null, this, f);
1152 } 1201 }
1153 1202
1154 dynamic runUnary(f(arg), arg) { 1203 /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
1155 if (identical(Zone._current, _ROOT_ZONE)) return f(arg); 1204 if (identical(Zone._current, _ROOT_ZONE)) return f(arg);
1156 return _rootRunUnary(null, null, this, f, arg); 1205 return _rootRunUnary(null, null, this, f, arg);
1157 } 1206 }
1158 1207
1159 dynamic runBinary(f(arg1, arg2), arg1, arg2) { 1208 /*=R*/ runBinary/*<R, T1, T2>*/(
1209 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
1160 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2); 1210 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2);
1161 return _rootRunBinary(null, null, this, f, arg1, arg2); 1211 return _rootRunBinary(null, null, this, f, arg1, arg2);
1162 } 1212 }
1163 1213
1164 ZoneCallback registerCallback(f()) => f; 1214 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ f()) => f;
1165 1215
1166 ZoneUnaryCallback registerUnaryCallback(f(arg)) => f; 1216 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
1217 /*=R*/ f(/*=T*/ arg)) => f;
1167 1218
1168 ZoneBinaryCallback registerBinaryCallback(f(arg1, arg2)) => f; 1219 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
1220 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f;
1169 1221
1170 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; 1222 AsyncError errorCallback(Object error, StackTrace stackTrace) => null;
1171 1223
1172 void scheduleMicrotask(void f()) { 1224 void scheduleMicrotask(void f()) {
1173 _rootScheduleMicrotask(null, null, this, f); 1225 _rootScheduleMicrotask(null, null, this, f);
1174 } 1226 }
1175 1227
1176 Timer createTimer(Duration duration, void f()) { 1228 Timer createTimer(Duration duration, void f()) {
1177 return Timer._createTimer(duration, f); 1229 return Timer._createTimer(duration, f);
1178 } 1230 }
(...skipping 27 matching lines...) Expand all
1206 * future = future.catchError((e) { print("Never reached!"); }); 1258 * future = future.catchError((e) { print("Never reached!"); });
1207 * }, onError: (e) { print("unused error handler"); }); 1259 * }, onError: (e) { print("unused error handler"); });
1208 * }, onError: (e) { print("catches error of first error-zone."); }); 1260 * }, onError: (e) { print("catches error of first error-zone."); });
1209 * 1261 *
1210 * Example: 1262 * Example:
1211 * 1263 *
1212 * runZoned(() { 1264 * runZoned(() {
1213 * new Future(() { throw "asynchronous error"; }); 1265 * new Future(() { throw "asynchronous error"; });
1214 * }, onError: print); // Will print "asynchronous error". 1266 * }, onError: print); // Will print "asynchronous error".
1215 */ 1267 */
1216 dynamic runZoned(body(), 1268 /*=R*/ runZoned/*<R>*/(/*=R*/ body(),
1217 { Map zoneValues, 1269 { Map zoneValues,
1218 ZoneSpecification zoneSpecification, 1270 ZoneSpecification zoneSpecification,
1219 Function onError }) { 1271 Function onError }) {
1220 HandleUncaughtErrorHandler errorHandler; 1272 HandleUncaughtErrorHandler errorHandler;
1221 if (onError != null) { 1273 if (onError != null) {
1222 errorHandler = (Zone self, ZoneDelegate parent, Zone zone, 1274 errorHandler = (Zone self, ZoneDelegate parent, Zone zone,
1223 error, StackTrace stackTrace) { 1275 error, StackTrace stackTrace) {
1224 try { 1276 try {
1225 if (onError is ZoneBinaryCallback) { 1277 if (onError is ZoneBinaryCallback<dynamic/*=R*/, dynamic, StackTrace>) {
1226 return self.parent.runBinary(onError, error, stackTrace); 1278 return self.parent.runBinary(onError, error, stackTrace);
1227 } 1279 }
1228 return self.parent.runUnary(onError, error); 1280 return self.parent.runUnary(onError, error);
1229 } catch(e, s) { 1281 } catch(e, s) {
1230 if (identical(e, error)) { 1282 if (identical(e, error)) {
1231 return parent.handleUncaughtError(zone, error, stackTrace); 1283 return parent.handleUncaughtError(zone, error, stackTrace);
1232 } else { 1284 } else {
1233 return parent.handleUncaughtError(zone, e, s); 1285 return parent.handleUncaughtError(zone, e, s);
1234 } 1286 }
1235 } 1287 }
1236 }; 1288 };
1237 } 1289 }
1238 if (zoneSpecification == null) { 1290 if (zoneSpecification == null) {
1239 zoneSpecification = 1291 zoneSpecification =
1240 new ZoneSpecification(handleUncaughtError: errorHandler); 1292 new ZoneSpecification(handleUncaughtError: errorHandler);
1241 } else if (errorHandler != null) { 1293 } else if (errorHandler != null) {
1242 zoneSpecification = 1294 zoneSpecification =
1243 new ZoneSpecification.from(zoneSpecification, 1295 new ZoneSpecification.from(zoneSpecification,
1244 handleUncaughtError: errorHandler); 1296 handleUncaughtError: errorHandler);
1245 } 1297 }
1246 Zone zone = Zone.current.fork(specification: zoneSpecification, 1298 Zone zone = Zone.current.fork(specification: zoneSpecification,
1247 zoneValues: zoneValues); 1299 zoneValues: zoneValues);
1248 if (onError != null) { 1300 if (onError != null) {
1249 return zone.runGuarded(body); 1301 return zone.runGuarded(body);
1250 } else { 1302 } else {
1251 return zone.run(body); 1303 return zone.run(body);
1252 } 1304 }
1253 } 1305 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698