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

Side by Side Diff: sdk/lib/async/zone.dart

Issue 2754013002: Format all dart: library files (Closed)
Patch Set: Format all dart: library files Created 3 years, 9 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
« no previous file with comments | « sdk/lib/async/timer.dart ('k') | sdk/lib/collection/collection.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 R ZoneCallback<R>(); 7 typedef R ZoneCallback<R>();
8 typedef R ZoneUnaryCallback<R, T>(T arg); 8 typedef R ZoneUnaryCallback<R, T>(T arg);
9 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2); 9 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
10 10
11 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic 11 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic
12 // functions. 12 // functions.
13 /*ABUSE*/ 13 /*ABUSE*/
14 typedef R HandleUncaughtErrorHandler<R>( 14 typedef R HandleUncaughtErrorHandler<R>(
15 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace); 15 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace);
16 /*ABUSE*/ 16 /*ABUSE*/
17 typedef R RunHandler<R>(Zone self, ZoneDelegate parent, Zone zone, R f()); 17 typedef R RunHandler<R>(Zone self, ZoneDelegate parent, Zone zone, R f());
18 /*ABUSE*/ 18 /*ABUSE*/
19 typedef R RunUnaryHandler<R, T>( 19 typedef R RunUnaryHandler<R, T>(
20 Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg); 20 Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg);
21 /*ABUSE*/ 21 /*ABUSE*/
22 typedef R RunBinaryHandler<R, T1, T2>( 22 typedef R RunBinaryHandler<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone,
23 Zone self, ZoneDelegate parent, Zone zone,
24 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2); 23 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
25 /*ABUSE*/ 24 /*ABUSE*/
26 typedef ZoneCallback<R> RegisterCallbackHandler<R>( 25 typedef ZoneCallback<R> RegisterCallbackHandler<R>(
27 Zone self, ZoneDelegate parent, Zone zone, R f()); 26 Zone self, ZoneDelegate parent, Zone zone, R f());
28 /*ABUSE*/ 27 /*ABUSE*/
29 typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>( 28 typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>(
30 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)); 29 Zone self, ZoneDelegate parent, Zone zone, R f(T arg));
31 /*ABUSE*/ 30 /*ABUSE*/
32 typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>( 31 typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>(
33 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)); 32 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2));
34 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent, 33 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
35 Zone zone, Object error, StackTrace stackTrace); 34 Zone zone, Object error, StackTrace stackTrace);
36 typedef void ScheduleMicrotaskHandler( 35 typedef void ScheduleMicrotaskHandler(
37 Zone self, ZoneDelegate parent, Zone zone, void f()); 36 Zone self, ZoneDelegate parent, Zone zone, void f());
38 typedef Timer CreateTimerHandler( 37 typedef Timer CreateTimerHandler(
39 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()); 38 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f());
40 typedef Timer CreatePeriodicTimerHandler( 39 typedef Timer CreatePeriodicTimerHandler(Zone self, ZoneDelegate parent,
41 Zone self, ZoneDelegate parent, Zone zone, 40 Zone zone, Duration period, void f(Timer timer));
42 Duration period, void f(Timer timer));
43 typedef void PrintHandler( 41 typedef void PrintHandler(
44 Zone self, ZoneDelegate parent, Zone zone, String line); 42 Zone self, ZoneDelegate parent, Zone zone, String line);
45 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone, 43 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
46 ZoneSpecification specification, 44 ZoneSpecification specification, Map zoneValues);
47 Map zoneValues);
48 45
49 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */ 46 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
50 class AsyncError implements Error { 47 class AsyncError implements Error {
51 final Object error; 48 final Object error;
52 final StackTrace stackTrace; 49 final StackTrace stackTrace;
53 50
54 AsyncError(this.error, this.stackTrace); 51 AsyncError(this.error, this.stackTrace);
55 52
56 String toString() => '$error'; 53 String toString() => '$error';
57 } 54 }
58 55
59
60 class _ZoneFunction<T extends Function> { 56 class _ZoneFunction<T extends Function> {
61 final _Zone zone; 57 final _Zone zone;
62 final T function; 58 final T function;
63 const _ZoneFunction(this.zone, this.function); 59 const _ZoneFunction(this.zone, this.function);
64 } 60 }
65 61
66 /** 62 /**
67 * This class provides the specification for a forked zone. 63 * This class provides the specification for a forked zone.
68 * 64 *
69 * When forking a new zone (see [Zone.fork]) one can override the default 65 * When forking a new zone (see [Zone.fork]) one can override the default
70 * behavior of the zone by providing callbacks. These callbacks must be 66 * behavior of the zone by providing callbacks. These callbacks must be
71 * given in an instance of this class. 67 * given in an instance of this class.
72 * 68 *
73 * Handlers have the same signature as the same-named methods on [Zone] but 69 * Handlers have the same signature as the same-named methods on [Zone] but
74 * receive three additional arguments: 70 * receive three additional arguments:
75 * 71 *
76 * 1. the zone the handlers are attached to (the "self" zone). 72 * 1. the zone the handlers are attached to (the "self" zone).
77 * 2. a [ZoneDelegate] to the parent zone. 73 * 2. a [ZoneDelegate] to the parent zone.
78 * 3. the zone that first received the request (before the request was 74 * 3. the zone that first received the request (before the request was
79 * bubbled up). 75 * bubbled up).
80 * 76 *
81 * Handlers can either stop propagation the request (by simply not calling the 77 * Handlers can either stop propagation the request (by simply not calling the
82 * parent handler), or forward to the parent zone, potentially modifying the 78 * parent handler), or forward to the parent zone, potentially modifying the
83 * arguments on the way. 79 * arguments on the way.
84 */ 80 */
85 abstract class ZoneSpecification { 81 abstract class ZoneSpecification {
86 /** 82 /**
87 * Creates a specification with the provided handlers. 83 * Creates a specification with the provided handlers.
88 */ 84 */
89 const factory ZoneSpecification({ 85 const factory ZoneSpecification(
90 HandleUncaughtErrorHandler handleUncaughtError, 86 {HandleUncaughtErrorHandler handleUncaughtError,
91 RunHandler run, 87 RunHandler run,
92 RunUnaryHandler runUnary, 88 RunUnaryHandler runUnary,
93 RunBinaryHandler runBinary, 89 RunBinaryHandler runBinary,
94 RegisterCallbackHandler registerCallback, 90 RegisterCallbackHandler registerCallback,
95 RegisterUnaryCallbackHandler registerUnaryCallback, 91 RegisterUnaryCallbackHandler registerUnaryCallback,
96 RegisterBinaryCallbackHandler registerBinaryCallback, 92 RegisterBinaryCallbackHandler registerBinaryCallback,
97 ErrorCallbackHandler errorCallback, 93 ErrorCallbackHandler errorCallback,
98 ScheduleMicrotaskHandler scheduleMicrotask, 94 ScheduleMicrotaskHandler scheduleMicrotask,
99 CreateTimerHandler createTimer, 95 CreateTimerHandler createTimer,
100 CreatePeriodicTimerHandler createPeriodicTimer, 96 CreatePeriodicTimerHandler createPeriodicTimer,
101 PrintHandler print, 97 PrintHandler print,
102 ForkHandler fork 98 ForkHandler fork}) = _ZoneSpecification;
103 }) = _ZoneSpecification;
104 99
105 /** 100 /**
106 * Creates a specification from [other] with the provided handlers overriding 101 * Creates a specification from [other] with the provided handlers overriding
107 * the ones in [other]. 102 * the ones in [other].
108 */ 103 */
109 factory ZoneSpecification.from(ZoneSpecification other, { 104 factory ZoneSpecification.from(ZoneSpecification other,
110 HandleUncaughtErrorHandler handleUncaughtError: null, 105 {HandleUncaughtErrorHandler handleUncaughtError: null,
111 RunHandler run: null, 106 RunHandler run: null,
112 RunUnaryHandler runUnary: null, 107 RunUnaryHandler runUnary: null,
113 RunBinaryHandler runBinary: null, 108 RunBinaryHandler runBinary: null,
114 RegisterCallbackHandler registerCallback: null, 109 RegisterCallbackHandler registerCallback: null,
115 RegisterUnaryCallbackHandler registerUnaryCallback: null, 110 RegisterUnaryCallbackHandler registerUnaryCallback: null,
116 RegisterBinaryCallbackHandler registerBinaryCallback: null, 111 RegisterBinaryCallbackHandler registerBinaryCallback: null,
117 ErrorCallbackHandler errorCallback: null, 112 ErrorCallbackHandler errorCallback: null,
118 ScheduleMicrotaskHandler scheduleMicrotask: null, 113 ScheduleMicrotaskHandler scheduleMicrotask: null,
119 CreateTimerHandler createTimer: null, 114 CreateTimerHandler createTimer: null,
120 CreatePeriodicTimerHandler createPeriodicTimer: null, 115 CreatePeriodicTimerHandler createPeriodicTimer: null,
121 PrintHandler print: null, 116 PrintHandler print: null,
122 ForkHandler fork: null 117 ForkHandler fork: null}) {
123 }) {
124 return new ZoneSpecification( 118 return new ZoneSpecification(
125 handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError, 119 handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError,
126 run: run ?? other.run, 120 run: run ?? other.run,
127 runUnary: runUnary ?? other.runUnary, 121 runUnary: runUnary ?? other.runUnary,
128 runBinary: runBinary ?? other.runBinary, 122 runBinary: runBinary ?? other.runBinary,
129 registerCallback: registerCallback ?? other.registerCallback, 123 registerCallback: registerCallback ?? other.registerCallback,
130 registerUnaryCallback: registerUnaryCallback ?? 124 registerUnaryCallback:
131 other.registerUnaryCallback, 125 registerUnaryCallback ?? other.registerUnaryCallback,
132 registerBinaryCallback: registerBinaryCallback ?? 126 registerBinaryCallback:
133 other.registerBinaryCallback, 127 registerBinaryCallback ?? other.registerBinaryCallback,
134 errorCallback: errorCallback ?? other.errorCallback, 128 errorCallback: errorCallback ?? other.errorCallback,
135 scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask, 129 scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask,
136 createTimer : createTimer ?? other.createTimer, 130 createTimer: createTimer ?? other.createTimer,
137 createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer, 131 createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer,
138 print : print ?? other.print, 132 print: print ?? other.print,
139 fork: fork ?? other.fork); 133 fork: fork ?? other.fork);
140 } 134 }
141 135
142 HandleUncaughtErrorHandler get handleUncaughtError; 136 HandleUncaughtErrorHandler get handleUncaughtError;
143 RunHandler get run; 137 RunHandler get run;
144 RunUnaryHandler get runUnary; 138 RunUnaryHandler get runUnary;
145 RunBinaryHandler get runBinary; 139 RunBinaryHandler get runBinary;
146 RegisterCallbackHandler get registerCallback; 140 RegisterCallbackHandler get registerCallback;
147 RegisterUnaryCallbackHandler get registerUnaryCallback; 141 RegisterUnaryCallbackHandler get registerUnaryCallback;
148 RegisterBinaryCallbackHandler get registerBinaryCallback; 142 RegisterBinaryCallbackHandler get registerBinaryCallback;
149 ErrorCallbackHandler get errorCallback; 143 ErrorCallbackHandler get errorCallback;
150 ScheduleMicrotaskHandler get scheduleMicrotask; 144 ScheduleMicrotaskHandler get scheduleMicrotask;
151 CreateTimerHandler get createTimer; 145 CreateTimerHandler get createTimer;
152 CreatePeriodicTimerHandler get createPeriodicTimer; 146 CreatePeriodicTimerHandler get createPeriodicTimer;
153 PrintHandler get print; 147 PrintHandler get print;
154 ForkHandler get fork; 148 ForkHandler get fork;
155 } 149 }
156 150
157 /** 151 /**
158 * Internal [ZoneSpecification] class. 152 * Internal [ZoneSpecification] class.
159 * 153 *
160 * The implementation wants to rely on the fact that the getters cannot change 154 * The implementation wants to rely on the fact that the getters cannot change
161 * dynamically. We thus require users to go through the redirecting 155 * dynamically. We thus require users to go through the redirecting
162 * [ZoneSpecification] constructor which instantiates this class. 156 * [ZoneSpecification] constructor which instantiates this class.
163 */ 157 */
164 class _ZoneSpecification implements ZoneSpecification { 158 class _ZoneSpecification implements ZoneSpecification {
165 const _ZoneSpecification({ 159 const _ZoneSpecification(
166 this.handleUncaughtError: null, 160 {this.handleUncaughtError: null,
167 this.run: null, 161 this.run: null,
168 this.runUnary: null, 162 this.runUnary: null,
169 this.runBinary: null, 163 this.runBinary: null,
170 this.registerCallback: null, 164 this.registerCallback: null,
171 this.registerUnaryCallback: null, 165 this.registerUnaryCallback: null,
172 this.registerBinaryCallback: null, 166 this.registerBinaryCallback: null,
173 this.errorCallback: null, 167 this.errorCallback: null,
174 this.scheduleMicrotask: null, 168 this.scheduleMicrotask: null,
175 this.createTimer: null, 169 this.createTimer: null,
176 this.createPeriodicTimer: null, 170 this.createPeriodicTimer: null,
177 this.print: null, 171 this.print: null,
178 this.fork: null 172 this.fork: null});
179 });
180 173
181 final HandleUncaughtErrorHandler handleUncaughtError; 174 final HandleUncaughtErrorHandler handleUncaughtError;
182 final RunHandler run; 175 final RunHandler run;
183 final RunUnaryHandler runUnary; 176 final RunUnaryHandler runUnary;
184 final RunBinaryHandler runBinary; 177 final RunBinaryHandler runBinary;
185 final RegisterCallbackHandler registerCallback; 178 final RegisterCallbackHandler registerCallback;
186 final RegisterUnaryCallbackHandler registerUnaryCallback; 179 final RegisterUnaryCallbackHandler registerUnaryCallback;
187 final RegisterBinaryCallbackHandler registerBinaryCallback; 180 final RegisterBinaryCallbackHandler registerBinaryCallback;
188 final ErrorCallbackHandler errorCallback; 181 final ErrorCallbackHandler errorCallback;
189 final ScheduleMicrotaskHandler scheduleMicrotask; 182 final ScheduleMicrotaskHandler scheduleMicrotask;
(...skipping 19 matching lines...) Expand all
209 * 202 *
210 * While zones have access to their parent zone (through [Zone.parent]) it is 203 * While zones have access to their parent zone (through [Zone.parent]) it is
211 * recommended to call the methods on the provided parent delegate for two 204 * recommended to call the methods on the provided parent delegate for two
212 * reasons: 205 * reasons:
213 * 1. the delegate methods take an additional `zone` argument which is the 206 * 1. the delegate methods take an additional `zone` argument which is the
214 * zone the action has been initiated in. 207 * zone the action has been initiated in.
215 * 2. delegate calls are more efficient, since the implementation knows how 208 * 2. delegate calls are more efficient, since the implementation knows how
216 * to skip zones that would just delegate to their parents. 209 * to skip zones that would just delegate to their parents.
217 */ 210 */
218 abstract class ZoneDelegate { 211 abstract class ZoneDelegate {
219 R handleUncaughtError<R>( 212 R handleUncaughtError<R>(Zone zone, error, StackTrace stackTrace);
220 Zone zone, error, StackTrace stackTrace);
221 R run<R>(Zone zone, R f()); 213 R run<R>(Zone zone, R f());
222 R runUnary<R, T>(Zone zone, R f(T arg), T arg); 214 R runUnary<R, T>(Zone zone, R f(T arg), T arg);
223 R runBinary<R, T1, T2>(Zone zone, 215 R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
224 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
225 ZoneCallback<R> registerCallback<R>(Zone zone, R f()); 216 ZoneCallback<R> registerCallback<R>(Zone zone, R f());
226 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( 217 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(Zone zone, R f(T arg));
227 Zone zone, R f(T arg));
228 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( 218 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
229 Zone zone, R f(T1 arg1, T2 arg2)); 219 Zone zone, R f(T1 arg1, T2 arg2));
230 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); 220 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
231 void scheduleMicrotask(Zone zone, void f()); 221 void scheduleMicrotask(Zone zone, void f());
232 Timer createTimer(Zone zone, Duration duration, void f()); 222 Timer createTimer(Zone zone, Duration duration, void f());
233 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); 223 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
234 void print(Zone zone, String line); 224 void print(Zone zone, String line);
235 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); 225 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
236 } 226 }
237 227
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 * inherit the behavior from the parent zone (`this`). 390 * inherit the behavior from the parent zone (`this`).
401 * 391 *
402 * The new zone inherits the stored values (accessed through [[]]) 392 * The new zone inherits the stored values (accessed through [[]])
403 * of this zone and updates them with values from [zoneValues], which either 393 * of this zone and updates them with values from [zoneValues], which either
404 * adds new values or overrides existing ones. 394 * adds new values or overrides existing ones.
405 * 395 *
406 * Note that the fork operation is interceptible. A zone can thus change 396 * Note that the fork operation is interceptible. A zone can thus change
407 * the zone specification (or zone values), giving the forking zone full 397 * the zone specification (or zone values), giving the forking zone full
408 * control over the child zone. 398 * control over the child zone.
409 */ 399 */
410 Zone fork({ZoneSpecification specification, 400 Zone fork({ZoneSpecification specification, Map zoneValues});
411 Map zoneValues});
412 401
413 /** 402 /**
414 * Executes [action] in this zone. 403 * Executes [action] in this zone.
415 * 404 *
416 * By default (as implemented in the [ROOT] zone), runs [action] 405 * By default (as implemented in the [ROOT] zone), runs [action]
417 * with [current] set to this zone. 406 * with [current] set to this zone.
418 * 407 *
419 * If [action] throws, the synchronous exception is not caught by the zone's 408 * If [action] throws, the synchronous exception is not caught by the zone's
420 * error handler. Use [runGuarded] to achieve that. 409 * error handler. Use [runGuarded] to achieve that.
421 * 410 *
(...skipping 11 matching lines...) Expand all
433 */ 422 */
434 R runUnary<R, T>(R action(T argument), T argument); 423 R runUnary<R, T>(R action(T argument), T argument);
435 424
436 /** 425 /**
437 * Executes the given [action] with [argument1] and [argument2] in this 426 * Executes the given [action] with [argument1] and [argument2] in this
438 * zone. 427 * zone.
439 * 428 *
440 * As [run] except that [action] is called with two arguments instead of none. 429 * As [run] except that [action] is called with two arguments instead of none.
441 */ 430 */
442 R runBinary<R, T1, T2>( 431 R runBinary<R, T1, T2>(
443 R action(T1 argument1, T2 argument2), T1 argument1, 432 R action(T1 argument1, T2 argument2), T1 argument1, T2 argument2);
444 T2 argument2);
445 433
446 /** 434 /**
447 * Executes the given [action] in this zone and catches synchronous 435 * Executes the given [action] in this zone and catches synchronous
448 * errors. 436 * errors.
449 * 437 *
450 * This function is equivalent to: 438 * This function is equivalent to:
451 * ``` 439 * ```
452 * try { 440 * try {
453 * return this.run(action); 441 * return this.run(action);
454 * } catch (e, s) { 442 * } catch (e, s) {
455 * return this.handleUncaughtError(e, s); 443 * return this.handleUncaughtError(e, s);
456 * } 444 * }
457 * ``` 445 * ```
458 * 446 *
459 * See [run]. 447 * See [run].
460 */ 448 */
461 R runGuarded<R>(R action()); 449 R runGuarded<R>(R action());
462 450
463 /** 451 /**
464 * Executes the given [action] with [argument] in this zone and 452 * Executes the given [action] with [argument] in this zone and
465 * catches synchronous errors. 453 * catches synchronous errors.
466 * 454 *
467 * See [runGuarded]. 455 * See [runGuarded].
468 */ 456 */
469 R runUnaryGuarded<R, T>(R action(T argument), 457 R runUnaryGuarded<R, T>(R action(T argument), T argument);
470 T argument);
471 458
472 /** 459 /**
473 * Executes the given [action] with [argument1] and [argument2] in this 460 * Executes the given [action] with [argument1] and [argument2] in this
474 * zone and catches synchronous errors. 461 * zone and catches synchronous errors.
475 * 462 *
476 * See [runGuarded]. 463 * See [runGuarded].
477 */ 464 */
478 R runBinaryGuarded<R, T1, T2>( 465 R runBinaryGuarded<R, T1, T2>(
479 R action(T1 argument1, T2 argument2), T1 argument1, 466 R action(T1 argument1, T2 argument2), T1 argument1, T2 argument2);
480 T2 argument2);
481 467
482 /** 468 /**
483 * Registers the given callback in this zone. 469 * Registers the given callback in this zone.
484 * 470 *
485 * When implementing an asynchronous primitive that uses callbacks, the 471 * When implementing an asynchronous primitive that uses callbacks, the
486 * callback must be registered using [registerCallback] at the point where the 472 * callback must be registered using [registerCallback] at the point where the
487 * user provides the callback. This allows zones to record other information 473 * user provides the callback. This allows zones to record other information
488 * that they need at the same time, perhaps even wrapping the callback, so 474 * that they need at the same time, perhaps even wrapping the callback, so
489 * that the callback is prepared when it is later run in the same zones 475 * that the callback is prepared when it is later run in the same zones
490 * (using [run]). For example, a zone may decide 476 * (using [run]). For example, a zone may decide
491 * to store the stack trace (at the time of the registration) with the 477 * to store the stack trace (at the time of the registration) with the
492 * callback. 478 * callback.
493 * 479 *
494 * Returns the callback that should be used in place of the provided 480 * Returns the callback that should be used in place of the provided
495 * [callback]. Frequently zones simply return the original callback. 481 * [callback]. Frequently zones simply return the original callback.
496 * 482 *
497 * Custom zones may intercept this operation. The default implementation in 483 * Custom zones may intercept this operation. The default implementation in
498 * [Zone.ROOT] returns the original callback unchanged. 484 * [Zone.ROOT] returns the original callback unchanged.
499 */ 485 */
500 ZoneCallback<R> registerCallback<R>(R callback()); 486 ZoneCallback<R> registerCallback<R>(R callback());
501 487
502 /** 488 /**
503 * Registers the given callback in this zone. 489 * Registers the given callback in this zone.
504 * 490 *
505 * Similar to [registerCallback] but with a unary callback. 491 * Similar to [registerCallback] but with a unary callback.
506 */ 492 */
507 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( 493 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(R callback(T arg));
508 R callback(T arg));
509 494
510 /** 495 /**
511 * Registers the given callback in this zone. 496 * Registers the given callback in this zone.
512 * 497 *
513 * Similar to [registerCallback] but with a unary callback. 498 * Similar to [registerCallback] but with a unary callback.
514 */ 499 */
515 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( 500 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
516 R callback(T1 arg1, T2 arg2)); 501 R callback(T1 arg1, T2 arg2));
517 502
518 /** 503 /**
519 * Equivalent to: 504 * Equivalent to:
520 * 505 *
521 * ZoneCallback registered = this.registerCallback(action); 506 * ZoneCallback registered = this.registerCallback(action);
522 * if (runGuarded) return () => this.runGuarded(registered); 507 * if (runGuarded) return () => this.runGuarded(registered);
523 * return () => this.run(registered); 508 * return () => this.run(registered);
524 * 509 *
525 */ 510 */
526 ZoneCallback<R> bindCallback<R>( 511 ZoneCallback<R> bindCallback<R>(R action(), {bool runGuarded: true});
527 R action(), { bool runGuarded: true });
528 512
529 /** 513 /**
530 * Equivalent to: 514 * Equivalent to:
531 * 515 *
532 * ZoneCallback registered = this.registerUnaryCallback(action); 516 * ZoneCallback registered = this.registerUnaryCallback(action);
533 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg); 517 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg);
534 * return (arg) => thin.runUnary(registered, arg); 518 * return (arg) => thin.runUnary(registered, arg);
535 */ 519 */
536 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( 520 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>(R action(T argument),
537 R action(T argument), { bool runGuarded: true }); 521 {bool runGuarded: true});
538 522
539 /** 523 /**
540 * Equivalent to: 524 * Equivalent to:
541 * 525 *
542 * ZoneCallback registered = registerBinaryCallback(action); 526 * ZoneCallback registered = registerBinaryCallback(action);
543 * if (runGuarded) { 527 * if (runGuarded) {
544 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg); 528 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg);
545 * } 529 * }
546 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2); 530 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2);
547 */ 531 */
548 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( 532 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>(
549 R action(T1 argument1, T2 argument2), 533 R action(T1 argument1, T2 argument2),
550 { bool runGuarded: true }); 534 {bool runGuarded: true});
551 535
552 /** 536 /**
553 * Intercepts errors when added programatically to a `Future` or `Stream`. 537 * Intercepts errors when added programatically to a `Future` or `Stream`.
554 * 538 *
555 * When calling [Completer.completeError], [Stream.addError], 539 * When calling [Completer.completeError], [Stream.addError],
556 * or some [Future] constructors, the current zone is allowed to intercept 540 * or some [Future] constructors, the current zone is allowed to intercept
557 * and replace the error. 541 * and replace the error.
558 * 542 *
559 * Future constructors invoke this function when the error is received 543 * Future constructors invoke this function when the error is received
560 * directly, for example with [Future.error], or when the error is caught 544 * directly, for example with [Future.error], or when the error is caught
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 ZoneDelegate _parentDelegate(_Zone zone) { 649 ZoneDelegate _parentDelegate(_Zone zone) {
666 if (zone.parent == null) return null; 650 if (zone.parent == null) return null;
667 return zone.parent._delegate; 651 return zone.parent._delegate;
668 } 652 }
669 653
670 class _ZoneDelegate implements ZoneDelegate { 654 class _ZoneDelegate implements ZoneDelegate {
671 final _Zone _delegationTarget; 655 final _Zone _delegationTarget;
672 656
673 _ZoneDelegate(this._delegationTarget); 657 _ZoneDelegate(this._delegationTarget);
674 658
675 R handleUncaughtError<R>( 659 R handleUncaughtError<R>(Zone zone, error, StackTrace stackTrace) {
676 Zone zone, error, StackTrace stackTrace) {
677 var implementation = _delegationTarget._handleUncaughtError; 660 var implementation = _delegationTarget._handleUncaughtError;
678 _Zone implZone = implementation.zone; 661 _Zone implZone = implementation.zone;
679 HandleUncaughtErrorHandler handler = implementation.function; 662 HandleUncaughtErrorHandler handler = implementation.function;
680 // TODO(floitsch): make this a generic method call on '<R>' once it's 663 // TODO(floitsch): make this a generic method call on '<R>' once it's
681 // supported. Remove the unnecessary cast. 664 // supported. Remove the unnecessary cast.
682 return handler( 665 return handler(implZone, _parentDelegate(implZone), zone, error, stackTrace)
683 implZone, _parentDelegate(implZone), zone, error, stackTrace)
684 as Object/*=R*/; 666 as Object/*=R*/;
685 } 667 }
686 668
687 R run<R>(Zone zone, R f()) { 669 R run<R>(Zone zone, R f()) {
688 var implementation = _delegationTarget._run; 670 var implementation = _delegationTarget._run;
689 _Zone implZone = implementation.zone; 671 _Zone implZone = implementation.zone;
690 RunHandler handler = implementation.function; 672 RunHandler handler = implementation.function;
691 // TODO(floitsch): make this a generic method call on '<R>' once it's 673 // TODO(floitsch): make this a generic method call on '<R>' once it's
692 // supported. Remove the unnecessary cast. 674 // supported. Remove the unnecessary cast.
693 return handler(implZone, _parentDelegate(implZone), zone, f) 675 return handler(implZone, _parentDelegate(implZone), zone, f)
694 as Object/*=R*/; 676 as Object/*=R*/;
695 } 677 }
696 678
697 R runUnary<R, T>(Zone zone, R f(T arg), T arg) { 679 R runUnary<R, T>(Zone zone, R f(T arg), T arg) {
698 var implementation = _delegationTarget._runUnary; 680 var implementation = _delegationTarget._runUnary;
699 _Zone implZone = implementation.zone; 681 _Zone implZone = implementation.zone;
700 RunUnaryHandler handler = implementation.function; 682 RunUnaryHandler handler = implementation.function;
701 // TODO(floitsch): make this a generic method call on '<R, T>' once it's 683 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
702 // supported. Remove the unnecessary cast. 684 // supported. Remove the unnecessary cast.
703 return handler( 685 return handler(implZone, _parentDelegate(implZone), zone, f, arg)
704 implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/; 686 as Object/*=R*/;
705 } 687 }
706 688
707 R runBinary<R, T1, T2>(Zone zone, 689 R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
708 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
709 var implementation = _delegationTarget._runBinary; 690 var implementation = _delegationTarget._runBinary;
710 _Zone implZone = implementation.zone; 691 _Zone implZone = implementation.zone;
711 RunBinaryHandler handler = implementation.function; 692 RunBinaryHandler handler = implementation.function;
712 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once 693 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
713 // it's supported. Remove the unnecessary cast. 694 // it's supported. Remove the unnecessary cast.
714 return handler( 695 return handler(implZone, _parentDelegate(implZone), zone, f, arg1, arg2)
715 implZone, _parentDelegate(implZone), zone, f, arg1, arg2)
716 as Object/*=R*/; 696 as Object/*=R*/;
717 } 697 }
718 698
719 ZoneCallback<R> registerCallback<R>(Zone zone, R f()) { 699 ZoneCallback<R> registerCallback<R>(Zone zone, R f()) {
720 var implementation = _delegationTarget._registerCallback; 700 var implementation = _delegationTarget._registerCallback;
721 _Zone implZone = implementation.zone; 701 _Zone implZone = implementation.zone;
722 RegisterCallbackHandler handler = implementation.function; 702 RegisterCallbackHandler handler = implementation.function;
723 // TODO(floitsch): make this a generic method call on '<R>' once it's 703 // TODO(floitsch): make this a generic method call on '<R>' once it's
724 // supported. Remove the unnecessary cast. 704 // supported. Remove the unnecessary cast.
725 return handler(implZone, _parentDelegate(implZone), zone, f) 705 return handler(implZone, _parentDelegate(implZone), zone, f)
726 as Object/*=ZoneCallback<R>*/; 706 as Object/*=ZoneCallback<R>*/;
727 } 707 }
728 708
729 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( 709 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(Zone zone, R f(T arg)) {
730 Zone zone, R f(T arg)) {
731 var implementation = _delegationTarget._registerUnaryCallback; 710 var implementation = _delegationTarget._registerUnaryCallback;
732 _Zone implZone = implementation.zone; 711 _Zone implZone = implementation.zone;
733 RegisterUnaryCallbackHandler handler = implementation.function; 712 RegisterUnaryCallbackHandler handler = implementation.function;
734 // TODO(floitsch): make this a generic method call on '<R, T>' once it's 713 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
735 // supported. Remove the unnecessary cast. 714 // supported. Remove the unnecessary cast.
736 return handler(implZone, _parentDelegate(implZone), zone, f) 715 return handler(implZone, _parentDelegate(implZone), zone, f)
737 as Object/*=ZoneUnaryCallback<R, T>*/; 716 as Object/*=ZoneUnaryCallback<R, T>*/;
738 } 717 }
739 718
740 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( 719 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
741 Zone zone, R f(T1 arg1, T2 arg2)) { 720 Zone zone, R f(T1 arg1, T2 arg2)) {
742 var implementation = _delegationTarget._registerBinaryCallback; 721 var implementation = _delegationTarget._registerBinaryCallback;
743 _Zone implZone = implementation.zone; 722 _Zone implZone = implementation.zone;
744 RegisterBinaryCallbackHandler handler = implementation.function; 723 RegisterBinaryCallbackHandler handler = implementation.function;
745 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once 724 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
746 // it's supported. Remove the unnecessary cast. 725 // it's supported. Remove the unnecessary cast.
747 return handler(implZone, _parentDelegate(implZone), zone, f) 726 return handler(implZone, _parentDelegate(implZone), zone, f)
748 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; 727 as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
749 } 728 }
750 729
751 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { 730 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
752 var implementation = _delegationTarget._errorCallback; 731 var implementation = _delegationTarget._errorCallback;
753 _Zone implZone = implementation.zone; 732 _Zone implZone = implementation.zone;
754 if (identical(implZone, _ROOT_ZONE)) return null; 733 if (identical(implZone, _ROOT_ZONE)) return null;
755 ErrorCallbackHandler handler = implementation.function; 734 ErrorCallbackHandler handler = implementation.function;
756 return handler(implZone, _parentDelegate(implZone), zone, 735 return handler(
757 error, stackTrace); 736 implZone, _parentDelegate(implZone), zone, error, stackTrace);
758 } 737 }
759 738
760 void scheduleMicrotask(Zone zone, f()) { 739 void scheduleMicrotask(Zone zone, f()) {
761 var implementation = _delegationTarget._scheduleMicrotask; 740 var implementation = _delegationTarget._scheduleMicrotask;
762 _Zone implZone = implementation.zone; 741 _Zone implZone = implementation.zone;
763 ScheduleMicrotaskHandler handler = implementation.function; 742 ScheduleMicrotaskHandler handler = implementation.function;
764 handler(implZone, _parentDelegate(implZone), zone, f); 743 handler(implZone, _parentDelegate(implZone), zone, f);
765 } 744 }
766 745
767 Timer createTimer(Zone zone, Duration duration, void f()) { 746 Timer createTimer(Zone zone, Duration duration, void f()) {
(...skipping 10 matching lines...) Expand all
778 return handler(implZone, _parentDelegate(implZone), zone, period, f); 757 return handler(implZone, _parentDelegate(implZone), zone, period, f);
779 } 758 }
780 759
781 void print(Zone zone, String line) { 760 void print(Zone zone, String line) {
782 var implementation = _delegationTarget._print; 761 var implementation = _delegationTarget._print;
783 _Zone implZone = implementation.zone; 762 _Zone implZone = implementation.zone;
784 PrintHandler handler = implementation.function; 763 PrintHandler handler = implementation.function;
785 handler(implZone, _parentDelegate(implZone), zone, line); 764 handler(implZone, _parentDelegate(implZone), zone, line);
786 } 765 }
787 766
788 Zone fork(Zone zone, ZoneSpecification specification, 767 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues) {
789 Map zoneValues) {
790 var implementation = _delegationTarget._fork; 768 var implementation = _delegationTarget._fork;
791 _Zone implZone = implementation.zone; 769 _Zone implZone = implementation.zone;
792 ForkHandler handler = implementation.function; 770 ForkHandler handler = implementation.function;
793 return handler( 771 return handler(
794 implZone, _parentDelegate(implZone), zone, specification, zoneValues); 772 implZone, _parentDelegate(implZone), zone, specification, zoneValues);
795 } 773 }
796 } 774 }
797 775
798
799 /** 776 /**
800 * Base class for Zone implementations. 777 * Base class for Zone implementations.
801 */ 778 */
802 abstract class _Zone implements Zone { 779 abstract class _Zone implements Zone {
803 const _Zone(); 780 const _Zone();
804 781
805 _ZoneFunction<RunHandler> get _run; 782 _ZoneFunction<RunHandler> get _run;
806 _ZoneFunction<RunUnaryHandler> get _runUnary; 783 _ZoneFunction<RunUnaryHandler> get _runUnary;
807 _ZoneFunction<RunBinaryHandler> get _runBinary; 784 _ZoneFunction<RunBinaryHandler> get _runBinary;
808 _ZoneFunction<RegisterCallbackHandler> get _registerCallback; 785 _ZoneFunction<RegisterCallbackHandler> get _registerCallback;
809 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback; 786 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback;
810 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback; 787 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback;
811 _ZoneFunction<ErrorCallbackHandler> get _errorCallback; 788 _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
812 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask; 789 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
813 _ZoneFunction<CreateTimerHandler> get _createTimer; 790 _ZoneFunction<CreateTimerHandler> get _createTimer;
814 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer; 791 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer;
815 _ZoneFunction<PrintHandler> get _print; 792 _ZoneFunction<PrintHandler> get _print;
816 _ZoneFunction<ForkHandler> get _fork; 793 _ZoneFunction<ForkHandler> get _fork;
817 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError; 794 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError;
818 _Zone get parent; 795 _Zone get parent;
819 ZoneDelegate get _delegate; 796 ZoneDelegate get _delegate;
820 Map get _map; 797 Map get _map;
821 798
822 bool inSameErrorZone(Zone otherZone) { 799 bool inSameErrorZone(Zone otherZone) {
823 return identical(this, otherZone) || 800 return identical(this, otherZone) ||
824 identical(errorZone, otherZone.errorZone); 801 identical(errorZone, otherZone.errorZone);
825 } 802 }
826 } 803 }
827 804
828 class _CustomZone extends _Zone { 805 class _CustomZone extends _Zone {
829 // The actual zone and implementation of each of these 806 // The actual zone and implementation of each of these
830 // inheritable zone functions. 807 // inheritable zone functions.
831 _ZoneFunction<RunHandler> _run; 808 _ZoneFunction<RunHandler> _run;
832 _ZoneFunction<RunUnaryHandler> _runUnary; 809 _ZoneFunction<RunUnaryHandler> _runUnary;
833 _ZoneFunction<RunBinaryHandler> _runBinary; 810 _ZoneFunction<RunBinaryHandler> _runBinary;
834 _ZoneFunction<RegisterCallbackHandler> _registerCallback; 811 _ZoneFunction<RegisterCallbackHandler> _registerCallback;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 } 905 }
929 906
930 R runUnaryGuarded<R, T>(R f(T arg), T arg) { 907 R runUnaryGuarded<R, T>(R f(T arg), T arg) {
931 try { 908 try {
932 return runUnary(f, arg); 909 return runUnary(f, arg);
933 } catch (e, s) { 910 } catch (e, s) {
934 return handleUncaughtError(e, s); 911 return handleUncaughtError(e, s);
935 } 912 }
936 } 913 }
937 914
938 R runBinaryGuarded<R, T1, T2>( 915 R runBinaryGuarded<R, T1, T2>(R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
939 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
940 try { 916 try {
941 return runBinary(f, arg1, arg2); 917 return runBinary(f, arg1, arg2);
942 } catch (e, s) { 918 } catch (e, s) {
943 return handleUncaughtError(e, s); 919 return handleUncaughtError(e, s);
944 } 920 }
945 } 921 }
946 922
947 ZoneCallback<R> bindCallback<R>( 923 ZoneCallback<R> bindCallback<R>(R f(), {bool runGuarded: true}) {
948 R f(), { bool runGuarded: true }) {
949 var registered = registerCallback(f); 924 var registered = registerCallback(f);
950 if (runGuarded) { 925 if (runGuarded) {
951 return () => this.runGuarded(registered); 926 return () => this.runGuarded(registered);
952 } else { 927 } else {
953 return () => this.run(registered); 928 return () => this.run(registered);
954 } 929 }
955 } 930 }
956 931
957 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( 932 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>(R f(T arg),
958 R f(T arg), { bool runGuarded: true }) { 933 {bool runGuarded: true}) {
959 var registered = registerUnaryCallback(f); 934 var registered = registerUnaryCallback(f);
960 if (runGuarded) { 935 if (runGuarded) {
961 return (arg) => this.runUnaryGuarded(registered, arg); 936 return (arg) => this.runUnaryGuarded(registered, arg);
962 } else { 937 } else {
963 return (arg) => this.runUnary(registered, arg); 938 return (arg) => this.runUnary(registered, arg);
964 } 939 }
965 } 940 }
966 941
967 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( 942 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>(
968 R f(T1 arg1, T2 arg2), { bool runGuarded: true }) { 943 R f(T1 arg1, T2 arg2),
944 {bool runGuarded: true}) {
969 var registered = registerBinaryCallback(f); 945 var registered = registerBinaryCallback(f);
970 if (runGuarded) { 946 if (runGuarded) {
971 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2); 947 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2);
972 } else { 948 } else {
973 return (arg1, arg2) => this.runBinary(registered, arg1, arg2); 949 return (arg1, arg2) => this.runBinary(registered, arg1, arg2);
974 } 950 }
975 } 951 }
976 952
977 operator [](Object key) { 953 operator [](Object key) {
978 var result = _map[key]; 954 var result = _map[key];
(...skipping 16 matching lines...) Expand all
995 971
996 // Methods that can be customized by the zone specification. 972 // Methods that can be customized by the zone specification.
997 973
998 R handleUncaughtError<R>(error, StackTrace stackTrace) { 974 R handleUncaughtError<R>(error, StackTrace stackTrace) {
999 var implementation = this._handleUncaughtError; 975 var implementation = this._handleUncaughtError;
1000 assert(implementation != null); 976 assert(implementation != null);
1001 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 977 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1002 HandleUncaughtErrorHandler handler = implementation.function; 978 HandleUncaughtErrorHandler handler = implementation.function;
1003 // TODO(floitsch): make this a generic method call on '<R>' once it's 979 // TODO(floitsch): make this a generic method call on '<R>' once it's
1004 // supported. Remove the unnecessary cast. 980 // supported. Remove the unnecessary cast.
1005 return handler( 981 return handler(implementation.zone, parentDelegate, this, error, stackTrace)
1006 implementation.zone, parentDelegate, this, error, stackTrace)
1007 as Object/*=R*/; 982 as Object/*=R*/;
1008 } 983 }
1009 984
1010 Zone fork({ZoneSpecification specification, Map zoneValues}) { 985 Zone fork({ZoneSpecification specification, Map zoneValues}) {
1011 var implementation = this._fork; 986 var implementation = this._fork;
1012 assert(implementation != null); 987 assert(implementation != null);
1013 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 988 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1014 ForkHandler handler = implementation.function; 989 ForkHandler handler = implementation.function;
1015 return handler(implementation.zone, parentDelegate, this, 990 return handler(
1016 specification, zoneValues); 991 implementation.zone, parentDelegate, this, specification, zoneValues);
1017 } 992 }
1018 993
1019 R run<R>(R f()) { 994 R run<R>(R f()) {
1020 var implementation = this._run; 995 var implementation = this._run;
1021 assert(implementation != null); 996 assert(implementation != null);
1022 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 997 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1023 RunHandler handler = implementation.function; 998 RunHandler handler = implementation.function;
1024 // TODO(floitsch): make this a generic method call on '<R>' once it's 999 // TODO(floitsch): make this a generic method call on '<R>' once it's
1025 // supported. Remove the unnecessary cast. 1000 // supported. Remove the unnecessary cast.
1026 return handler(implementation.zone, parentDelegate, this, f) 1001 return handler(implementation.zone, parentDelegate, this, f)
1027 as Object/*=R*/; 1002 as Object/*=R*/;
1028 } 1003 }
1029 1004
1030 R runUnary<R, T>(R f(T arg), T arg) { 1005 R runUnary<R, T>(R f(T arg), T arg) {
1031 var implementation = this._runUnary; 1006 var implementation = this._runUnary;
1032 assert(implementation != null); 1007 assert(implementation != null);
1033 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1008 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1034 RunUnaryHandler handler = implementation.function; 1009 RunUnaryHandler handler = implementation.function;
1035 // TODO(floitsch): make this a generic method call on '<R, T>' once it's 1010 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
1036 // supported. Remove the unnecessary cast. 1011 // supported. Remove the unnecessary cast.
1037 return handler(implementation.zone, parentDelegate, this, f, arg) 1012 return handler(implementation.zone, parentDelegate, this, f, arg)
1038 as Object/*=R*/; 1013 as Object/*=R*/;
1039 } 1014 }
1040 1015
1041 R runBinary<R, T1, T2>( 1016 R runBinary<R, T1, T2>(R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1042 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1043 var implementation = this._runBinary; 1017 var implementation = this._runBinary;
1044 assert(implementation != null); 1018 assert(implementation != null);
1045 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1019 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1046 RunBinaryHandler handler = implementation.function; 1020 RunBinaryHandler handler = implementation.function;
1047 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once 1021 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
1048 // it's supported. Remove the unnecessary cast. 1022 // it's supported. Remove the unnecessary cast.
1049 return handler( 1023 return handler(implementation.zone, parentDelegate, this, f, arg1, arg2)
1050 implementation.zone, parentDelegate, this, f, arg1, arg2)
1051 as Object/*=R*/; 1024 as Object/*=R*/;
1052 } 1025 }
1053 1026
1054 ZoneCallback<R> registerCallback<R>(R callback()) { 1027 ZoneCallback<R> registerCallback<R>(R callback()) {
1055 var implementation = this._registerCallback; 1028 var implementation = this._registerCallback;
1056 assert(implementation != null); 1029 assert(implementation != null);
1057 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1030 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1058 RegisterCallbackHandler handler = implementation.function; 1031 RegisterCallbackHandler handler = implementation.function;
1059 // TODO(floitsch): make this a generic method call on '<R>' once it's 1032 // TODO(floitsch): make this a generic method call on '<R>' once it's
1060 // supported. Remove the unnecessary cast. 1033 // supported. Remove the unnecessary cast.
1061 return handler(implementation.zone, parentDelegate, this, callback) 1034 return handler(implementation.zone, parentDelegate, this, callback)
1062 as Object/*=ZoneCallback<R>*/; 1035 as Object/*=ZoneCallback<R>*/;
1063 } 1036 }
1064 1037
1065 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( 1038 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(R callback(T arg)) {
1066 R callback(T arg)) {
1067 var implementation = this._registerUnaryCallback; 1039 var implementation = this._registerUnaryCallback;
1068 assert(implementation != null); 1040 assert(implementation != null);
1069 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1041 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1070 RegisterUnaryCallbackHandler handler = implementation.function; 1042 RegisterUnaryCallbackHandler handler = implementation.function;
1071 // TODO(floitsch): make this a generic method call on '<R, T>' once it's 1043 // TODO(floitsch): make this a generic method call on '<R, T>' once it's
1072 // supported. Remove the unnecessary cast. 1044 // supported. Remove the unnecessary cast.
1073 return handler(implementation.zone, parentDelegate, this, callback) 1045 return handler(implementation.zone, parentDelegate, this, callback)
1074 as Object/*=ZoneUnaryCallback<R, T>*/; 1046 as Object/*=ZoneUnaryCallback<R, T>*/;
1075 } 1047 }
1076 1048
1077 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( 1049 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
1078 R callback(T1 arg1, T2 arg2)) { 1050 R callback(T1 arg1, T2 arg2)) {
1079 var implementation = this._registerBinaryCallback; 1051 var implementation = this._registerBinaryCallback;
1080 assert(implementation != null); 1052 assert(implementation != null);
1081 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1053 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1082 RegisterBinaryCallbackHandler handler = implementation.function; 1054 RegisterBinaryCallbackHandler handler = implementation.function;
1083 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once 1055 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
1084 // it's supported. Remove the unnecessary cast. 1056 // it's supported. Remove the unnecessary cast.
1085 return handler(implementation.zone, parentDelegate, this, callback) 1057 return handler(implementation.zone, parentDelegate, this, callback)
1086 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; 1058 as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
1087 } 1059 }
1088 1060
1089 AsyncError errorCallback(Object error, StackTrace stackTrace) { 1061 AsyncError errorCallback(Object error, StackTrace stackTrace) {
1090 var implementation = this._errorCallback; 1062 var implementation = this._errorCallback;
1091 assert(implementation != null); 1063 assert(implementation != null);
1092 final Zone implementationZone = implementation.zone; 1064 final Zone implementationZone = implementation.zone;
1093 if (identical(implementationZone, _ROOT_ZONE)) return null; 1065 if (identical(implementationZone, _ROOT_ZONE)) return null;
1094 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone); 1066 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone);
1095 ErrorCallbackHandler handler = implementation.function; 1067 ErrorCallbackHandler handler = implementation.function;
1096 return handler( 1068 return handler(implementationZone, parentDelegate, this, error, stackTrace);
1097 implementationZone, parentDelegate, this, error, stackTrace);
1098 } 1069 }
1099 1070
1100 void scheduleMicrotask(void f()) { 1071 void scheduleMicrotask(void f()) {
1101 var implementation = this._scheduleMicrotask; 1072 var implementation = this._scheduleMicrotask;
1102 assert(implementation != null); 1073 assert(implementation != null);
1103 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1074 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1104 ScheduleMicrotaskHandler handler = implementation.function; 1075 ScheduleMicrotaskHandler handler = implementation.function;
1105 return handler(implementation.zone, parentDelegate, this, f); 1076 return handler(implementation.zone, parentDelegate, this, f);
1106 } 1077 }
1107 1078
1108 Timer createTimer(Duration duration, void f()) { 1079 Timer createTimer(Duration duration, void f()) {
1109 var implementation = this._createTimer; 1080 var implementation = this._createTimer;
1110 assert(implementation != null); 1081 assert(implementation != null);
1111 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1082 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1112 CreateTimerHandler handler = implementation.function; 1083 CreateTimerHandler handler = implementation.function;
1113 return handler(implementation.zone, parentDelegate, this, duration, f); 1084 return handler(implementation.zone, parentDelegate, this, duration, f);
1114 } 1085 }
1115 1086
1116 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { 1087 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
1117 var implementation = this._createPeriodicTimer; 1088 var implementation = this._createPeriodicTimer;
1118 assert(implementation != null); 1089 assert(implementation != null);
1119 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1090 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1120 CreatePeriodicTimerHandler handler = implementation.function; 1091 CreatePeriodicTimerHandler handler = implementation.function;
1121 return handler( 1092 return handler(implementation.zone, parentDelegate, this, duration, f);
1122 implementation.zone, parentDelegate, this, duration, f);
1123 } 1093 }
1124 1094
1125 void print(String line) { 1095 void print(String line) {
1126 var implementation = this._print; 1096 var implementation = this._print;
1127 assert(implementation != null); 1097 assert(implementation != null);
1128 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); 1098 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
1129 PrintHandler handler = implementation.function; 1099 PrintHandler handler = implementation.function;
1130 return handler(implementation.zone, parentDelegate, this, line); 1100 return handler(implementation.zone, parentDelegate, this, line);
1131 } 1101 }
1132 } 1102 }
(...skipping 13 matching lines...) Expand all
1146 if (Zone._current == zone) return f(); 1116 if (Zone._current == zone) return f();
1147 1117
1148 Zone old = Zone._enter(zone); 1118 Zone old = Zone._enter(zone);
1149 try { 1119 try {
1150 return f(); 1120 return f();
1151 } finally { 1121 } finally {
1152 Zone._leave(old); 1122 Zone._leave(old);
1153 } 1123 }
1154 } 1124 }
1155 1125
1156 R _rootRunUnary<R, T>(Zone self, ZoneDelegate parent, Zone zone, 1126 R _rootRunUnary<R, T>(
1157 R f(T arg), T arg) { 1127 Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) {
1158 if (Zone._current == zone) return f(arg); 1128 if (Zone._current == zone) return f(arg);
1159 1129
1160 Zone old = Zone._enter(zone); 1130 Zone old = Zone._enter(zone);
1161 try { 1131 try {
1162 return f(arg); 1132 return f(arg);
1163 } finally { 1133 } finally {
1164 Zone._leave(old); 1134 Zone._leave(old);
1165 } 1135 }
1166 } 1136 }
1167 1137
(...skipping 13 matching lines...) Expand all
1181 Zone self, ZoneDelegate parent, Zone zone, R f()) { 1151 Zone self, ZoneDelegate parent, Zone zone, R f()) {
1182 return f; 1152 return f;
1183 } 1153 }
1184 1154
1185 ZoneUnaryCallback<R, T> _rootRegisterUnaryCallback<R, T>( 1155 ZoneUnaryCallback<R, T> _rootRegisterUnaryCallback<R, T>(
1186 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)) { 1156 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)) {
1187 return f; 1157 return f;
1188 } 1158 }
1189 1159
1190 ZoneBinaryCallback<R, T1, T2> _rootRegisterBinaryCallback<R, T1, T2>( 1160 ZoneBinaryCallback<R, T1, T2> _rootRegisterBinaryCallback<R, T1, T2>(
1191 Zone self, ZoneDelegate parent, Zone zone, 1161 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)) {
1192 R f(T1 arg1, T2 arg2)) {
1193 return f; 1162 return f;
1194 } 1163 }
1195 1164
1196 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone, 1165 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
1197 Object error, StackTrace stackTrace) => null; 1166 Object error, StackTrace stackTrace) =>
1167 null;
1198 1168
1199 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { 1169 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) {
1200 if (!identical(_ROOT_ZONE, zone)) { 1170 if (!identical(_ROOT_ZONE, zone)) {
1201 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); 1171 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone);
1202 f = zone.bindCallback(f, runGuarded: hasErrorHandler); 1172 f = zone.bindCallback(f, runGuarded: hasErrorHandler);
1203 // Use root zone as event zone if the function is already bound. 1173 // Use root zone as event zone if the function is already bound.
1204 zone = _ROOT_ZONE; 1174 zone = _ROOT_ZONE;
1205 } 1175 }
1206 _scheduleAsyncCallback(f); 1176 _scheduleAsyncCallback(f);
1207 } 1177 }
1208 1178
1209 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, 1179 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone,
1210 Duration duration, void callback()) { 1180 Duration duration, void callback()) {
1211 if (!identical(_ROOT_ZONE, zone)) { 1181 if (!identical(_ROOT_ZONE, zone)) {
1212 callback = zone.bindCallback(callback); 1182 callback = zone.bindCallback(callback);
1213 } 1183 }
1214 return Timer._createTimer(duration, callback); 1184 return Timer._createTimer(duration, callback);
1215 } 1185 }
1216 1186
1217 Timer _rootCreatePeriodicTimer( 1187 Timer _rootCreatePeriodicTimer(Zone self, ZoneDelegate parent, Zone zone,
1218 Zone self, ZoneDelegate parent, Zone zone,
1219 Duration duration, void callback(Timer timer)) { 1188 Duration duration, void callback(Timer timer)) {
1220 if (!identical(_ROOT_ZONE, zone)) { 1189 if (!identical(_ROOT_ZONE, zone)) {
1221 // TODO(floitsch): the return type should be 'void'. 1190 // TODO(floitsch): the return type should be 'void'.
1222 callback = zone.bindUnaryCallback<dynamic, Timer>(callback); 1191 callback = zone.bindUnaryCallback<dynamic, Timer>(callback);
1223 } 1192 }
1224 return Timer._createPeriodicTimer(duration, callback); 1193 return Timer._createPeriodicTimer(duration, callback);
1225 } 1194 }
1226 1195
1227 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { 1196 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
1228 printToConsole(line); 1197 printToConsole(line);
1229 } 1198 }
1230 1199
1231 void _printToZone(String line) { 1200 void _printToZone(String line) {
1232 Zone.current.print(line); 1201 Zone.current.print(line);
1233 } 1202 }
1234 1203
1235 Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone, 1204 Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone,
1236 ZoneSpecification specification, 1205 ZoneSpecification specification, Map zoneValues) {
1237 Map zoneValues) {
1238 // TODO(floitsch): it would be nice if we could get rid of this hack. 1206 // TODO(floitsch): it would be nice if we could get rid of this hack.
1239 // Change the static zoneOrDirectPrint function to go through zones 1207 // Change the static zoneOrDirectPrint function to go through zones
1240 // from now on. 1208 // from now on.
1241 printToZone = _printToZone; 1209 printToZone = _printToZone;
1242 1210
1243 if (specification == null) { 1211 if (specification == null) {
1244 specification = const ZoneSpecification(); 1212 specification = const ZoneSpecification();
1245 } else if (specification is! _ZoneSpecification) { 1213 } else if (specification is! _ZoneSpecification) {
1246 throw new ArgumentError("ZoneSpecifications must be instantiated" 1214 throw new ArgumentError("ZoneSpecifications must be instantiated"
1247 " with the provided constructor."); 1215 " with the provided constructor.");
(...skipping 30 matching lines...) Expand all
1278 const _ZoneFunction<RegisterBinaryCallbackHandler>( 1246 const _ZoneFunction<RegisterBinaryCallbackHandler>(
1279 _ROOT_ZONE, _rootRegisterBinaryCallback); 1247 _ROOT_ZONE, _rootRegisterBinaryCallback);
1280 _ZoneFunction<ErrorCallbackHandler> get _errorCallback => 1248 _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
1281 const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback); 1249 const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback);
1282 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask => 1250 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
1283 const _ZoneFunction<ScheduleMicrotaskHandler>( 1251 const _ZoneFunction<ScheduleMicrotaskHandler>(
1284 _ROOT_ZONE, _rootScheduleMicrotask); 1252 _ROOT_ZONE, _rootScheduleMicrotask);
1285 _ZoneFunction<CreateTimerHandler> get _createTimer => 1253 _ZoneFunction<CreateTimerHandler> get _createTimer =>
1286 const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer); 1254 const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer);
1287 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer => 1255 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer =>
1288 const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePer iodicTimer); 1256 const _ZoneFunction<CreatePeriodicTimerHandler>(
1257 _ROOT_ZONE, _rootCreatePeriodicTimer);
1289 _ZoneFunction<PrintHandler> get _print => 1258 _ZoneFunction<PrintHandler> get _print =>
1290 const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint); 1259 const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint);
1291 _ZoneFunction<ForkHandler> get _fork => 1260 _ZoneFunction<ForkHandler> get _fork =>
1292 const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork); 1261 const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork);
1293 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError => 1262 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError =>
1294 const _ZoneFunction<HandleUncaughtErrorHandler>( 1263 const _ZoneFunction<HandleUncaughtErrorHandler>(
1295 _ROOT_ZONE, _rootHandleUncaughtError); 1264 _ROOT_ZONE, _rootHandleUncaughtError);
1296 1265
1297 // The parent zone. 1266 // The parent zone.
1298 _Zone get parent => null; 1267 _Zone get parent => null;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 try { 1305 try {
1337 if (identical(_ROOT_ZONE, Zone._current)) { 1306 if (identical(_ROOT_ZONE, Zone._current)) {
1338 return f(arg); 1307 return f(arg);
1339 } 1308 }
1340 return _rootRunUnary<R, T>(null, null, this, f, arg); 1309 return _rootRunUnary<R, T>(null, null, this, f, arg);
1341 } catch (e, s) { 1310 } catch (e, s) {
1342 return handleUncaughtError<R>(e, s); 1311 return handleUncaughtError<R>(e, s);
1343 } 1312 }
1344 } 1313 }
1345 1314
1346 R runBinaryGuarded<R, T1, T2>( 1315 R runBinaryGuarded<R, T1, T2>(R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1347 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1348 try { 1316 try {
1349 if (identical(_ROOT_ZONE, Zone._current)) { 1317 if (identical(_ROOT_ZONE, Zone._current)) {
1350 return f(arg1, arg2); 1318 return f(arg1, arg2);
1351 } 1319 }
1352 return _rootRunBinary<R, T1, T2>(null, null, this, f, arg1, arg2); 1320 return _rootRunBinary<R, T1, T2>(null, null, this, f, arg1, arg2);
1353 } catch (e, s) { 1321 } catch (e, s) {
1354 return handleUncaughtError<R>(e, s); 1322 return handleUncaughtError<R>(e, s);
1355 } 1323 }
1356 } 1324 }
1357 1325
1358 ZoneCallback<R> bindCallback<R>( 1326 ZoneCallback<R> bindCallback<R>(R f(), {bool runGuarded: true}) {
1359 R f(), { bool runGuarded: true }) {
1360 if (runGuarded) { 1327 if (runGuarded) {
1361 return () => this.runGuarded<R>(f); 1328 return () => this.runGuarded<R>(f);
1362 } else { 1329 } else {
1363 return () => this.run<R>(f); 1330 return () => this.run<R>(f);
1364 } 1331 }
1365 } 1332 }
1366 1333
1367 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( 1334 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>(R f(T arg),
1368 R f(T arg), { bool runGuarded: true }) { 1335 {bool runGuarded: true}) {
1369 if (runGuarded) { 1336 if (runGuarded) {
1370 return (arg) => this.runUnaryGuarded<R, T>(f, arg); 1337 return (arg) => this.runUnaryGuarded<R, T>(f, arg);
1371 } else { 1338 } else {
1372 return (arg) => this.runUnary<R, T>(f, arg); 1339 return (arg) => this.runUnary<R, T>(f, arg);
1373 } 1340 }
1374 } 1341 }
1375 1342
1376 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( 1343 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>(
1377 R f(T1 arg1, T2 arg2), { bool runGuarded: true }) { 1344 R f(T1 arg1, T2 arg2),
1345 {bool runGuarded: true}) {
1378 if (runGuarded) { 1346 if (runGuarded) {
1379 return (arg1, arg2) => 1347 return (arg1, arg2) => this.runBinaryGuarded<R, T1, T2>(f, arg1, arg2);
1380 this.runBinaryGuarded<R, T1, T2>(f, arg1, arg2);
1381 } else { 1348 } else {
1382 return (arg1, arg2) => this.runBinary<R, T1, T2>(f, arg1, arg2); 1349 return (arg1, arg2) => this.runBinary<R, T1, T2>(f, arg1, arg2);
1383 } 1350 }
1384 } 1351 }
1385 1352
1386 operator [](Object key) => null; 1353 operator [](Object key) => null;
1387 1354
1388 // Methods that can be customized by the zone specification. 1355 // Methods that can be customized by the zone specification.
1389 1356
1390 R handleUncaughtError<R>(error, StackTrace stackTrace) { 1357 R handleUncaughtError<R>(error, StackTrace stackTrace) {
1391 return _rootHandleUncaughtError(null, null, this, error, stackTrace); 1358 return _rootHandleUncaughtError(null, null, this, error, stackTrace);
1392 } 1359 }
1393 1360
1394 Zone fork({ZoneSpecification specification, Map zoneValues}) { 1361 Zone fork({ZoneSpecification specification, Map zoneValues}) {
1395 return _rootFork(null, null, this, specification, zoneValues); 1362 return _rootFork(null, null, this, specification, zoneValues);
1396 } 1363 }
1397 1364
1398 R run<R>(R f()) { 1365 R run<R>(R f()) {
1399 if (identical(Zone._current, _ROOT_ZONE)) return f(); 1366 if (identical(Zone._current, _ROOT_ZONE)) return f();
1400 return _rootRun(null, null, this, f); 1367 return _rootRun(null, null, this, f);
1401 } 1368 }
1402 1369
1403 R runUnary<R, T>(R f(T arg), T arg) { 1370 R runUnary<R, T>(R f(T arg), T arg) {
1404 if (identical(Zone._current, _ROOT_ZONE)) return f(arg); 1371 if (identical(Zone._current, _ROOT_ZONE)) return f(arg);
1405 return _rootRunUnary(null, null, this, f, arg); 1372 return _rootRunUnary(null, null, this, f, arg);
1406 } 1373 }
1407 1374
1408 R runBinary<R, T1, T2>( 1375 R runBinary<R, T1, T2>(R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1409 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) {
1410 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2); 1376 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2);
1411 return _rootRunBinary(null, null, this, f, arg1, arg2); 1377 return _rootRunBinary(null, null, this, f, arg1, arg2);
1412 } 1378 }
1413 1379
1414 ZoneCallback<R> registerCallback<R>(R f()) => f; 1380 ZoneCallback<R> registerCallback<R>(R f()) => f;
1415 1381
1416 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( 1382 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>(R f(T arg)) => f;
1417 R f(T arg)) => f;
1418 1383
1419 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( 1384 ZoneBinaryCallback<R, T1, T2>
1420 R f(T1 arg1, T2 arg2)) => f; 1385 registerBinaryCallback<R, T1, T2>(R f(T1 arg1, T2 arg2)) => f;
1421 1386
1422 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; 1387 AsyncError errorCallback(Object error, StackTrace stackTrace) => null;
1423 1388
1424 void scheduleMicrotask(void f()) { 1389 void scheduleMicrotask(void f()) {
1425 _rootScheduleMicrotask(null, null, this, f); 1390 _rootScheduleMicrotask(null, null, this, f);
1426 } 1391 }
1427 1392
1428 Timer createTimer(Duration duration, void f()) { 1393 Timer createTimer(Duration duration, void f()) {
1429 return Timer._createTimer(duration, f); 1394 return Timer._createTimer(duration, f);
1430 } 1395 }
(...skipping 28 matching lines...) Expand all
1459 * }, onError: (e) { print("unused error handler"); }); 1424 * }, onError: (e) { print("unused error handler"); });
1460 * }, onError: (e) { print("catches error of first error-zone."); }); 1425 * }, onError: (e) { print("catches error of first error-zone."); });
1461 * 1426 *
1462 * Example: 1427 * Example:
1463 * 1428 *
1464 * runZoned(() { 1429 * runZoned(() {
1465 * new Future(() { throw "asynchronous error"; }); 1430 * new Future(() { throw "asynchronous error"; });
1466 * }, onError: print); // Will print "asynchronous error". 1431 * }, onError: print); // Will print "asynchronous error".
1467 */ 1432 */
1468 R runZoned<R>(R body(), 1433 R runZoned<R>(R body(),
1469 { Map zoneValues, 1434 {Map zoneValues, ZoneSpecification zoneSpecification, Function onError}) {
1470 ZoneSpecification zoneSpecification,
1471 Function onError }) {
1472 HandleUncaughtErrorHandler errorHandler; 1435 HandleUncaughtErrorHandler errorHandler;
1473 if (onError != null) { 1436 if (onError != null) {
1474 errorHandler = (Zone self, ZoneDelegate parent, Zone zone, 1437 errorHandler = (Zone self, ZoneDelegate parent, Zone zone, error,
1475 error, StackTrace stackTrace) { 1438 StackTrace stackTrace) {
1476 try { 1439 try {
1477 if (onError is ZoneBinaryCallback<R, dynamic, StackTrace>) { 1440 if (onError is ZoneBinaryCallback<R, dynamic, StackTrace>) {
1478 return self.parent.runBinary(onError, error, stackTrace); 1441 return self.parent.runBinary(onError, error, stackTrace);
1479 } 1442 }
1480 return self.parent.runUnary(onError, error); 1443 return self.parent.runUnary(onError, error);
1481 } catch(e, s) { 1444 } catch (e, s) {
1482 if (identical(e, error)) { 1445 if (identical(e, error)) {
1483 return parent.handleUncaughtError(zone, error, stackTrace); 1446 return parent.handleUncaughtError(zone, error, stackTrace);
1484 } else { 1447 } else {
1485 return parent.handleUncaughtError(zone, e, s); 1448 return parent.handleUncaughtError(zone, e, s);
1486 } 1449 }
1487 } 1450 }
1488 }; 1451 };
1489 } 1452 }
1490 if (zoneSpecification == null) { 1453 if (zoneSpecification == null) {
1491 zoneSpecification = 1454 zoneSpecification =
1492 new ZoneSpecification(handleUncaughtError: errorHandler); 1455 new ZoneSpecification(handleUncaughtError: errorHandler);
1493 } else if (errorHandler != null) { 1456 } else if (errorHandler != null) {
1494 zoneSpecification = 1457 zoneSpecification = new ZoneSpecification.from(zoneSpecification,
1495 new ZoneSpecification.from(zoneSpecification, 1458 handleUncaughtError: errorHandler);
1496 handleUncaughtError: errorHandler);
1497 } 1459 }
1498 Zone zone = Zone.current.fork(specification: zoneSpecification, 1460 Zone zone = Zone.current
1499 zoneValues: zoneValues); 1461 .fork(specification: zoneSpecification, zoneValues: zoneValues);
1500 if (onError != null) { 1462 if (onError != null) {
1501 return zone.runGuarded(body); 1463 return zone.runGuarded(body);
1502 } else { 1464 } else {
1503 return zone.run(body); 1465 return zone.run(body);
1504 } 1466 }
1505 } 1467 }
OLDNEW
« no previous file with comments | « sdk/lib/async/timer.dart ('k') | sdk/lib/collection/collection.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698