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

Unified Diff: pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart

Issue 2698353003: unfork DDC's copy of most SDK libraries (Closed)
Patch Set: revert core_patch Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
- }
-}
« no previous file with comments | « pkg/dev_compiler/tool/input_sdk/lib/async/timer.dart ('k') | pkg/dev_compiler/tool/input_sdk/lib/collection/collection.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698