OLD | NEW |
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 /// *Experimental*. Might disappear without warning. | |
12 typedef T TaskCreate<T, S extends TaskSpecification>( | |
13 S specification, Zone zone); | |
14 /// *Experimental*. Might disappear without warning. | |
15 typedef void TaskRun<T, A>(T task, A arg); | |
16 | |
17 | |
18 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic | 11 // TODO(floitsch): we are abusing generic typedefs as typedefs for generic |
19 // functions. | 12 // functions. |
20 /*ABUSE*/ | 13 /*ABUSE*/ |
21 typedef R HandleUncaughtErrorHandler<R>( | 14 typedef R HandleUncaughtErrorHandler<R>( |
22 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace); | 15 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace); |
23 /*ABUSE*/ | 16 /*ABUSE*/ |
24 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()); |
25 /*ABUSE*/ | 18 /*ABUSE*/ |
26 typedef R RunUnaryHandler<R, T>( | 19 typedef R RunUnaryHandler<R, T>( |
27 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); |
28 /*ABUSE*/ | 21 /*ABUSE*/ |
29 typedef R RunBinaryHandler<R, T1, T2>( | 22 typedef R RunBinaryHandler<R, T1, T2>( |
30 Zone self, ZoneDelegate parent, Zone zone, | 23 Zone self, ZoneDelegate parent, Zone zone, |
31 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2); | 24 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2); |
32 /*ABUSE*/ | 25 /*ABUSE*/ |
33 typedef ZoneCallback<R> RegisterCallbackHandler<R>( | 26 typedef ZoneCallback<R> RegisterCallbackHandler<R>( |
34 Zone self, ZoneDelegate parent, Zone zone, R f()); | 27 Zone self, ZoneDelegate parent, Zone zone, R f()); |
35 /*ABUSE*/ | 28 /*ABUSE*/ |
36 typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>( | 29 typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>( |
37 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)); | 30 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)); |
38 /*ABUSE*/ | 31 /*ABUSE*/ |
39 typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>( | 32 typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>( |
40 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)); | 33 Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)); |
41 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent, | 34 typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent, |
42 Zone zone, Object error, StackTrace stackTrace); | 35 Zone zone, Object error, StackTrace stackTrace); |
43 /// *Experimental*. Might disappear without warning. | |
44 /*ABUSE*/ | |
45 typedef T CreateTaskHandler<T, S extends TaskSpecification>( | |
46 Zone self, ZoneDelegate parent, Zone zone, | |
47 TaskCreate<T, S> create, S taskSpecification); | |
48 /// *Experimental*. Might disappear without warning. | |
49 /*ABUSE*/ | |
50 typedef void RunTaskHandler<T, A>(Zone self, ZoneDelegate parent, Zone zone, | |
51 TaskRun<T, A> run, T task, A arg); | |
52 typedef void ScheduleMicrotaskHandler( | 36 typedef void ScheduleMicrotaskHandler( |
53 Zone self, ZoneDelegate parent, Zone zone, void f()); | 37 Zone self, ZoneDelegate parent, Zone zone, void f()); |
| 38 typedef Timer CreateTimerHandler( |
| 39 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()); |
| 40 typedef Timer CreatePeriodicTimerHandler( |
| 41 Zone self, ZoneDelegate parent, Zone zone, |
| 42 Duration period, void f(Timer timer)); |
54 typedef void PrintHandler( | 43 typedef void PrintHandler( |
55 Zone self, ZoneDelegate parent, Zone zone, String line); | 44 Zone self, ZoneDelegate parent, Zone zone, String line); |
56 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone, | 45 typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone, |
57 ZoneSpecification specification, | 46 ZoneSpecification specification, |
58 Map zoneValues); | 47 Map zoneValues); |
59 | 48 |
60 // The following typedef declarations are used by functionality which | |
61 // will be removed and replaced by tasksif the task experiment is successful. | |
62 typedef Timer CreateTimerHandler( | |
63 Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()); | |
64 typedef Timer CreatePeriodicTimerHandler( | |
65 Zone self, ZoneDelegate parent, Zone zone, | |
66 Duration period, void f(Timer timer)); | |
67 | |
68 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */ | 49 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */ |
69 class AsyncError implements Error { | 50 class AsyncError implements Error { |
70 final Object error; | 51 final Object error; |
71 final StackTrace stackTrace; | 52 final StackTrace stackTrace; |
72 | 53 |
73 AsyncError(this.error, this.stackTrace); | 54 AsyncError(this.error, this.stackTrace); |
74 | 55 |
75 String toString() => '$error'; | 56 String toString() => '$error'; |
76 } | 57 } |
77 | 58 |
78 /** | |
79 * A task specification contains the necessary information to create a task. | |
80 * | |
81 * See [Zone.createTask] for how a specification is used to create a task. | |
82 * | |
83 * Task specifications should be public and it should be possible to create | |
84 * new instances as a user. That is, custom zones should be able to replace | |
85 * an existing specification with a modified one. | |
86 * | |
87 * *Experimental*. This class might disappear without warning. | |
88 */ | |
89 abstract class TaskSpecification { | |
90 /** | |
91 * Description of the task. | |
92 * | |
93 * This string is unused by the root-zone, but might be used for debugging, | |
94 * and testing. As such, it should be relatively unique in its category. | |
95 * | |
96 * As a general guideline we recommend: "package-name.library.action". | |
97 */ | |
98 String get name; | |
99 | |
100 /** | |
101 * Whether the scheduled task triggers at most once. | |
102 * | |
103 * If the task is not a one-shot task, it may need to be canceled to prevent | |
104 * further iterations of the task. | |
105 */ | |
106 bool get isOneShot; | |
107 } | |
108 | 59 |
109 class _ZoneFunction<T extends Function> { | 60 class _ZoneFunction<T extends Function> { |
110 final _Zone zone; | 61 final _Zone zone; |
111 final T function; | 62 final T function; |
112 | |
113 const _ZoneFunction(this.zone, this.function); | 63 const _ZoneFunction(this.zone, this.function); |
114 } | 64 } |
115 | 65 |
116 /** | 66 /** |
117 * This class provides the specification for a forked zone. | 67 * This class provides the specification for a forked zone. |
118 * | 68 * |
119 * 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 |
120 * behavior of the zone by providing callbacks. These callbacks must be | 70 * behavior of the zone by providing callbacks. These callbacks must be |
121 * given in an instance of this class. | 71 * given in an instance of this class. |
122 * | 72 * |
123 * 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 |
124 * receive three additional arguments: | 74 * receive three additional arguments: |
125 * | 75 * |
126 * 1. the zone the handlers are attached to (the "self" zone). | 76 * 1. the zone the handlers are attached to (the "self" zone). |
127 * 2. a [ZoneDelegate] to the parent zone. | 77 * 2. a [ZoneDelegate] to the parent zone. |
128 * 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 |
129 * bubbled up). | 79 * bubbled up). |
130 * | 80 * |
131 * 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 |
132 * parent handler), or forward to the parent zone, potentially modifying the | 82 * parent handler), or forward to the parent zone, potentially modifying the |
133 * arguments on the way. | 83 * arguments on the way. |
134 */ | 84 */ |
135 abstract class ZoneSpecification { | 85 abstract class ZoneSpecification { |
136 /** | 86 /** |
137 * Creates a specification with the provided handlers. | 87 * Creates a specification with the provided handlers. |
138 * | |
139 * The task-related parameters ([createTask] and [runTask]) are experimental | |
140 * and might be removed without warning. | |
141 */ | 88 */ |
142 const factory ZoneSpecification({ | 89 const factory ZoneSpecification({ |
143 HandleUncaughtErrorHandler handleUncaughtError, | 90 HandleUncaughtErrorHandler handleUncaughtError, |
144 RunHandler run, | 91 RunHandler run, |
145 RunUnaryHandler runUnary, | 92 RunUnaryHandler runUnary, |
146 RunBinaryHandler runBinary, | 93 RunBinaryHandler runBinary, |
147 RegisterCallbackHandler registerCallback, | 94 RegisterCallbackHandler registerCallback, |
148 RegisterUnaryCallbackHandler registerUnaryCallback, | 95 RegisterUnaryCallbackHandler registerUnaryCallback, |
149 RegisterBinaryCallbackHandler registerBinaryCallback, | 96 RegisterBinaryCallbackHandler registerBinaryCallback, |
150 ErrorCallbackHandler errorCallback, | 97 ErrorCallbackHandler errorCallback, |
151 ScheduleMicrotaskHandler scheduleMicrotask, | 98 ScheduleMicrotaskHandler scheduleMicrotask, |
152 CreateTaskHandler createTask, | |
153 RunTaskHandler runTask, | |
154 // TODO(floitsch): mark as deprecated once tasks are non-experimental. | |
155 CreateTimerHandler createTimer, | 99 CreateTimerHandler createTimer, |
156 // TODO(floitsch): mark as deprecated once tasks are non-experimental. | |
157 CreatePeriodicTimerHandler createPeriodicTimer, | 100 CreatePeriodicTimerHandler createPeriodicTimer, |
158 PrintHandler print, | 101 PrintHandler print, |
159 ForkHandler fork | 102 ForkHandler fork |
160 }) = _ZoneSpecification; | 103 }) = _ZoneSpecification; |
161 | 104 |
162 /** | 105 /** |
163 * Creates a specification from [other] with the provided handlers overriding | 106 * Creates a specification from [other] with the provided handlers overriding |
164 * the ones in [other]. | 107 * the ones in [other]. |
165 * | |
166 * The task-related parameters ([createTask] and [runTask]) are experimental | |
167 * and might be removed without warning. | |
168 */ | 108 */ |
169 factory ZoneSpecification.from(ZoneSpecification other, { | 109 factory ZoneSpecification.from(ZoneSpecification other, { |
170 HandleUncaughtErrorHandler handleUncaughtError: null, | 110 HandleUncaughtErrorHandler handleUncaughtError: null, |
171 RunHandler run: null, | 111 RunHandler run: null, |
172 RunUnaryHandler runUnary: null, | 112 RunUnaryHandler runUnary: null, |
173 RunBinaryHandler runBinary: null, | 113 RunBinaryHandler runBinary: null, |
174 RegisterCallbackHandler registerCallback: null, | 114 RegisterCallbackHandler registerCallback: null, |
175 RegisterUnaryCallbackHandler registerUnaryCallback: null, | 115 RegisterUnaryCallbackHandler registerUnaryCallback: null, |
176 RegisterBinaryCallbackHandler registerBinaryCallback: null, | 116 RegisterBinaryCallbackHandler registerBinaryCallback: null, |
177 ErrorCallbackHandler errorCallback: null, | 117 ErrorCallbackHandler errorCallback: null, |
178 ScheduleMicrotaskHandler scheduleMicrotask: null, | 118 ScheduleMicrotaskHandler scheduleMicrotask: null, |
179 CreateTaskHandler createTask: null, | |
180 RunTaskHandler runTask: null, | |
181 // TODO(floitsch): mark as deprecated once tasks are non-experimental. | |
182 CreateTimerHandler createTimer: null, | 119 CreateTimerHandler createTimer: null, |
183 // TODO(floitsch): mark as deprecated once tasks are non-experimental. | |
184 CreatePeriodicTimerHandler createPeriodicTimer: null, | 120 CreatePeriodicTimerHandler createPeriodicTimer: null, |
185 PrintHandler print: null, | 121 PrintHandler print: null, |
186 ForkHandler fork: null | 122 ForkHandler fork: null |
187 }) { | 123 }) { |
188 return new ZoneSpecification( | 124 return new ZoneSpecification( |
189 handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError, | 125 handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError, |
190 run: run ?? other.run, | 126 run: run ?? other.run, |
191 runUnary: runUnary ?? other.runUnary, | 127 runUnary: runUnary ?? other.runUnary, |
192 runBinary: runBinary ?? other.runBinary, | 128 runBinary: runBinary ?? other.runBinary, |
193 registerCallback: registerCallback ?? other.registerCallback, | 129 registerCallback: registerCallback ?? other.registerCallback, |
194 registerUnaryCallback: registerUnaryCallback ?? | 130 registerUnaryCallback: registerUnaryCallback ?? |
195 other.registerUnaryCallback, | 131 other.registerUnaryCallback, |
196 registerBinaryCallback: registerBinaryCallback ?? | 132 registerBinaryCallback: registerBinaryCallback ?? |
197 other.registerBinaryCallback, | 133 other.registerBinaryCallback, |
198 errorCallback: errorCallback ?? other.errorCallback, | 134 errorCallback: errorCallback ?? other.errorCallback, |
199 | |
200 createTask: createTask ?? other.createTask, | |
201 runTask: runTask ?? other.runTask, | |
202 print : print ?? other.print, | |
203 fork: fork ?? other.fork, | |
204 scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask, | 135 scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask, |
205 createTimer : createTimer ?? other.createTimer, | 136 createTimer : createTimer ?? other.createTimer, |
206 createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer); | 137 createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer, |
| 138 print : print ?? other.print, |
| 139 fork: fork ?? other.fork); |
207 } | 140 } |
208 | 141 |
209 HandleUncaughtErrorHandler get handleUncaughtError; | 142 HandleUncaughtErrorHandler get handleUncaughtError; |
210 RunHandler get run; | 143 RunHandler get run; |
211 RunUnaryHandler get runUnary; | 144 RunUnaryHandler get runUnary; |
212 RunBinaryHandler get runBinary; | 145 RunBinaryHandler get runBinary; |
213 RegisterCallbackHandler get registerCallback; | 146 RegisterCallbackHandler get registerCallback; |
214 RegisterUnaryCallbackHandler get registerUnaryCallback; | 147 RegisterUnaryCallbackHandler get registerUnaryCallback; |
215 RegisterBinaryCallbackHandler get registerBinaryCallback; | 148 RegisterBinaryCallbackHandler get registerBinaryCallback; |
216 ErrorCallbackHandler get errorCallback; | 149 ErrorCallbackHandler get errorCallback; |
217 ScheduleMicrotaskHandler get scheduleMicrotask; | 150 ScheduleMicrotaskHandler get scheduleMicrotask; |
218 /// *Experimental*. Might disappear without warning. | 151 CreateTimerHandler get createTimer; |
219 CreateTaskHandler get createTask; | 152 CreatePeriodicTimerHandler get createPeriodicTimer; |
220 /// *Experimental*. Might disappear without warning. | |
221 RunTaskHandler get runTask; | |
222 PrintHandler get print; | 153 PrintHandler get print; |
223 ForkHandler get fork; | 154 ForkHandler get fork; |
224 | |
225 // TODO(floitsch): deprecate once tasks are non-experimental. | |
226 CreateTimerHandler get createTimer; | |
227 // TODO(floitsch): deprecate once tasks are non-experimental. | |
228 CreatePeriodicTimerHandler get createPeriodicTimer; | |
229 } | 155 } |
230 | 156 |
231 /** | 157 /** |
232 * Internal [ZoneSpecification] class. | 158 * Internal [ZoneSpecification] class. |
233 * | 159 * |
234 * The implementation wants to rely on the fact that the getters cannot change | 160 * The implementation wants to rely on the fact that the getters cannot change |
235 * dynamically. We thus require users to go through the redirecting | 161 * dynamically. We thus require users to go through the redirecting |
236 * [ZoneSpecification] constructor which instantiates this class. | 162 * [ZoneSpecification] constructor which instantiates this class. |
237 */ | 163 */ |
238 class _ZoneSpecification implements ZoneSpecification { | 164 class _ZoneSpecification implements ZoneSpecification { |
239 const _ZoneSpecification({ | 165 const _ZoneSpecification({ |
240 this.handleUncaughtError: null, | 166 this.handleUncaughtError: null, |
241 this.run: null, | 167 this.run: null, |
242 this.runUnary: null, | 168 this.runUnary: null, |
243 this.runBinary: null, | 169 this.runBinary: null, |
244 this.registerCallback: null, | 170 this.registerCallback: null, |
245 this.registerUnaryCallback: null, | 171 this.registerUnaryCallback: null, |
246 this.registerBinaryCallback: null, | 172 this.registerBinaryCallback: null, |
247 this.errorCallback: null, | 173 this.errorCallback: null, |
248 this.scheduleMicrotask: null, | 174 this.scheduleMicrotask: null, |
249 this.createTask: null, | 175 this.createTimer: null, |
250 this.runTask: null, | 176 this.createPeriodicTimer: null, |
251 this.print: null, | 177 this.print: null, |
252 this.fork: null, | 178 this.fork: null |
253 // TODO(floitsch): deprecate once tasks are non-experimental. | |
254 this.createTimer: null, | |
255 // TODO(floitsch): deprecate once tasks are non-experimental. | |
256 this.createPeriodicTimer: null | |
257 }); | 179 }); |
258 | 180 |
259 final HandleUncaughtErrorHandler handleUncaughtError; | 181 final HandleUncaughtErrorHandler handleUncaughtError; |
260 final RunHandler run; | 182 final RunHandler run; |
261 final RunUnaryHandler runUnary; | 183 final RunUnaryHandler runUnary; |
262 final RunBinaryHandler runBinary; | 184 final RunBinaryHandler runBinary; |
263 final RegisterCallbackHandler registerCallback; | 185 final RegisterCallbackHandler registerCallback; |
264 final RegisterUnaryCallbackHandler registerUnaryCallback; | 186 final RegisterUnaryCallbackHandler registerUnaryCallback; |
265 final RegisterBinaryCallbackHandler registerBinaryCallback; | 187 final RegisterBinaryCallbackHandler registerBinaryCallback; |
266 final ErrorCallbackHandler errorCallback; | 188 final ErrorCallbackHandler errorCallback; |
267 final ScheduleMicrotaskHandler scheduleMicrotask; | 189 final ScheduleMicrotaskHandler scheduleMicrotask; |
268 final CreateTaskHandler createTask; | 190 final CreateTimerHandler createTimer; |
269 final RunTaskHandler runTask; | 191 final CreatePeriodicTimerHandler createPeriodicTimer; |
270 final PrintHandler print; | 192 final PrintHandler print; |
271 final ForkHandler fork; | 193 final ForkHandler fork; |
272 | |
273 // TODO(floitsch): deprecate once tasks are non-experimental. | |
274 final CreateTimerHandler createTimer; | |
275 // TODO(floitsch): deprecate once tasks are non-experimental. | |
276 final CreatePeriodicTimerHandler createPeriodicTimer; | |
277 } | 194 } |
278 | 195 |
279 /** | 196 /** |
280 * This class wraps zones for delegation. | 197 * This class wraps zones for delegation. |
281 * | 198 * |
282 * 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 |
283 * exposed functions (like [Zone.run]), but one needs to provide more | 200 * exposed functions (like [Zone.run]), but one needs to provide more |
284 * information (like the zone the `run` was initiated). Zone callbacks thus | 201 * information (like the zone the `run` was initiated). Zone callbacks thus |
285 * receive more information including this [ZoneDelegate] class. When delegating | 202 * receive more information including this [ZoneDelegate] class. When delegating |
286 * 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 |
287 * directly invoking the parent zone. | 204 * directly invoking the parent zone. |
288 */ | 205 */ |
289 abstract class ZoneDelegate { | 206 abstract class ZoneDelegate { |
290 /*=R*/ handleUncaughtError/*<R>*/( | 207 /*=R*/ handleUncaughtError/*<R>*/( |
291 Zone zone, error, StackTrace stackTrace); | 208 Zone zone, error, StackTrace stackTrace); |
292 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()); | 209 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()); |
293 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg); | 210 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg); |
294 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, | 211 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, |
295 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); | 212 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); |
296 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()); | 213 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()); |
297 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 214 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
298 Zone zone, /*=R*/ f(/*=T*/ arg)); | 215 Zone zone, /*=R*/ f(/*=T*/ arg)); |
299 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 216 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
300 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)); | 217 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)); |
301 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); | 218 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); |
302 void scheduleMicrotask(Zone zone, void f()); | 219 void scheduleMicrotask(Zone zone, void f()); |
303 | 220 Timer createTimer(Zone zone, Duration duration, void f()); |
304 /// *Experimental*. Might disappear without notice. | 221 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); |
305 Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/( | |
306 Zone zone, TaskCreate/*<T, S>*/ create, | |
307 TaskSpecification/*=S*/ specification); | |
308 /// *Experimental*. Might disappear without notice. | |
309 void runTask/*<T, A>*/( | |
310 Zone zone, TaskRun/*<T, A>*/ run, Object/*=T*/ task, | |
311 Object/*=A*/ argument); | |
312 | |
313 void print(Zone zone, String line); | 222 void print(Zone zone, String line); |
314 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); | 223 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); |
315 | |
316 // TODO(floitsch): deprecate once tasks are non-experimental. | |
317 Timer createTimer(Zone zone, Duration duration, void f()); | |
318 // TODO(floitsch): deprecate once tasks are non-experimental. | |
319 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); | |
320 } | 224 } |
321 | 225 |
322 /** | 226 /** |
323 * A Zone represents the asynchronous version of a dynamic extent. Asynchronous | 227 * A Zone represents the asynchronous version of a dynamic extent. Asynchronous |
324 * 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, |
325 * 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 |
326 * the `then` was invoked. | 230 * the `then` was invoked. |
327 */ | 231 */ |
328 abstract class Zone { | 232 abstract class Zone { |
329 // 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. |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 * If the [AsyncError.error] is `null`, it is replaced by a [NullThrownError]. | 404 * If the [AsyncError.error] is `null`, it is replaced by a [NullThrownError]. |
501 */ | 405 */ |
502 AsyncError errorCallback(Object error, StackTrace stackTrace); | 406 AsyncError errorCallback(Object error, StackTrace stackTrace); |
503 | 407 |
504 /** | 408 /** |
505 * Runs [f] asynchronously in this zone. | 409 * Runs [f] asynchronously in this zone. |
506 */ | 410 */ |
507 void scheduleMicrotask(void f()); | 411 void scheduleMicrotask(void f()); |
508 | 412 |
509 /** | 413 /** |
510 * Creates a task in the current zone. | |
511 * | |
512 * A task represents an asynchronous operation or process that reports back | |
513 * through the event loop. | |
514 * | |
515 * This function allows the zone to intercept the initialization of the | |
516 * task while the [runTask] function is invoked when the task reports back. | |
517 * | |
518 * By default, in the root zone, the [create] function is invoked with the | |
519 * [specification] as argument. It returns a task object which is used for all | |
520 * future interactions between the zone and the task. The object is | |
521 * a unique instance representing the task. It is generally returned to | |
522 * whoever initiated the task. | |
523 * For example, the HTML library uses the returned [StreamSubscription] as | |
524 * task object when users register an event listener. | |
525 * | |
526 * Tasks are created when the program starts an operation that reports back | |
527 * through the event loop. For example, a timer or an HTTP request both | |
528 * return through the event loop and are therefore tasks. | |
529 * | |
530 * If the [create] function is not invoked (because a custom zone has | |
531 * replaced or intercepted it), then the operation is *not* started. This | |
532 * means that a custom zone can intercept tasks, like HTTP requests. | |
533 * | |
534 * A task goes through the following steps: | |
535 * - a user invokes a library function that should eventually return through | |
536 * the event loop. | |
537 * - the library function creates a [TaskSpecification] that contains the | |
538 * necessary information to start the operation, and invokes | |
539 * `Zone.current.createTask` with the specification and a [create] closure. | |
540 * The closure, when invoked, uses the specification to start the operation | |
541 * (usually by interacting with the underlying system, or as a native | |
542 * extension), and returns a task object that identifies the running task. | |
543 * - custom zones handle the request and (unless completely intercepted and | |
544 * aborted), end up calling the root zone's [createTask] which runs the | |
545 * provided `create` closure, which may have been replaced at this point. | |
546 * - later, the asynchronous operation returns through the event loop. | |
547 * It invokes [Zone.runTask] on the zone in which the task should run | |
548 * (and which was originally passed to the `create` function by | |
549 * `createTask`). The [runTask] function receives the | |
550 * task object, a `run` function and an argument. As before, custom zones | |
551 * may intercept this call. Eventually (unless aborted), the `run` function | |
552 * is invoked. This last step may happen multiple times for tasks that are | |
553 * not oneshot tasks (see [ZoneSpecification.isOneShot]). | |
554 * | |
555 * Custom zones may replace the [specification] with a different one, thus | |
556 * modifying the task parameters. An operation that wishes to be an | |
557 * interceptable task must publicly specify the types that intercepting code | |
558 * sees: | |
559 * - The specification type (extending [TaskSpecification]) which holds the | |
560 * information available when intercepting the `createTask` call. | |
561 * - The task object type, returned by `createTask` and [create]. This object | |
562 * may simply be typed as [Object]. | |
563 * - The argument type, if [runTask] takes a meaningful argument. | |
564 * | |
565 * *Experimental*. Might disappear without notice. | |
566 */ | |
567 Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/( | |
568 /*=T*/ create(TaskSpecification/*=S*/ specification, Zone zone), | |
569 TaskSpecification/*=S*/ specification); | |
570 | |
571 /** | |
572 * Runs a task callback. | |
573 * | |
574 * This function is invoked when an operation, started through [createTask], | |
575 * generates an event. | |
576 * | |
577 * Generally, tasks schedule Dart code in the global event loop when the | |
578 * [createTask] function is invoked. Since the | |
579 * event loop does not expect any return value from the code it runs, the | |
580 * [runTask] function is a void function. | |
581 * | |
582 * The [task] object must be the same as the one created with [createTask]. | |
583 * | |
584 * It is good practice that task operations provide a meaningful [argument], | |
585 * so that custom zones can interact with it. They might want to log or | |
586 * replace the argument before calling the [run] function. | |
587 * | |
588 * See [createTask]. | |
589 * | |
590 * *Experimental*. Might disappear without notice. | |
591 */ | |
592 void runTask/*<T, A>*/( | |
593 /*=T*/ run(/*=T*/ task, /*=A*/ argument), Object/*=T*/ task, | |
594 Object/*=A*/ argument); | |
595 | |
596 /** | |
597 * Creates a Timer where the callback is executed in this zone. | 414 * Creates a Timer where the callback is executed in this zone. |
598 */ | 415 */ |
599 // TODO(floitsch): deprecate once tasks are non-experimental. | |
600 Timer createTimer(Duration duration, void callback()); | 416 Timer createTimer(Duration duration, void callback()); |
601 | 417 |
602 /** | 418 /** |
603 * Creates a periodic Timer where the callback is executed in this zone. | 419 * Creates a periodic Timer where the callback is executed in this zone. |
604 */ | 420 */ |
605 // TODO(floitsch): deprecate once tasks are non-experimental. | |
606 Timer createPeriodicTimer(Duration period, void callback(Timer timer)); | 421 Timer createPeriodicTimer(Duration period, void callback(Timer timer)); |
607 | 422 |
608 /** | 423 /** |
609 * Prints the given [line]. | 424 * Prints the given [line]. |
610 */ | 425 */ |
611 void print(String line); | 426 void print(String line); |
612 | 427 |
613 /** | 428 /** |
614 * Call to enter the Zone. | 429 * Call to enter the Zone. |
615 * | 430 * |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 as Object/*=R*/; | 516 as Object/*=R*/; |
702 } | 517 } |
703 | 518 |
704 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) { | 519 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) { |
705 var implementation = _delegationTarget._registerCallback; | 520 var implementation = _delegationTarget._registerCallback; |
706 _Zone implZone = implementation.zone; | 521 _Zone implZone = implementation.zone; |
707 RegisterCallbackHandler handler = implementation.function; | 522 RegisterCallbackHandler handler = implementation.function; |
708 // TODO(floitsch): make this a generic method call on '<R>' once it's | 523 // TODO(floitsch): make this a generic method call on '<R>' once it's |
709 // supported. Remove the unnecessary cast. | 524 // supported. Remove the unnecessary cast. |
710 return handler(implZone, _parentDelegate(implZone), zone, f) | 525 return handler(implZone, _parentDelegate(implZone), zone, f) |
711 as dynamic/*=ZoneCallback<R>*/; | 526 as Object/*=ZoneCallback<R>*/; |
712 } | 527 } |
713 | 528 |
714 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 529 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
715 Zone zone, /*=R*/ f(/*=T*/ arg)) { | 530 Zone zone, /*=R*/ f(/*=T*/ arg)) { |
716 var implementation = _delegationTarget._registerUnaryCallback; | 531 var implementation = _delegationTarget._registerUnaryCallback; |
717 _Zone implZone = implementation.zone; | 532 _Zone implZone = implementation.zone; |
718 RegisterUnaryCallbackHandler handler = implementation.function; | 533 RegisterUnaryCallbackHandler handler = implementation.function; |
719 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 534 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
720 // supported. Remove the unnecessary cast. | 535 // supported. Remove the unnecessary cast. |
721 return handler(implZone, _parentDelegate(implZone), zone, f) | 536 return handler(implZone, _parentDelegate(implZone), zone, f) |
722 as dynamic/*=ZoneUnaryCallback<R, T>*/; | 537 as Object/*=ZoneUnaryCallback<R, T>*/; |
723 } | 538 } |
724 | 539 |
725 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 540 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
726 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { | 541 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { |
727 var implementation = _delegationTarget._registerBinaryCallback; | 542 var implementation = _delegationTarget._registerBinaryCallback; |
728 _Zone implZone = implementation.zone; | 543 _Zone implZone = implementation.zone; |
729 RegisterBinaryCallbackHandler handler = implementation.function; | 544 RegisterBinaryCallbackHandler handler = implementation.function; |
730 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 545 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
731 // it's supported. Remove the unnecessary cast. | 546 // it's supported. Remove the unnecessary cast. |
732 return handler(implZone, _parentDelegate(implZone), zone, f) | 547 return handler(implZone, _parentDelegate(implZone), zone, f) |
733 as dynamic/*=ZoneBinaryCallback<R, T1, T2>*/; | 548 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
734 } | 549 } |
735 | 550 |
736 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { | 551 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { |
737 var implementation = _delegationTarget._errorCallback; | 552 var implementation = _delegationTarget._errorCallback; |
738 _Zone implZone = implementation.zone; | 553 _Zone implZone = implementation.zone; |
739 if (identical(implZone, _ROOT_ZONE)) return null; | 554 if (identical(implZone, _ROOT_ZONE)) return null; |
740 ErrorCallbackHandler handler = implementation.function; | 555 ErrorCallbackHandler handler = implementation.function; |
741 return handler(implZone, _parentDelegate(implZone), zone, | 556 return handler(implZone, _parentDelegate(implZone), zone, |
742 error, stackTrace); | 557 error, stackTrace); |
743 } | 558 } |
744 | 559 |
745 void scheduleMicrotask(Zone zone, f()) { | 560 void scheduleMicrotask(Zone zone, f()) { |
746 var implementation = _delegationTarget._scheduleMicrotask; | 561 var implementation = _delegationTarget._scheduleMicrotask; |
747 _Zone implZone = implementation.zone; | 562 _Zone implZone = implementation.zone; |
748 ScheduleMicrotaskHandler handler = implementation.function; | 563 ScheduleMicrotaskHandler handler = implementation.function; |
749 handler(implZone, _parentDelegate(implZone), zone, f); | 564 handler(implZone, _parentDelegate(implZone), zone, f); |
750 } | 565 } |
751 | 566 |
752 Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/( | 567 Timer createTimer(Zone zone, Duration duration, void f()) { |
753 Zone zone, TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specificat
ion) { | 568 var implementation = _delegationTarget._createTimer; |
754 var implementation = _delegationTarget._createTask; | |
755 _Zone implZone = implementation.zone; | 569 _Zone implZone = implementation.zone; |
756 // TODO(floitsch): make the handler call a generic method call on '<T, S>' | 570 CreateTimerHandler handler = implementation.function; |
757 // once it's supported. Remove the unnecessary cast. | 571 return handler(implZone, _parentDelegate(implZone), zone, duration, f); |
758 var handler = | |
759 implementation.function as CreateTaskHandler/*<T, S>*/; | |
760 return handler( | |
761 implZone, _parentDelegate(implZone), zone, create, specification); | |
762 } | 572 } |
763 | 573 |
764 void runTask/*<T, A>*/(Zone zone, TaskRun run, Object /*=T*/ task, | 574 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) { |
765 Object /*=A*/ argument) { | 575 var implementation = _delegationTarget._createPeriodicTimer; |
766 var implementation = _delegationTarget._runTask; | |
767 _Zone implZone = implementation.zone; | 576 _Zone implZone = implementation.zone; |
768 RunTaskHandler handler = implementation.function; | 577 CreatePeriodicTimerHandler handler = implementation.function; |
769 // TODO(floitsch): make this a generic call on '<T, A>'. | 578 return handler(implZone, _parentDelegate(implZone), zone, period, f); |
770 handler(implZone, _parentDelegate(implZone), zone, run, task, argument); | |
771 } | 579 } |
772 | 580 |
773 void print(Zone zone, String line) { | 581 void print(Zone zone, String line) { |
774 var implementation = _delegationTarget._print; | 582 var implementation = _delegationTarget._print; |
775 _Zone implZone = implementation.zone; | 583 _Zone implZone = implementation.zone; |
776 PrintHandler handler = implementation.function; | 584 PrintHandler handler = implementation.function; |
777 handler(implZone, _parentDelegate(implZone), zone, line); | 585 handler(implZone, _parentDelegate(implZone), zone, line); |
778 } | 586 } |
779 | 587 |
780 Zone fork(Zone zone, ZoneSpecification specification, | 588 Zone fork(Zone zone, ZoneSpecification specification, |
781 Map zoneValues) { | 589 Map zoneValues) { |
782 var implementation = _delegationTarget._fork; | 590 var implementation = _delegationTarget._fork; |
783 _Zone implZone = implementation.zone; | 591 _Zone implZone = implementation.zone; |
784 ForkHandler handler = implementation.function; | 592 ForkHandler handler = implementation.function; |
785 return handler( | 593 return handler( |
786 implZone, _parentDelegate(implZone), zone, specification, zoneValues); | 594 implZone, _parentDelegate(implZone), zone, specification, zoneValues); |
787 } | 595 } |
788 | |
789 // TODO(floitsch): deprecate once tasks are non-experimental. | |
790 Timer createTimer(Zone zone, Duration duration, void f()) { | |
791 var implementation = _delegationTarget._createTimer; | |
792 _Zone implZone = implementation.zone; | |
793 CreateTimerHandler handler = implementation.function; | |
794 return handler(implZone, _parentDelegate(implZone), zone, duration, f); | |
795 } | |
796 | |
797 // TODO(floitsch): deprecate once tasks are non-experimental. | |
798 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) { | |
799 var implementation = _delegationTarget._createPeriodicTimer; | |
800 _Zone implZone = implementation.zone; | |
801 CreatePeriodicTimerHandler handler = implementation.function; | |
802 return handler(implZone, _parentDelegate(implZone), zone, period, f); | |
803 } | |
804 } | 596 } |
805 | 597 |
806 | 598 |
807 /** | 599 /** |
808 * Base class for Zone implementations. | 600 * Base class for Zone implementations. |
809 */ | 601 */ |
810 abstract class _Zone implements Zone { | 602 abstract class _Zone implements Zone { |
811 const _Zone(); | 603 const _Zone(); |
812 | 604 |
813 _ZoneFunction<RunHandler> get _run; | 605 _ZoneFunction<RunHandler> get _run; |
814 _ZoneFunction<RunUnaryHandler> get _runUnary; | 606 _ZoneFunction<RunUnaryHandler> get _runUnary; |
815 _ZoneFunction<RunBinaryHandler> get _runBinary; | 607 _ZoneFunction<RunBinaryHandler> get _runBinary; |
816 _ZoneFunction<RegisterCallbackHandler> get _registerCallback; | 608 _ZoneFunction<RegisterCallbackHandler> get _registerCallback; |
817 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback; | 609 _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback; |
818 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback; | 610 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback; |
819 _ZoneFunction<ErrorCallbackHandler> get _errorCallback; | 611 _ZoneFunction<ErrorCallbackHandler> get _errorCallback; |
820 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask; | 612 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask; |
821 _ZoneFunction<CreateTaskHandler> get _createTask; | 613 _ZoneFunction<CreateTimerHandler> get _createTimer; |
822 _ZoneFunction<RunTaskHandler> get _runTask; | 614 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer; |
823 _ZoneFunction<PrintHandler> get _print; | 615 _ZoneFunction<PrintHandler> get _print; |
824 _ZoneFunction<ForkHandler> get _fork; | 616 _ZoneFunction<ForkHandler> get _fork; |
825 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError; | 617 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError; |
826 | |
827 // TODO(floitsch): deprecate once tasks are non-experimental. | |
828 _ZoneFunction<CreateTimerHandler> get _createTimer; | |
829 // TODO(floitsch): deprecate once tasks are non-experimental. | |
830 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer; | |
831 | |
832 _Zone get parent; | 618 _Zone get parent; |
833 ZoneDelegate get _delegate; | 619 ZoneDelegate get _delegate; |
834 Map get _map; | 620 Map get _map; |
835 | 621 |
836 bool inSameErrorZone(Zone otherZone) { | 622 bool inSameErrorZone(Zone otherZone) { |
837 return identical(this, otherZone) || | 623 return identical(this, otherZone) || |
838 identical(errorZone, otherZone.errorZone); | 624 identical(errorZone, otherZone.errorZone); |
839 } | 625 } |
840 } | 626 } |
841 | 627 |
842 class _CustomZone extends _Zone { | 628 class _CustomZone extends _Zone { |
843 // The actual zone and implementation of each of these | 629 // The actual zone and implementation of each of these |
844 // inheritable zone functions. | 630 // inheritable zone functions. |
845 _ZoneFunction<RunHandler> _run; | 631 _ZoneFunction<RunHandler> _run; |
846 _ZoneFunction<RunUnaryHandler> _runUnary; | 632 _ZoneFunction<RunUnaryHandler> _runUnary; |
847 _ZoneFunction<RunBinaryHandler> _runBinary; | 633 _ZoneFunction<RunBinaryHandler> _runBinary; |
848 _ZoneFunction<RegisterCallbackHandler> _registerCallback; | 634 _ZoneFunction<RegisterCallbackHandler> _registerCallback; |
849 _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback; | 635 _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback; |
850 _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback; | 636 _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback; |
851 _ZoneFunction<ErrorCallbackHandler> _errorCallback; | 637 _ZoneFunction<ErrorCallbackHandler> _errorCallback; |
852 _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask; | 638 _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask; |
853 _ZoneFunction<CreateTaskHandler> _createTask; | 639 _ZoneFunction<CreateTimerHandler> _createTimer; |
854 _ZoneFunction<RunTaskHandler> _runTask; | 640 _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer; |
855 _ZoneFunction<PrintHandler> _print; | 641 _ZoneFunction<PrintHandler> _print; |
856 _ZoneFunction<ForkHandler> _fork; | 642 _ZoneFunction<ForkHandler> _fork; |
857 _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError; | 643 _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError; |
858 | 644 |
859 // TODO(floitsch): deprecate once tasks are non-experimental. | |
860 _ZoneFunction<CreateTimerHandler> _createTimer; | |
861 // TODO(floitsch): deprecate once tasks are non-experimental. | |
862 _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer; | |
863 | |
864 // A cached delegate to this zone. | 645 // A cached delegate to this zone. |
865 ZoneDelegate _delegateCache; | 646 ZoneDelegate _delegateCache; |
866 | 647 |
867 /// The parent zone. | 648 /// The parent zone. |
868 final _Zone parent; | 649 final _Zone parent; |
869 | 650 |
870 /// The zone's scoped value declaration map. | 651 /// The zone's scoped value declaration map. |
871 /// | 652 /// |
872 /// This is always a [HashMap]. | 653 /// This is always a [HashMap]. |
873 final Map _map; | 654 final Map _map; |
(...skipping 30 matching lines...) Expand all Loading... |
904 this, specification.registerBinaryCallback) | 685 this, specification.registerBinaryCallback) |
905 : parent._registerBinaryCallback; | 686 : parent._registerBinaryCallback; |
906 _errorCallback = (specification.errorCallback != null) | 687 _errorCallback = (specification.errorCallback != null) |
907 ? new _ZoneFunction<ErrorCallbackHandler>( | 688 ? new _ZoneFunction<ErrorCallbackHandler>( |
908 this, specification.errorCallback) | 689 this, specification.errorCallback) |
909 : parent._errorCallback; | 690 : parent._errorCallback; |
910 _scheduleMicrotask = (specification.scheduleMicrotask != null) | 691 _scheduleMicrotask = (specification.scheduleMicrotask != null) |
911 ? new _ZoneFunction<ScheduleMicrotaskHandler>( | 692 ? new _ZoneFunction<ScheduleMicrotaskHandler>( |
912 this, specification.scheduleMicrotask) | 693 this, specification.scheduleMicrotask) |
913 : parent._scheduleMicrotask; | 694 : parent._scheduleMicrotask; |
914 _createTask = (specification.createTask != null) | 695 _createTimer = (specification.createTimer != null) |
915 ? new _ZoneFunction<CreateTaskHandler>( | 696 ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer) |
916 this, specification.createTask) | 697 : parent._createTimer; |
917 : parent._createTask; | 698 _createPeriodicTimer = (specification.createPeriodicTimer != null) |
918 _runTask = (specification.runTask != null) | 699 ? new _ZoneFunction<CreatePeriodicTimerHandler>( |
919 ? new _ZoneFunction<RunTaskHandler>( | 700 this, specification.createPeriodicTimer) |
920 this, specification.runTask) | 701 : parent._createPeriodicTimer; |
921 : parent._runTask; | |
922 _print = (specification.print != null) | 702 _print = (specification.print != null) |
923 ? new _ZoneFunction<PrintHandler>(this, specification.print) | 703 ? new _ZoneFunction<PrintHandler>(this, specification.print) |
924 : parent._print; | 704 : parent._print; |
925 _fork = (specification.fork != null) | 705 _fork = (specification.fork != null) |
926 ? new _ZoneFunction<ForkHandler>(this, specification.fork) | 706 ? new _ZoneFunction<ForkHandler>(this, specification.fork) |
927 : parent._fork; | 707 : parent._fork; |
928 _handleUncaughtError = (specification.handleUncaughtError != null) | 708 _handleUncaughtError = (specification.handleUncaughtError != null) |
929 ? new _ZoneFunction<HandleUncaughtErrorHandler>( | 709 ? new _ZoneFunction<HandleUncaughtErrorHandler>( |
930 this, specification.handleUncaughtError) | 710 this, specification.handleUncaughtError) |
931 : parent._handleUncaughtError; | 711 : parent._handleUncaughtError; |
932 | |
933 // Deprecated fields, once tasks are non-experimental. | |
934 _createTimer = (specification.createTimer != null) | |
935 ? new _ZoneFunction<CreateTimerHandler>( | |
936 this, specification.createTimer) | |
937 : parent._createTimer; | |
938 _createPeriodicTimer = (specification.createPeriodicTimer != null) | |
939 ? new _ZoneFunction<CreatePeriodicTimerHandler>( | |
940 this, specification.createPeriodicTimer) | |
941 : parent._createPeriodicTimer; | |
942 } | 712 } |
943 | 713 |
944 /** | 714 /** |
945 * The closest error-handling zone. | 715 * The closest error-handling zone. |
946 * | 716 * |
947 * Returns `this` if `this` has an error-handler. Otherwise returns the | 717 * Returns `this` if `this` has an error-handler. Otherwise returns the |
948 * parent's error-zone. | 718 * parent's error-zone. |
949 */ | 719 */ |
950 Zone get errorZone => _handleUncaughtError.zone; | 720 Zone get errorZone => _handleUncaughtError.zone; |
951 | 721 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 } | 852 } |
1083 | 853 |
1084 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) { | 854 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) { |
1085 var implementation = this._registerCallback; | 855 var implementation = this._registerCallback; |
1086 assert(implementation != null); | 856 assert(implementation != null); |
1087 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 857 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1088 RegisterCallbackHandler handler = implementation.function; | 858 RegisterCallbackHandler handler = implementation.function; |
1089 // TODO(floitsch): make this a generic method call on '<R>' once it's | 859 // TODO(floitsch): make this a generic method call on '<R>' once it's |
1090 // supported. Remove the unnecessary cast. | 860 // supported. Remove the unnecessary cast. |
1091 return handler(implementation.zone, parentDelegate, this, callback) | 861 return handler(implementation.zone, parentDelegate, this, callback) |
1092 as dynamic/*=ZoneCallback<R>*/; | 862 as Object/*=ZoneCallback<R>*/; |
1093 } | 863 } |
1094 | 864 |
1095 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 865 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
1096 /*=R*/ callback(/*=T*/ arg)) { | 866 /*=R*/ callback(/*=T*/ arg)) { |
1097 var implementation = this._registerUnaryCallback; | 867 var implementation = this._registerUnaryCallback; |
1098 assert(implementation != null); | 868 assert(implementation != null); |
1099 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 869 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1100 RegisterUnaryCallbackHandler handler = implementation.function; | 870 RegisterUnaryCallbackHandler handler = implementation.function; |
1101 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 871 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
1102 // supported. Remove the unnecessary cast. | 872 // supported. Remove the unnecessary cast. |
1103 return handler(implementation.zone, parentDelegate, this, callback) | 873 return handler(implementation.zone, parentDelegate, this, callback) |
1104 as dynamic/*=ZoneUnaryCallback<R, T>*/; | 874 as Object/*=ZoneUnaryCallback<R, T>*/; |
1105 } | 875 } |
1106 | 876 |
1107 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 877 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
1108 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) { | 878 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) { |
1109 var implementation = this._registerBinaryCallback; | 879 var implementation = this._registerBinaryCallback; |
1110 assert(implementation != null); | 880 assert(implementation != null); |
1111 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 881 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1112 RegisterBinaryCallbackHandler handler = implementation.function; | 882 RegisterBinaryCallbackHandler handler = implementation.function; |
1113 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 883 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
1114 // it's supported. Remove the unnecessary cast. | 884 // it's supported. Remove the unnecessary cast. |
1115 return handler(implementation.zone, parentDelegate, this, callback) | 885 return handler(implementation.zone, parentDelegate, this, callback) |
1116 as dynamic/*=ZoneBinaryCallback<R, T1, T2>*/; | 886 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
1117 } | 887 } |
1118 | 888 |
1119 AsyncError errorCallback(Object error, StackTrace stackTrace) { | 889 AsyncError errorCallback(Object error, StackTrace stackTrace) { |
1120 var implementation = this._errorCallback; | 890 var implementation = this._errorCallback; |
1121 assert(implementation != null); | 891 assert(implementation != null); |
1122 final Zone implementationZone = implementation.zone; | 892 final Zone implementationZone = implementation.zone; |
1123 if (identical(implementationZone, _ROOT_ZONE)) return null; | 893 if (identical(implementationZone, _ROOT_ZONE)) return null; |
1124 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone); | 894 final ZoneDelegate parentDelegate = _parentDelegate(implementationZone); |
1125 ErrorCallbackHandler handler = implementation.function; | 895 ErrorCallbackHandler handler = implementation.function; |
1126 return handler( | 896 return handler( |
1127 implementationZone, parentDelegate, this, error, stackTrace); | 897 implementationZone, parentDelegate, this, error, stackTrace); |
1128 } | 898 } |
1129 | 899 |
1130 void scheduleMicrotask(void f()) { | 900 void scheduleMicrotask(void f()) { |
1131 var implementation = this._scheduleMicrotask; | 901 var implementation = this._scheduleMicrotask; |
1132 assert(implementation != null); | 902 assert(implementation != null); |
1133 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 903 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1134 ScheduleMicrotaskHandler handler = implementation.function; | 904 ScheduleMicrotaskHandler handler = implementation.function; |
1135 handler(implementation.zone, parentDelegate, this, f); | 905 return handler(implementation.zone, parentDelegate, this, f); |
1136 } | 906 } |
1137 | 907 |
1138 Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/( | |
1139 TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) { | |
1140 var implementation = this._createTask; | |
1141 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | |
1142 // TODO(floitsch): make the handler call a generic method call on '<T, S>' | |
1143 // once it's supported. Remove the unnecessary cast. | |
1144 var handler = | |
1145 implementation.function as CreateTaskHandler/*<T, S>*/; | |
1146 return handler( | |
1147 implementation.zone, parentDelegate, this, create, specification); | |
1148 } | |
1149 | |
1150 void runTask/*<T, A>*/( | |
1151 TaskRun/*<T, A>*/ run, Object/*=T*/ task, Object/*=A*/ arg1) { | |
1152 var implementation = this._runTask; | |
1153 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | |
1154 RunTaskHandler handler = implementation.function; | |
1155 // TODO(floitsch): make this a generic method call on '<T, A>' once it's | |
1156 // supported. | |
1157 handler(implementation.zone, parentDelegate, this, run, task, arg1); | |
1158 } | |
1159 | |
1160 void print(String line) { | |
1161 var implementation = this._print; | |
1162 assert(implementation != null); | |
1163 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | |
1164 PrintHandler handler = implementation.function; | |
1165 return handler(implementation.zone, parentDelegate, this, line); | |
1166 } | |
1167 | |
1168 // TODO(floitsch): deprecate once tasks are non-experimental. | |
1169 Timer createTimer(Duration duration, void f()) { | 908 Timer createTimer(Duration duration, void f()) { |
1170 var implementation = this._createTimer; | 909 var implementation = this._createTimer; |
1171 assert(implementation != null); | 910 assert(implementation != null); |
1172 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 911 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1173 CreateTimerHandler handler = implementation.function; | 912 CreateTimerHandler handler = implementation.function; |
1174 return handler(implementation.zone, parentDelegate, this, duration, f); | 913 return handler(implementation.zone, parentDelegate, this, duration, f); |
1175 } | 914 } |
1176 | 915 |
1177 // TODO(floitsch): deprecate once tasks are non-experimental. | |
1178 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { | 916 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { |
1179 var implementation = this._createPeriodicTimer; | 917 var implementation = this._createPeriodicTimer; |
1180 assert(implementation != null); | 918 assert(implementation != null); |
1181 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 919 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
1182 CreatePeriodicTimerHandler handler = implementation.function; | 920 CreatePeriodicTimerHandler handler = implementation.function; |
1183 return handler( | 921 return handler( |
1184 implementation.zone, parentDelegate, this, duration, f); | 922 implementation.zone, parentDelegate, this, duration, f); |
1185 } | 923 } |
| 924 |
| 925 void print(String line) { |
| 926 var implementation = this._print; |
| 927 assert(implementation != null); |
| 928 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 929 PrintHandler handler = implementation.function; |
| 930 return handler(implementation.zone, parentDelegate, this, line); |
| 931 } |
1186 } | 932 } |
1187 | 933 |
1188 /*=R*/ _rootHandleUncaughtError/*<R>*/( | 934 /*=R*/ _rootHandleUncaughtError/*<R>*/( |
1189 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { | 935 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { |
1190 _schedulePriorityAsyncCallback(() { | 936 _schedulePriorityAsyncCallback(() { |
1191 if (error == null) error = new NullThrownError(); | 937 if (error == null) error = new NullThrownError(); |
1192 if (stackTrace == null) throw error; | 938 if (stackTrace == null) throw error; |
1193 _rethrow(error, stackTrace); | 939 _rethrow(error, stackTrace); |
1194 }); | 940 }); |
1195 } | 941 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { | 999 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { |
1254 if (!identical(_ROOT_ZONE, zone)) { | 1000 if (!identical(_ROOT_ZONE, zone)) { |
1255 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); | 1001 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); |
1256 f = zone.bindCallback(f, runGuarded: hasErrorHandler); | 1002 f = zone.bindCallback(f, runGuarded: hasErrorHandler); |
1257 // Use root zone as event zone if the function is already bound. | 1003 // Use root zone as event zone if the function is already bound. |
1258 zone = _ROOT_ZONE; | 1004 zone = _ROOT_ZONE; |
1259 } | 1005 } |
1260 _scheduleAsyncCallback(f); | 1006 _scheduleAsyncCallback(f); |
1261 } | 1007 } |
1262 | 1008 |
1263 Object/*=T*/ _rootCreateTask/*<T, S extends TaskSpecification>*/( | |
1264 Zone self, ZoneDelegate parent, Zone zone, | |
1265 TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) { | |
1266 return create(specification, zone); | |
1267 } | |
1268 | |
1269 void _rootRunTask/*<T, A>*/( | |
1270 Zone self, ZoneDelegate parent, Zone zone, TaskRun run/*<T, A>*/, | |
1271 Object/*=T*/ task, Object/*=A*/ arg) { | |
1272 if (Zone._current == zone) { | |
1273 run(task, arg); | |
1274 return; | |
1275 } | |
1276 | |
1277 Zone old = Zone._enter(zone); | |
1278 try { | |
1279 run(task, arg); | |
1280 } catch (e, s) { | |
1281 zone.handleUncaughtError/*<dynamic>*/(e, s); | |
1282 } finally { | |
1283 Zone._leave(old); | |
1284 } | |
1285 } | |
1286 | |
1287 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, | 1009 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, |
1288 Duration duration, void callback()) { | 1010 Duration duration, void callback()) { |
1289 return new Timer._task(zone, duration, callback); | 1011 if (!identical(_ROOT_ZONE, zone)) { |
| 1012 callback = zone.bindCallback(callback); |
| 1013 } |
| 1014 return Timer._createTimer(duration, callback); |
1290 } | 1015 } |
1291 | 1016 |
1292 Timer _rootCreatePeriodicTimer( | 1017 Timer _rootCreatePeriodicTimer( |
1293 Zone self, ZoneDelegate parent, Zone zone, | 1018 Zone self, ZoneDelegate parent, Zone zone, |
1294 Duration duration, void callback(Timer timer)) { | 1019 Duration duration, void callback(Timer timer)) { |
1295 return new Timer._periodicTask(zone, duration, callback); | 1020 if (!identical(_ROOT_ZONE, zone)) { |
| 1021 // TODO(floitsch): the return type should be 'void'. |
| 1022 callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback); |
| 1023 } |
| 1024 return Timer._createPeriodicTimer(duration, callback); |
1296 } | 1025 } |
1297 | 1026 |
1298 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { | 1027 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { |
1299 printToConsole(line); | 1028 printToConsole(line); |
1300 } | 1029 } |
1301 | 1030 |
1302 void _printToZone(String line) { | 1031 void _printToZone(String line) { |
1303 Zone.current.print(line); | 1032 Zone.current.print(line); |
1304 } | 1033 } |
1305 | 1034 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1346 const _ZoneFunction<RegisterUnaryCallbackHandler>( | 1075 const _ZoneFunction<RegisterUnaryCallbackHandler>( |
1347 _ROOT_ZONE, _rootRegisterUnaryCallback); | 1076 _ROOT_ZONE, _rootRegisterUnaryCallback); |
1348 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback => | 1077 _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback => |
1349 const _ZoneFunction<RegisterBinaryCallbackHandler>( | 1078 const _ZoneFunction<RegisterBinaryCallbackHandler>( |
1350 _ROOT_ZONE, _rootRegisterBinaryCallback); | 1079 _ROOT_ZONE, _rootRegisterBinaryCallback); |
1351 _ZoneFunction<ErrorCallbackHandler> get _errorCallback => | 1080 _ZoneFunction<ErrorCallbackHandler> get _errorCallback => |
1352 const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback); | 1081 const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback); |
1353 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask => | 1082 _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask => |
1354 const _ZoneFunction<ScheduleMicrotaskHandler>( | 1083 const _ZoneFunction<ScheduleMicrotaskHandler>( |
1355 _ROOT_ZONE, _rootScheduleMicrotask); | 1084 _ROOT_ZONE, _rootScheduleMicrotask); |
1356 _ZoneFunction<CreateTaskHandler> get _createTask => | 1085 _ZoneFunction<CreateTimerHandler> get _createTimer => |
1357 const _ZoneFunction<CreateTaskHandler>(_ROOT_ZONE, _rootCreateTask); | 1086 const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer); |
1358 _ZoneFunction<RunTaskHandler> get _runTask => | 1087 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer => |
1359 const _ZoneFunction<RunTaskHandler>(_ROOT_ZONE, _rootRunTask); | 1088 const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePer
iodicTimer); |
1360 _ZoneFunction<PrintHandler> get _print => | 1089 _ZoneFunction<PrintHandler> get _print => |
1361 const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint); | 1090 const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint); |
1362 _ZoneFunction<ForkHandler> get _fork => | 1091 _ZoneFunction<ForkHandler> get _fork => |
1363 const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork); | 1092 const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork); |
1364 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError => | 1093 _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError => |
1365 const _ZoneFunction<HandleUncaughtErrorHandler>( | 1094 const _ZoneFunction<HandleUncaughtErrorHandler>( |
1366 _ROOT_ZONE, _rootHandleUncaughtError); | 1095 _ROOT_ZONE, _rootHandleUncaughtError); |
1367 | 1096 |
1368 // TODO(floitsch): deprecate once tasks are non-experimental. | |
1369 _ZoneFunction<CreateTimerHandler> get _createTimer => | |
1370 const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer); | |
1371 // TODO(floitsch): deprecate once tasks are non-experimental. | |
1372 _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer => | |
1373 const _ZoneFunction<CreatePeriodicTimerHandler>( | |
1374 _ROOT_ZONE, _rootCreatePeriodicTimer); | |
1375 | |
1376 // The parent zone. | 1097 // The parent zone. |
1377 _Zone get parent => null; | 1098 _Zone get parent => null; |
1378 | 1099 |
1379 /// The zone's scoped value declaration map. | 1100 /// The zone's scoped value declaration map. |
1380 /// | 1101 /// |
1381 /// This is always a [HashMap]. | 1102 /// This is always a [HashMap]. |
1382 Map get _map => _rootMap; | 1103 Map get _map => _rootMap; |
1383 | 1104 |
1384 static Map _rootMap = new HashMap(); | 1105 static Map _rootMap = new HashMap(); |
1385 | 1106 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 | 1218 |
1498 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 1219 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
1499 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f; | 1220 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f; |
1500 | 1221 |
1501 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; | 1222 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; |
1502 | 1223 |
1503 void scheduleMicrotask(void f()) { | 1224 void scheduleMicrotask(void f()) { |
1504 _rootScheduleMicrotask(null, null, this, f); | 1225 _rootScheduleMicrotask(null, null, this, f); |
1505 } | 1226 } |
1506 | 1227 |
1507 Object/*=T*/ createTask/*<T, S extends TaskSpecification>*/( | |
1508 TaskCreate/*<T, S>*/ create, TaskSpecification/*=S*/ specification) { | |
1509 return _rootCreateTask/*<T, S>*/(null, null, this, create, specification); | |
1510 } | |
1511 | |
1512 void runTask/*<T, A>*/( | |
1513 TaskRun/*<T, A>*/ run, Object/*=T*/ task, Object/*=A*/ arg) { | |
1514 _rootRunTask/*<T, A>*/(null, null, this, run, task, arg); | |
1515 } | |
1516 | |
1517 Timer createTimer(Duration duration, void f()) { | 1228 Timer createTimer(Duration duration, void f()) { |
1518 return Timer._createTimer(duration, f); | 1229 return Timer._createTimer(duration, f); |
1519 } | 1230 } |
1520 | 1231 |
1521 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { | 1232 Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { |
1522 return Timer._createPeriodicTimer(duration, f); | 1233 return Timer._createPeriodicTimer(duration, f); |
1523 } | 1234 } |
1524 | 1235 |
1525 void print(String line) { | 1236 void print(String line) { |
1526 printToConsole(line); | 1237 printToConsole(line); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1585 handleUncaughtError: errorHandler); | 1296 handleUncaughtError: errorHandler); |
1586 } | 1297 } |
1587 Zone zone = Zone.current.fork(specification: zoneSpecification, | 1298 Zone zone = Zone.current.fork(specification: zoneSpecification, |
1588 zoneValues: zoneValues); | 1299 zoneValues: zoneValues); |
1589 if (onError != null) { | 1300 if (onError != null) { |
1590 return zone.runGuarded(body); | 1301 return zone.runGuarded(body); |
1591 } else { | 1302 } else { |
1592 return zone.run(body); | 1303 return zone.run(body); |
1593 } | 1304 } |
1594 } | 1305 } |
OLD | NEW |