Index: pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart |
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart |
deleted file mode 100644 |
index 6b13e66df92bb9ac891e71f29d9b9cbc878ea4e7..0000000000000000000000000000000000000000 |
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart |
+++ /dev/null |
@@ -1,1308 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-part of dart.async; |
- |
-typedef R ZoneCallback<R>(); |
-typedef R ZoneUnaryCallback<R, T>(T arg); |
-typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2); |
- |
-// TODO(floitsch): we are abusing generic typedefs as typedefs for generic |
-// functions. |
-/*ABUSE*/ |
-typedef R HandleUncaughtErrorHandler<R>( |
- Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace); |
-/*ABUSE*/ |
-typedef R RunHandler<R>(Zone self, ZoneDelegate parent, Zone zone, R f()); |
-/*ABUSE*/ |
-typedef R RunUnaryHandler<R, T>( |
- Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg); |
-/*ABUSE*/ |
-typedef R RunBinaryHandler<R, T1, T2>( |
- Zone self, ZoneDelegate parent, Zone zone, |
- R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2); |
-/*ABUSE*/ |
-typedef ZoneCallback<R> RegisterCallbackHandler<R>( |
- Zone self, ZoneDelegate parent, Zone zone, R f()); |
-/*ABUSE*/ |
-typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>( |
- Zone self, ZoneDelegate parent, Zone zone, R f(T arg)); |
-/*ABUSE*/ |
-typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>( |
- Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)); |
-typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent, |
- Zone zone, Object error, StackTrace stackTrace); |
-typedef void ScheduleMicrotaskHandler( |
- Zone self, ZoneDelegate parent, Zone zone, void f()); |
-typedef Timer CreateTimerHandler( |
- Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()); |
-typedef Timer CreatePeriodicTimerHandler( |
- Zone self, ZoneDelegate parent, Zone zone, |
- Duration period, void f(Timer timer)); |
-typedef void PrintHandler( |
- Zone self, ZoneDelegate parent, Zone zone, String line); |
-typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone, |
- ZoneSpecification specification, |
- Map zoneValues); |
- |
-/** Pair of error and stack trace. Returned by [Zone.errorCallback]. */ |
-class AsyncError implements Error { |
- final Object error; |
- final StackTrace stackTrace; |
- |
- AsyncError(this.error, this.stackTrace); |
- |
- String toString() => '$error'; |
-} |
- |
- |
-class _ZoneFunction<T extends Function> { |
- final _Zone zone; |
- final T function; |
- const _ZoneFunction(this.zone, this.function); |
-} |
- |
-/** |
- * This class provides the specification for a forked zone. |
- * |
- * When forking a new zone (see [Zone.fork]) one can override the default |
- * behavior of the zone by providing callbacks. These callbacks must be |
- * given in an instance of this class. |
- * |
- * Handlers have the same signature as the same-named methods on [Zone] but |
- * receive three additional arguments: |
- * |
- * 1. the zone the handlers are attached to (the "self" zone). |
- * 2. a [ZoneDelegate] to the parent zone. |
- * 3. the zone that first received the request (before the request was |
- * bubbled up). |
- * |
- * Handlers can either stop propagation the request (by simply not calling the |
- * parent handler), or forward to the parent zone, potentially modifying the |
- * arguments on the way. |
- */ |
-abstract class ZoneSpecification { |
- /** |
- * Creates a specification with the provided handlers. |
- */ |
- const factory ZoneSpecification({ |
- HandleUncaughtErrorHandler handleUncaughtError, |
- RunHandler run, |
- RunUnaryHandler runUnary, |
- RunBinaryHandler runBinary, |
- RegisterCallbackHandler registerCallback, |
- RegisterUnaryCallbackHandler registerUnaryCallback, |
- RegisterBinaryCallbackHandler registerBinaryCallback, |
- ErrorCallbackHandler errorCallback, |
- ScheduleMicrotaskHandler scheduleMicrotask, |
- CreateTimerHandler createTimer, |
- CreatePeriodicTimerHandler createPeriodicTimer, |
- PrintHandler print, |
- ForkHandler fork |
- }) = _ZoneSpecification; |
- |
- /** |
- * Creates a specification from [other] with the provided handlers overriding |
- * the ones in [other]. |
- */ |
- factory ZoneSpecification.from(ZoneSpecification other, { |
- HandleUncaughtErrorHandler handleUncaughtError: null, |
- RunHandler run: null, |
- RunUnaryHandler runUnary: null, |
- RunBinaryHandler runBinary: null, |
- RegisterCallbackHandler registerCallback: null, |
- RegisterUnaryCallbackHandler registerUnaryCallback: null, |
- RegisterBinaryCallbackHandler registerBinaryCallback: null, |
- ErrorCallbackHandler errorCallback: null, |
- ScheduleMicrotaskHandler scheduleMicrotask: null, |
- CreateTimerHandler createTimer: null, |
- CreatePeriodicTimerHandler createPeriodicTimer: null, |
- PrintHandler print: null, |
- ForkHandler fork: null |
- }) { |
- return new ZoneSpecification( |
- handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError, |
- run: run ?? other.run, |
- runUnary: runUnary ?? other.runUnary, |
- runBinary: runBinary ?? other.runBinary, |
- registerCallback: registerCallback ?? other.registerCallback, |
- registerUnaryCallback: registerUnaryCallback ?? |
- other.registerUnaryCallback, |
- registerBinaryCallback: registerBinaryCallback ?? |
- other.registerBinaryCallback, |
- errorCallback: errorCallback ?? other.errorCallback, |
- scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask, |
- createTimer : createTimer ?? other.createTimer, |
- createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer, |
- print : print ?? other.print, |
- fork: fork ?? other.fork); |
- } |
- |
- HandleUncaughtErrorHandler get handleUncaughtError; |
- RunHandler get run; |
- RunUnaryHandler get runUnary; |
- RunBinaryHandler get runBinary; |
- RegisterCallbackHandler get registerCallback; |
- RegisterUnaryCallbackHandler get registerUnaryCallback; |
- RegisterBinaryCallbackHandler get registerBinaryCallback; |
- ErrorCallbackHandler get errorCallback; |
- ScheduleMicrotaskHandler get scheduleMicrotask; |
- CreateTimerHandler get createTimer; |
- CreatePeriodicTimerHandler get createPeriodicTimer; |
- PrintHandler get print; |
- ForkHandler get fork; |
-} |
- |
-/** |
- * Internal [ZoneSpecification] class. |
- * |
- * The implementation wants to rely on the fact that the getters cannot change |
- * dynamically. We thus require users to go through the redirecting |
- * [ZoneSpecification] constructor which instantiates this class. |
- */ |
-class _ZoneSpecification implements ZoneSpecification { |
- const _ZoneSpecification({ |
- this.handleUncaughtError: null, |
- this.run: null, |
- this.runUnary: null, |
- this.runBinary: null, |
- this.registerCallback: null, |
- this.registerUnaryCallback: null, |
- this.registerBinaryCallback: null, |
- this.errorCallback: null, |
- this.scheduleMicrotask: null, |
- this.createTimer: null, |
- this.createPeriodicTimer: null, |
- this.print: null, |
- this.fork: null |
- }); |
- |
- final HandleUncaughtErrorHandler handleUncaughtError; |
- final RunHandler run; |
- final RunUnaryHandler runUnary; |
- final RunBinaryHandler runBinary; |
- final RegisterCallbackHandler registerCallback; |
- final RegisterUnaryCallbackHandler registerUnaryCallback; |
- final RegisterBinaryCallbackHandler registerBinaryCallback; |
- final ErrorCallbackHandler errorCallback; |
- final ScheduleMicrotaskHandler scheduleMicrotask; |
- final CreateTimerHandler createTimer; |
- final CreatePeriodicTimerHandler createPeriodicTimer; |
- final PrintHandler print; |
- final ForkHandler fork; |
-} |
- |
-/** |
- * This class wraps zones for delegation. |
- * |
- * When forwarding to parent zones one can't just invoke the parent zone's |
- * exposed functions (like [Zone.run]), but one needs to provide more |
- * information (like the zone the `run` was initiated). Zone callbacks thus |
- * receive more information including this [ZoneDelegate] class. When delegating |
- * to the parent zone one should go through the given instance instead of |
- * directly invoking the parent zone. |
- */ |
-abstract class ZoneDelegate { |
- /*=R*/ handleUncaughtError/*<R>*/( |
- Zone zone, error, StackTrace stackTrace); |
- /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()); |
- /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg); |
- /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); |
- ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()); |
- ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
- Zone zone, /*=R*/ f(/*=T*/ arg)); |
- ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
- Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)); |
- AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); |
- void scheduleMicrotask(Zone zone, void f()); |
- Timer createTimer(Zone zone, Duration duration, void f()); |
- Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); |
- void print(Zone zone, String line); |
- Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); |
-} |
- |
-/** |
- * A Zone represents the asynchronous version of a dynamic extent. Asynchronous |
- * callbacks are executed in the zone they have been queued in. For example, |
- * the callback of a `future.then` is executed in the same zone as the one where |
- * the `then` was invoked. |
- */ |
-abstract class Zone { |
- // Private constructor so that it is not possible instantiate a Zone class. |
- Zone._(); |
- |
- /** The root zone that is implicitly created. */ |
- static const Zone ROOT = _ROOT_ZONE; |
- |
- /** The currently running zone. */ |
- static Zone _current = _ROOT_ZONE; |
- |
- static Zone get current => _current; |
- |
- /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace); |
- |
- /** |
- * Returns the parent zone. |
- * |
- * Returns `null` if `this` is the [ROOT] zone. |
- */ |
- Zone get parent; |
- |
- /** |
- * The error zone is the one that is responsible for dealing with uncaught |
- * errors. |
- * Errors are not allowed to cross between zones with different error-zones. |
- * |
- * This is the closest parent or ancestor zone of this zone that has a custom |
- * [handleUncaughtError] method. |
- */ |
- Zone get errorZone; |
- |
- /** |
- * Returns true if `this` and [otherZone] are in the same error zone. |
- * |
- * Two zones are in the same error zone if they inherit their |
- * [handleUncaughtError] callback from the same [errorZone]. |
- */ |
- bool inSameErrorZone(Zone otherZone); |
- |
- /** |
- * Creates a new zone as a child of `this`. |
- * |
- * The new zone will have behavior like the current zone, except where |
- * overridden by functions in [specification]. |
- * |
- * The new zone will have the same stored values (accessed through |
- * `operator []`) as this zone, but updated with the keys and values |
- * in [zoneValues]. If a key is in both this zone's values and in |
- * `zoneValues`, the new zone will use the value from `zoneValues``. |
- */ |
- Zone fork({ ZoneSpecification specification, |
- Map zoneValues }); |
- |
- /** |
- * Executes the given function [f] in this zone. |
- */ |
- /*=R*/ run/*<R>*/(/*=R*/ f()); |
- |
- /** |
- * Executes the given callback [f] with argument [arg] in this zone. |
- */ |
- /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg); |
- |
- /** |
- * Executes the given callback [f] with argument [arg1] and [arg2] in this |
- * zone. |
- */ |
- /*=R*/ runBinary/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); |
- |
- /** |
- * Executes the given function [f] in this zone. |
- * |
- * Same as [run] but catches uncaught errors and gives them to |
- * [handleUncaughtError]. |
- */ |
- /*=R*/ runGuarded/*<R>*/(/*=R*/ f()); |
- |
- /** |
- * Executes the given callback [f] in this zone. |
- * |
- * Same as [runUnary] but catches uncaught errors and gives them to |
- * [handleUncaughtError]. |
- */ |
- /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg); |
- |
- /** |
- * Executes the given callback [f] in this zone. |
- * |
- * Same as [runBinary] but catches uncaught errors and gives them to |
- * [handleUncaughtError]. |
- */ |
- /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); |
- |
- /** |
- * Registers the given callback in this zone. |
- * |
- * It is good practice to register asynchronous or delayed callbacks before |
- * invoking [run]. This gives the zone a chance to wrap the callback and |
- * to store information with the callback. For example, a zone may decide |
- * to store the stack trace (at the time of the registration) with the |
- * callback. |
- * |
- * Returns a potentially new callback that should be used in place of the |
- * given [callback]. |
- */ |
- ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()); |
- |
- /** |
- * Registers the given callback in this zone. |
- * |
- * Similar to [registerCallback] but with a unary callback. |
- */ |
- ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
- /*=R*/ callback(/*=T*/ arg)); |
- |
- /** |
- * Registers the given callback in this zone. |
- * |
- * Similar to [registerCallback] but with a unary callback. |
- */ |
- ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)); |
- |
- /** |
- * Equivalent to: |
- * |
- * ZoneCallback registered = registerCallback(f); |
- * if (runGuarded) return () => this.runGuarded(registered); |
- * return () => this.run(registered); |
- * |
- */ |
- ZoneCallback/*<R>*/ bindCallback/*<R>*/( |
- /*=R*/ f(), { bool runGuarded: true }); |
- |
- /** |
- * Equivalent to: |
- * |
- * ZoneCallback registered = registerUnaryCallback(f); |
- * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg); |
- * return (arg) => thin.runUnary(registered, arg); |
- */ |
- ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( |
- /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }); |
- |
- /** |
- * Equivalent to: |
- * |
- * ZoneCallback registered = registerBinaryCallback(f); |
- * if (runGuarded) { |
- * return (arg1, arg2) => this.runBinaryGuarded(registered, arg); |
- * } |
- * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2); |
- */ |
- ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }); |
- |
- /** |
- * Intercepts errors when added programmatically to a `Future` or `Stream`. |
- * |
- * When caling [Completer.completeError], [Stream.addError], |
- * or [Future] constructors that take an error or a callback that may throw, |
- * the current zone is allowed to intercept and replace the error. |
- * |
- * When other libraries use intermediate controllers or completers, such |
- * calls may contain errors that have already been processed. |
- * |
- * Return `null` if no replacement is desired. |
- * The original error is used unchanged in that case. |
- * Otherwise return an instance of [AsyncError] holding |
- * the new pair of error and stack trace. |
- * If the [AsyncError.error] is `null`, it is replaced by a [NullThrownError]. |
- */ |
- AsyncError errorCallback(Object error, StackTrace stackTrace); |
- |
- /** |
- * Runs [f] asynchronously in this zone. |
- */ |
- void scheduleMicrotask(void f()); |
- |
- /** |
- * Creates a Timer where the callback is executed in this zone. |
- */ |
- Timer createTimer(Duration duration, void callback()); |
- |
- /** |
- * Creates a periodic Timer where the callback is executed in this zone. |
- */ |
- Timer createPeriodicTimer(Duration period, void callback(Timer timer)); |
- |
- /** |
- * Prints the given [line]. |
- */ |
- void print(String line); |
- |
- /** |
- * Call to enter the Zone. |
- * |
- * The previous current zone is returned. |
- */ |
- static Zone _enter(Zone zone) { |
- assert(zone != null); |
- assert(!identical(zone, _current)); |
- Zone previous = _current; |
- _current = zone; |
- return previous; |
- } |
- |
- /** |
- * Call to leave the Zone. |
- * |
- * The previous Zone must be provided as `previous`. |
- */ |
- static void _leave(Zone previous) { |
- assert(previous != null); |
- Zone._current = previous; |
- } |
- |
- /** |
- * Retrieves the zone-value associated with [key]. |
- * |
- * If this zone does not contain the value looks up the same key in the |
- * parent zone. If the [key] is not found returns `null`. |
- * |
- * Any object can be used as key, as long as it has compatible `operator ==` |
- * and `hashCode` implementations. |
- * By controlling access to the key, a zone can grant or deny access to the |
- * zone value. |
- */ |
- operator [](Object key); |
-} |
- |
-ZoneDelegate _parentDelegate(_Zone zone) { |
- if (zone.parent == null) return null; |
- return zone.parent._delegate; |
-} |
- |
-class _ZoneDelegate implements ZoneDelegate { |
- final _Zone _delegationTarget; |
- |
- _ZoneDelegate(this._delegationTarget); |
- |
- /*=R*/ handleUncaughtError/*<R>*/( |
- Zone zone, error, StackTrace stackTrace) { |
- var implementation = _delegationTarget._handleUncaughtError; |
- _Zone implZone = implementation.zone; |
- HandleUncaughtErrorHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler( |
- implZone, _parentDelegate(implZone), zone, error, stackTrace) |
- as Object/*=R*/; |
- } |
- |
- /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()) { |
- var implementation = _delegationTarget._run; |
- _Zone implZone = implementation.zone; |
- RunHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implZone, _parentDelegate(implZone), zone, f) |
- as Object/*=R*/; |
- } |
- |
- /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- var implementation = _delegationTarget._runUnary; |
- _Zone implZone = implementation.zone; |
- RunUnaryHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler( |
- implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/; |
- } |
- |
- /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- var implementation = _delegationTarget._runBinary; |
- _Zone implZone = implementation.zone; |
- RunBinaryHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
- // it's supported. Remove the unnecessary cast. |
- return handler( |
- implZone, _parentDelegate(implZone), zone, f, arg1, arg2) |
- as Object/*=R*/; |
- } |
- |
- ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) { |
- var implementation = _delegationTarget._registerCallback; |
- _Zone implZone = implementation.zone; |
- RegisterCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implZone, _parentDelegate(implZone), zone, f) |
- as Object/*=ZoneCallback<R>*/; |
- } |
- |
- ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
- Zone zone, /*=R*/ f(/*=T*/ arg)) { |
- var implementation = _delegationTarget._registerUnaryCallback; |
- _Zone implZone = implementation.zone; |
- RegisterUnaryCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implZone, _parentDelegate(implZone), zone, f) |
- as Object/*=ZoneUnaryCallback<R, T>*/; |
- } |
- |
- ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
- Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { |
- var implementation = _delegationTarget._registerBinaryCallback; |
- _Zone implZone = implementation.zone; |
- RegisterBinaryCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
- // it's supported. Remove the unnecessary cast. |
- return handler(implZone, _parentDelegate(implZone), zone, f) |
- as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
- } |
- |
- AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { |
- var implementation = _delegationTarget._errorCallback; |
- _Zone implZone = implementation.zone; |
- if (identical(implZone, _ROOT_ZONE)) return null; |
- ErrorCallbackHandler handler = implementation.function; |
- return handler(implZone, _parentDelegate(implZone), zone, |
- error, stackTrace); |
- } |
- |
- void scheduleMicrotask(Zone zone, f()) { |
- var implementation = _delegationTarget._scheduleMicrotask; |
- _Zone implZone = implementation.zone; |
- ScheduleMicrotaskHandler handler = implementation.function; |
- handler(implZone, _parentDelegate(implZone), zone, f); |
- } |
- |
- Timer createTimer(Zone zone, Duration duration, void f()) { |
- var implementation = _delegationTarget._createTimer; |
- _Zone implZone = implementation.zone; |
- CreateTimerHandler handler = implementation.function; |
- return handler(implZone, _parentDelegate(implZone), zone, duration, f); |
- } |
- |
- Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) { |
- var implementation = _delegationTarget._createPeriodicTimer; |
- _Zone implZone = implementation.zone; |
- CreatePeriodicTimerHandler handler = implementation.function; |
- return handler(implZone, _parentDelegate(implZone), zone, period, f); |
- } |
- |
- void print(Zone zone, String line) { |
- var implementation = _delegationTarget._print; |
- _Zone implZone = implementation.zone; |
- PrintHandler handler = implementation.function; |
- handler(implZone, _parentDelegate(implZone), zone, line); |
- } |
- |
- Zone fork(Zone zone, ZoneSpecification specification, |
- Map zoneValues) { |
- var implementation = _delegationTarget._fork; |
- _Zone implZone = implementation.zone; |
- ForkHandler handler = implementation.function; |
- return handler( |
- implZone, _parentDelegate(implZone), zone, specification, zoneValues); |
- } |
-} |
- |
- |
-/** |
- * Base class for Zone implementations. |
- */ |
-abstract class _Zone implements Zone { |
- const _Zone(); |
- |
- _ZoneFunction<RunHandler> get _run; |
- _ZoneFunction<RunUnaryHandler> get _runUnary; |
- _ZoneFunction<RunBinaryHandler> get _runBinary; |
- _ZoneFunction<RegisterCallbackHandler> get _registerCallback; |
- _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback; |
- _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback; |
- _ZoneFunction<ErrorCallbackHandler> get _errorCallback; |
- _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask; |
- _ZoneFunction<CreateTimerHandler> get _createTimer; |
- _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer; |
- _ZoneFunction<PrintHandler> get _print; |
- _ZoneFunction<ForkHandler> get _fork; |
- _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError; |
- _Zone get parent; |
- ZoneDelegate get _delegate; |
- Map get _map; |
- |
- bool inSameErrorZone(Zone otherZone) { |
- return identical(this, otherZone) || |
- identical(errorZone, otherZone.errorZone); |
- } |
-} |
- |
-class _CustomZone extends _Zone { |
- // The actual zone and implementation of each of these |
- // inheritable zone functions. |
- _ZoneFunction<RunHandler> _run; |
- _ZoneFunction<RunUnaryHandler> _runUnary; |
- _ZoneFunction<RunBinaryHandler> _runBinary; |
- _ZoneFunction<RegisterCallbackHandler> _registerCallback; |
- _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback; |
- _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback; |
- _ZoneFunction<ErrorCallbackHandler> _errorCallback; |
- _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask; |
- _ZoneFunction<CreateTimerHandler> _createTimer; |
- _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer; |
- _ZoneFunction<PrintHandler> _print; |
- _ZoneFunction<ForkHandler> _fork; |
- _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError; |
- |
- // A cached delegate to this zone. |
- ZoneDelegate _delegateCache; |
- |
- /// The parent zone. |
- final _Zone parent; |
- |
- /// The zone's scoped value declaration map. |
- /// |
- /// This is always a [HashMap]. |
- final Map _map; |
- |
- ZoneDelegate get _delegate { |
- if (_delegateCache != null) return _delegateCache; |
- _delegateCache = new _ZoneDelegate(this); |
- return _delegateCache; |
- } |
- |
- _CustomZone(this.parent, ZoneSpecification specification, this._map) { |
- // The root zone will have implementations of all parts of the |
- // specification, so it will never try to access the (null) parent. |
- // All other zones have a non-null parent. |
- _run = (specification.run != null) |
- ? new _ZoneFunction<RunHandler>(this, specification.run) |
- : parent._run; |
- _runUnary = (specification.runUnary != null) |
- ? new _ZoneFunction<RunUnaryHandler>(this, specification.runUnary) |
- : parent._runUnary; |
- _runBinary = (specification.runBinary != null) |
- ? new _ZoneFunction<RunBinaryHandler>(this, specification.runBinary) |
- : parent._runBinary; |
- _registerCallback = (specification.registerCallback != null) |
- ? new _ZoneFunction<RegisterCallbackHandler>( |
- this, specification.registerCallback) |
- : parent._registerCallback; |
- _registerUnaryCallback = (specification.registerUnaryCallback != null) |
- ? new _ZoneFunction<RegisterUnaryCallbackHandler>( |
- this, specification.registerUnaryCallback) |
- : parent._registerUnaryCallback; |
- _registerBinaryCallback = (specification.registerBinaryCallback != null) |
- ? new _ZoneFunction<RegisterBinaryCallbackHandler>( |
- this, specification.registerBinaryCallback) |
- : parent._registerBinaryCallback; |
- _errorCallback = (specification.errorCallback != null) |
- ? new _ZoneFunction<ErrorCallbackHandler>( |
- this, specification.errorCallback) |
- : parent._errorCallback; |
- _scheduleMicrotask = (specification.scheduleMicrotask != null) |
- ? new _ZoneFunction<ScheduleMicrotaskHandler>( |
- this, specification.scheduleMicrotask) |
- : parent._scheduleMicrotask; |
- _createTimer = (specification.createTimer != null) |
- ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer) |
- : parent._createTimer; |
- _createPeriodicTimer = (specification.createPeriodicTimer != null) |
- ? new _ZoneFunction<CreatePeriodicTimerHandler>( |
- this, specification.createPeriodicTimer) |
- : parent._createPeriodicTimer; |
- _print = (specification.print != null) |
- ? new _ZoneFunction<PrintHandler>(this, specification.print) |
- : parent._print; |
- _fork = (specification.fork != null) |
- ? new _ZoneFunction<ForkHandler>(this, specification.fork) |
- : parent._fork; |
- _handleUncaughtError = (specification.handleUncaughtError != null) |
- ? new _ZoneFunction<HandleUncaughtErrorHandler>( |
- this, specification.handleUncaughtError) |
- : parent._handleUncaughtError; |
- } |
- |
- /** |
- * The closest error-handling zone. |
- * |
- * Returns `this` if `this` has an error-handler. Otherwise returns the |
- * parent's error-zone. |
- */ |
- Zone get errorZone => _handleUncaughtError.zone; |
- |
- /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) { |
- try { |
- return run(f); |
- } catch (e, s) { |
- return handleUncaughtError(e, s); |
- } |
- } |
- |
- /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- try { |
- return runUnary(f, arg); |
- } catch (e, s) { |
- return handleUncaughtError(e, s); |
- } |
- } |
- |
- /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- try { |
- return runBinary(f, arg1, arg2); |
- } catch (e, s) { |
- return handleUncaughtError(e, s); |
- } |
- } |
- |
- ZoneCallback/*<R>*/ bindCallback/*<R>*/( |
- /*=R*/ f(), { bool runGuarded: true }) { |
- var registered = registerCallback(f); |
- if (runGuarded) { |
- return () => this.runGuarded(registered); |
- } else { |
- return () => this.run(registered); |
- } |
- } |
- |
- ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( |
- /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) { |
- var registered = registerUnaryCallback(f); |
- if (runGuarded) { |
- return (arg) => this.runUnaryGuarded(registered, arg); |
- } else { |
- return (arg) => this.runUnary(registered, arg); |
- } |
- } |
- |
- ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) { |
- var registered = registerBinaryCallback(f); |
- if (runGuarded) { |
- return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2); |
- } else { |
- return (arg1, arg2) => this.runBinary(registered, arg1, arg2); |
- } |
- } |
- |
- operator [](Object key) { |
- var result = _map[key]; |
- if (result != null || _map.containsKey(key)) return result; |
- // If we are not the root zone, look up in the parent zone. |
- if (parent != null) { |
- // We do not optimize for repeatedly looking up a key which isn't |
- // there. That would require storing the key and keeping it alive. |
- // Copying the key/value from the parent does not keep any new values |
- // alive. |
- var value = parent[key]; |
- if (value != null) { |
- _map[key] = value; |
- } |
- return value; |
- } |
- assert(this == _ROOT_ZONE); |
- return null; |
- } |
- |
- // Methods that can be customized by the zone specification. |
- |
- /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) { |
- var implementation = this._handleUncaughtError; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- HandleUncaughtErrorHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler( |
- implementation.zone, parentDelegate, this, error, stackTrace) |
- as Object/*=R*/; |
- } |
- |
- Zone fork({ZoneSpecification specification, Map zoneValues}) { |
- var implementation = this._fork; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- ForkHandler handler = implementation.function; |
- return handler(implementation.zone, parentDelegate, this, |
- specification, zoneValues); |
- } |
- |
- /*=R*/ run/*<R>*/(/*=R*/ f()) { |
- var implementation = this._run; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RunHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implementation.zone, parentDelegate, this, f) |
- as Object/*=R*/; |
- } |
- |
- /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- var implementation = this._runUnary; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RunUnaryHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implementation.zone, parentDelegate, this, f, arg) |
- as Object/*=R*/; |
- } |
- |
- /*=R*/ runBinary/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- var implementation = this._runBinary; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RunBinaryHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
- // it's supported. Remove the unnecessary cast. |
- return handler( |
- implementation.zone, parentDelegate, this, f, arg1, arg2) |
- as Object/*=R*/; |
- } |
- |
- ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) { |
- var implementation = this._registerCallback; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RegisterCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implementation.zone, parentDelegate, this, callback) |
- as Object/*=ZoneCallback<R>*/; |
- } |
- |
- ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
- /*=R*/ callback(/*=T*/ arg)) { |
- var implementation = this._registerUnaryCallback; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RegisterUnaryCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
- // supported. Remove the unnecessary cast. |
- return handler(implementation.zone, parentDelegate, this, callback) |
- as Object/*=ZoneUnaryCallback<R, T>*/; |
- } |
- |
- ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) { |
- var implementation = this._registerBinaryCallback; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- RegisterBinaryCallbackHandler handler = implementation.function; |
- // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
- // it's supported. Remove the unnecessary cast. |
- return handler(implementation.zone, parentDelegate, this, callback) |
- as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
- } |
- |
- AsyncError errorCallback(Object error, StackTrace stackTrace) { |
- var implementation = this._errorCallback; |
- assert(implementation != null); |
- final Zone implementationZone = implementation.zone; |
- if (identical(implementationZone, _ROOT_ZONE)) return null; |
- final ZoneDelegate parentDelegate = _parentDelegate(implementationZone); |
- ErrorCallbackHandler handler = implementation.function; |
- return handler( |
- implementationZone, parentDelegate, this, error, stackTrace); |
- } |
- |
- void scheduleMicrotask(void f()) { |
- var implementation = this._scheduleMicrotask; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- ScheduleMicrotaskHandler handler = implementation.function; |
- return handler(implementation.zone, parentDelegate, this, f); |
- } |
- |
- Timer createTimer(Duration duration, void f()) { |
- var implementation = this._createTimer; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- CreateTimerHandler handler = implementation.function; |
- return handler(implementation.zone, parentDelegate, this, duration, f); |
- } |
- |
- Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { |
- var implementation = this._createPeriodicTimer; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- CreatePeriodicTimerHandler handler = implementation.function; |
- return handler( |
- implementation.zone, parentDelegate, this, duration, f); |
- } |
- |
- void print(String line) { |
- var implementation = this._print; |
- assert(implementation != null); |
- ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
- PrintHandler handler = implementation.function; |
- return handler(implementation.zone, parentDelegate, this, line); |
- } |
-} |
- |
-/*=R*/ _rootHandleUncaughtError/*<R>*/( |
- Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { |
- _schedulePriorityAsyncCallback(() { |
- if (error == null) error = new NullThrownError(); |
- if (stackTrace == null) throw error; |
- _rethrow(error, stackTrace); |
- }); |
-} |
- |
-external void _rethrow(Object error, StackTrace stackTrace); |
- |
-/*=R*/ _rootRun/*<R>*/(Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) { |
- if (Zone._current == zone) return f(); |
- |
- Zone old = Zone._enter(zone); |
- try { |
- return f(); |
- } finally { |
- Zone._leave(old); |
- } |
-} |
- |
-/*=R*/ _rootRunUnary/*<R, T>*/(Zone self, ZoneDelegate parent, Zone zone, |
- /*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- if (Zone._current == zone) return f(arg); |
- |
- Zone old = Zone._enter(zone); |
- try { |
- return f(arg); |
- } finally { |
- Zone._leave(old); |
- } |
-} |
- |
-/*=R*/ _rootRunBinary/*<R, T1, T2>*/(Zone self, ZoneDelegate parent, Zone zone, |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- if (Zone._current == zone) return f(arg1, arg2); |
- |
- Zone old = Zone._enter(zone); |
- try { |
- return f(arg1, arg2); |
- } finally { |
- Zone._leave(old); |
- } |
-} |
- |
-ZoneCallback/*<R>*/ _rootRegisterCallback/*<R>*/( |
- Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) { |
- return f; |
-} |
- |
-ZoneUnaryCallback/*<R, T>*/ _rootRegisterUnaryCallback/*<R, T>*/( |
- Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f(/*=T*/ arg)) { |
- return f; |
-} |
- |
-ZoneBinaryCallback/*<R, T1, T2>*/ _rootRegisterBinaryCallback/*<R, T1, T2>*/( |
- Zone self, ZoneDelegate parent, Zone zone, |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { |
- return f; |
-} |
- |
-AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone, |
- Object error, StackTrace stackTrace) => null; |
- |
-void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { |
- if (!identical(_ROOT_ZONE, zone)) { |
- bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); |
- f = zone.bindCallback(f, runGuarded: hasErrorHandler); |
- // Use root zone as event zone if the function is already bound. |
- zone = _ROOT_ZONE; |
- } |
- _scheduleAsyncCallback(f); |
-} |
- |
-Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, |
- Duration duration, void callback()) { |
- if (!identical(_ROOT_ZONE, zone)) { |
- callback = zone.bindCallback(callback); |
- } |
- return Timer._createTimer(duration, callback); |
-} |
- |
-Timer _rootCreatePeriodicTimer( |
- Zone self, ZoneDelegate parent, Zone zone, |
- Duration duration, void callback(Timer timer)) { |
- if (!identical(_ROOT_ZONE, zone)) { |
- // TODO(floitsch): the return type should be 'void'. |
- callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback); |
- } |
- return Timer._createPeriodicTimer(duration, callback); |
-} |
- |
-void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { |
- printToConsole(line); |
-} |
- |
-void _printToZone(String line) { |
- Zone.current.print(line); |
-} |
- |
-Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone, |
- ZoneSpecification specification, |
- Map zoneValues) { |
- // TODO(floitsch): it would be nice if we could get rid of this hack. |
- // Change the static zoneOrDirectPrint function to go through zones |
- // from now on. |
- printToZone = _printToZone; |
- |
- if (specification == null) { |
- specification = const ZoneSpecification(); |
- } else if (specification is! _ZoneSpecification) { |
- throw new ArgumentError("ZoneSpecifications must be instantiated" |
- " with the provided constructor."); |
- } |
- Map valueMap; |
- if (zoneValues == null) { |
- if (zone is _Zone) { |
- valueMap = zone._map; |
- } else { |
- valueMap = new HashMap(); |
- } |
- } else { |
- valueMap = new HashMap.from(zoneValues); |
- } |
- return new _CustomZone(zone, specification, valueMap); |
-} |
- |
-class _RootZone extends _Zone { |
- const _RootZone(); |
- |
- _ZoneFunction<RunHandler> get _run => |
- const _ZoneFunction<RunHandler>(_ROOT_ZONE, _rootRun); |
- _ZoneFunction<RunUnaryHandler> get _runUnary => |
- const _ZoneFunction<RunUnaryHandler>(_ROOT_ZONE, _rootRunUnary); |
- _ZoneFunction<RunBinaryHandler> get _runBinary => |
- const _ZoneFunction<RunBinaryHandler>(_ROOT_ZONE, _rootRunBinary); |
- _ZoneFunction<RegisterCallbackHandler> get _registerCallback => |
- const _ZoneFunction<RegisterCallbackHandler>( |
- _ROOT_ZONE, _rootRegisterCallback); |
- _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback => |
- const _ZoneFunction<RegisterUnaryCallbackHandler>( |
- _ROOT_ZONE, _rootRegisterUnaryCallback); |
- _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback => |
- const _ZoneFunction<RegisterBinaryCallbackHandler>( |
- _ROOT_ZONE, _rootRegisterBinaryCallback); |
- _ZoneFunction<ErrorCallbackHandler> get _errorCallback => |
- const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback); |
- _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask => |
- const _ZoneFunction<ScheduleMicrotaskHandler>( |
- _ROOT_ZONE, _rootScheduleMicrotask); |
- _ZoneFunction<CreateTimerHandler> get _createTimer => |
- const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer); |
- _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer => |
- const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePeriodicTimer); |
- _ZoneFunction<PrintHandler> get _print => |
- const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint); |
- _ZoneFunction<ForkHandler> get _fork => |
- const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork); |
- _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError => |
- const _ZoneFunction<HandleUncaughtErrorHandler>( |
- _ROOT_ZONE, _rootHandleUncaughtError); |
- |
- // The parent zone. |
- _Zone get parent => null; |
- |
- /// The zone's scoped value declaration map. |
- /// |
- /// This is always a [HashMap]. |
- Map get _map => _rootMap; |
- |
- static Map _rootMap = new HashMap(); |
- |
- static ZoneDelegate _rootDelegate; |
- |
- ZoneDelegate get _delegate { |
- if (_rootDelegate != null) return _rootDelegate; |
- return _rootDelegate = new _ZoneDelegate(this); |
- } |
- |
- /** |
- * The closest error-handling zone. |
- * |
- * Returns `this` if `this` has an error-handler. Otherwise returns the |
- * parent's error-zone. |
- */ |
- Zone get errorZone => this; |
- |
- // Zone interface. |
- |
- /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) { |
- try { |
- if (identical(_ROOT_ZONE, Zone._current)) { |
- return f(); |
- } |
- return _rootRun/*<R>*/(null, null, this, f); |
- } catch (e, s) { |
- return handleUncaughtError/*<R>*/(e, s); |
- } |
- } |
- |
- /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- try { |
- if (identical(_ROOT_ZONE, Zone._current)) { |
- return f(arg); |
- } |
- return _rootRunUnary/*<R, T>*/(null, null, this, f, arg); |
- } catch (e, s) { |
- return handleUncaughtError/*<R>*/(e, s); |
- } |
- } |
- |
- /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- try { |
- if (identical(_ROOT_ZONE, Zone._current)) { |
- return f(arg1, arg2); |
- } |
- return _rootRunBinary/*<R, T1, T2>*/(null, null, this, f, arg1, arg2); |
- } catch (e, s) { |
- return handleUncaughtError/*<R>*/(e, s); |
- } |
- } |
- |
- ZoneCallback/*<R>*/ bindCallback/*<R>*/( |
- /*=R*/ f(), { bool runGuarded: true }) { |
- if (runGuarded) { |
- return () => this.runGuarded/*<R>*/(f); |
- } else { |
- return () => this.run/*<R>*/(f); |
- } |
- } |
- |
- ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( |
- /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) { |
- if (runGuarded) { |
- return (arg) => this.runUnaryGuarded/*<R, T>*/(f, arg); |
- } else { |
- return (arg) => this.runUnary/*<R, T>*/(f, arg); |
- } |
- } |
- |
- ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) { |
- if (runGuarded) { |
- return (arg1, arg2) => |
- this.runBinaryGuarded/*<R, T1, T2>*/(f, arg1, arg2); |
- } else { |
- return (arg1, arg2) => this.runBinary/*<R, T1, T2>*/(f, arg1, arg2); |
- } |
- } |
- |
- operator [](Object key) => null; |
- |
- // Methods that can be customized by the zone specification. |
- |
- /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) { |
- return _rootHandleUncaughtError(null, null, this, error, stackTrace); |
- } |
- |
- Zone fork({ZoneSpecification specification, Map zoneValues}) { |
- return _rootFork(null, null, this, specification, zoneValues); |
- } |
- |
- /*=R*/ run/*<R>*/(/*=R*/ f()) { |
- if (identical(Zone._current, _ROOT_ZONE)) return f(); |
- return _rootRun(null, null, this, f); |
- } |
- |
- /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { |
- if (identical(Zone._current, _ROOT_ZONE)) return f(arg); |
- return _rootRunUnary(null, null, this, f, arg); |
- } |
- |
- /*=R*/ runBinary/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { |
- if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2); |
- return _rootRunBinary(null, null, this, f, arg1, arg2); |
- } |
- |
- ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ f()) => f; |
- |
- ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( |
- /*=R*/ f(/*=T*/ arg)) => f; |
- |
- ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( |
- /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f; |
- |
- AsyncError errorCallback(Object error, StackTrace stackTrace) => null; |
- |
- void scheduleMicrotask(void f()) { |
- _rootScheduleMicrotask(null, null, this, f); |
- } |
- |
- Timer createTimer(Duration duration, void f()) { |
- return Timer._createTimer(duration, f); |
- } |
- |
- Timer createPeriodicTimer(Duration duration, void f(Timer timer)) { |
- return Timer._createPeriodicTimer(duration, f); |
- } |
- |
- void print(String line) { |
- printToConsole(line); |
- } |
-} |
- |
-const _ROOT_ZONE = const _RootZone(); |
- |
-/** |
- * Runs [body] in its own zone. |
- * |
- * If [onError] is non-null the zone is considered an error zone. All uncaught |
- * errors, synchronous or asynchronous, in the zone are caught and handled |
- * by the callback. |
- * |
- * Errors may never cross error-zone boundaries. This is intuitive for leaving |
- * a zone, but it also applies for errors that would enter an error-zone. |
- * Errors that try to cross error-zone boundaries are considered uncaught. |
- * |
- * var future = new Future.value(499); |
- * runZoned(() { |
- * future = future.then((_) { throw "error in first error-zone"; }); |
- * runZoned(() { |
- * future = future.catchError((e) { print("Never reached!"); }); |
- * }, onError: (e) { print("unused error handler"); }); |
- * }, onError: (e) { print("catches error of first error-zone."); }); |
- * |
- * Example: |
- * |
- * runZoned(() { |
- * new Future(() { throw "asynchronous error"; }); |
- * }, onError: print); // Will print "asynchronous error". |
- */ |
-/*=R*/ runZoned/*<R>*/(/*=R*/ body(), |
- { Map zoneValues, |
- ZoneSpecification zoneSpecification, |
- Function onError }) { |
- HandleUncaughtErrorHandler errorHandler; |
- if (onError != null) { |
- errorHandler = (Zone self, ZoneDelegate parent, Zone zone, |
- error, StackTrace stackTrace) { |
- try { |
- // Change this is check back to |
- // onError is ZoneBinaryCallback<dynamic/*=R*/, dynamic, StackTrace> |
- // once is checks for that type are handled correctly. |
- if (onError is ZoneBinaryCallback<dynamic, dynamic, StackTrace>) { |
- return self.parent.runBinary(onError, error, stackTrace) as Object/*=R*/; |
- } |
- return self.parent.runUnary(onError, error); |
- } catch(e, s) { |
- if (identical(e, error)) { |
- return parent.handleUncaughtError(zone, error, stackTrace); |
- } else { |
- return parent.handleUncaughtError(zone, e, s); |
- } |
- } |
- }; |
- } |
- if (zoneSpecification == null) { |
- zoneSpecification = |
- new ZoneSpecification(handleUncaughtError: errorHandler); |
- } else if (errorHandler != null) { |
- zoneSpecification = |
- new ZoneSpecification.from(zoneSpecification, |
- handleUncaughtError: errorHandler); |
- } |
- Zone zone = Zone.current.fork(specification: zoneSpecification, |
- zoneValues: zoneValues); |
- if (onError != null) { |
- return zone.runGuarded(body); |
- } else { |
- return zone.run(body); |
- } |
-} |