| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart.async; | 5 part of dart.async; |
| 6 | 6 |
| 7 typedef R ZoneCallback<R>(); | 7 typedef R ZoneCallback<R>(); |
| 8 typedef R ZoneUnaryCallback<R, T>(T arg); | 8 typedef R ZoneUnaryCallback<R, T>(T arg); |
| 9 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2); | 9 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2); |
| 10 | 10 |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 * | 209 * |
| 210 * While zones have access to their parent zone (through [Zone.parent]) it is | 210 * While zones have access to their parent zone (through [Zone.parent]) it is |
| 211 * recommended to call the methods on the provided parent delegate for two | 211 * recommended to call the methods on the provided parent delegate for two |
| 212 * reasons: | 212 * reasons: |
| 213 * 1. the delegate methods take an additional `zone` argument which is the | 213 * 1. the delegate methods take an additional `zone` argument which is the |
| 214 * zone the action has been initiated in. | 214 * zone the action has been initiated in. |
| 215 * 2. delegate calls are more efficient, since the implementation knows how | 215 * 2. delegate calls are more efficient, since the implementation knows how |
| 216 * to skip zones that would just delegate to their parents. | 216 * to skip zones that would just delegate to their parents. |
| 217 */ | 217 */ |
| 218 abstract class ZoneDelegate { | 218 abstract class ZoneDelegate { |
| 219 /*=R*/ handleUncaughtError/*<R>*/( | 219 R handleUncaughtError<R>( |
| 220 Zone zone, error, StackTrace stackTrace); | 220 Zone zone, error, StackTrace stackTrace); |
| 221 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()); | 221 R run<R>(Zone zone, R f()); |
| 222 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg); | 222 R runUnary<R, T>(Zone zone, R f(T arg), T arg); |
| 223 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, | 223 R runBinary<R, T1, T2>(Zone zone, |
| 224 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2); | 224 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2); |
| 225 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()); | 225 ZoneCallback<R> registerCallback<R>(Zone zone, R f()); |
| 226 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 226 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( |
| 227 Zone zone, /*=R*/ f(/*=T*/ arg)); | 227 Zone zone, R f(T arg)); |
| 228 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 228 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( |
| 229 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)); | 229 Zone zone, R f(T1 arg1, T2 arg2)); |
| 230 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); | 230 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace); |
| 231 void scheduleMicrotask(Zone zone, void f()); | 231 void scheduleMicrotask(Zone zone, void f()); |
| 232 Timer createTimer(Zone zone, Duration duration, void f()); | 232 Timer createTimer(Zone zone, Duration duration, void f()); |
| 233 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); | 233 Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)); |
| 234 void print(Zone zone, String line); | 234 void print(Zone zone, String line); |
| 235 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); | 235 Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues); |
| 236 } | 236 } |
| 237 | 237 |
| 238 /** | 238 /** |
| 239 * A zone represents an environment that remains stable across asynchronous | 239 * A zone represents an environment that remains stable across asynchronous |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 * chains, but for which no child registered an error handler. | 315 * chains, but for which no child registered an error handler. |
| 316 * Most asynchronous classes, like [Future] or [Stream] push errors to their | 316 * Most asynchronous classes, like [Future] or [Stream] push errors to their |
| 317 * listeners. Errors are propagated this way until either a listener handles | 317 * listeners. Errors are propagated this way until either a listener handles |
| 318 * the error (for example with [Future.catchError]), or no listener is | 318 * the error (for example with [Future.catchError]), or no listener is |
| 319 * available anymore. In the latter case, futures and streams invoke the | 319 * available anymore. In the latter case, futures and streams invoke the |
| 320 * zone's [handleUncaughtError]. | 320 * zone's [handleUncaughtError]. |
| 321 * | 321 * |
| 322 * By default, when handled by the root zone, uncaught asynchronous errors are | 322 * By default, when handled by the root zone, uncaught asynchronous errors are |
| 323 * treated like uncaught synchronous exceptions. | 323 * treated like uncaught synchronous exceptions. |
| 324 */ | 324 */ |
| 325 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace); | 325 R handleUncaughtError<R>(error, StackTrace stackTrace); |
| 326 | 326 |
| 327 /** | 327 /** |
| 328 * The parent zone of the this zone. | 328 * The parent zone of the this zone. |
| 329 * | 329 * |
| 330 * Is `null` if `this` is the [ROOT] zone. | 330 * Is `null` if `this` is the [ROOT] zone. |
| 331 * | 331 * |
| 332 * Zones are created by [fork] on an existing zone, or by [runZoned] which | 332 * Zones are created by [fork] on an existing zone, or by [runZoned] which |
| 333 * forks the [current] zone. The new zone's parent zone is the zone it was | 333 * forks the [current] zone. The new zone's parent zone is the zone it was |
| 334 * forked from. | 334 * forked from. |
| 335 */ | 335 */ |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 * By default (as implemented in the [ROOT] zone), runs [action] | 416 * By default (as implemented in the [ROOT] zone), runs [action] |
| 417 * with [current] set to this zone. | 417 * with [current] set to this zone. |
| 418 * | 418 * |
| 419 * If [action] throws, the synchronous exception is not caught by the zone's | 419 * If [action] throws, the synchronous exception is not caught by the zone's |
| 420 * error handler. Use [runGuarded] to achieve that. | 420 * error handler. Use [runGuarded] to achieve that. |
| 421 * | 421 * |
| 422 * Since the root zone is the only zone that can modify the value of | 422 * Since the root zone is the only zone that can modify the value of |
| 423 * [current], custom zones intercepting run should always delegate to their | 423 * [current], custom zones intercepting run should always delegate to their |
| 424 * parent zone. They may take actions before and after the call. | 424 * parent zone. They may take actions before and after the call. |
| 425 */ | 425 */ |
| 426 /*=R*/ run/*<R>*/(/*=R*/ action()); | 426 R run<R>(R action()); |
| 427 | 427 |
| 428 /** | 428 /** |
| 429 * Executes the given [action] with [argument] in this zone. | 429 * Executes the given [action] with [argument] in this zone. |
| 430 * | 430 * |
| 431 * As [run] except that [action] is called with one [argument] instead of | 431 * As [run] except that [action] is called with one [argument] instead of |
| 432 * none. | 432 * none. |
| 433 */ | 433 */ |
| 434 /*=R*/ runUnary/*<R, T>*/(/*=R*/ action(/*=T*/ argument), /*=T*/ argument); | 434 R runUnary<R, T>(R action(T argument), T argument); |
| 435 | 435 |
| 436 /** | 436 /** |
| 437 * Executes the given [action] with [argument1] and [argument2] in this | 437 * Executes the given [action] with [argument1] and [argument2] in this |
| 438 * zone. | 438 * zone. |
| 439 * | 439 * |
| 440 * As [run] except that [action] is called with two arguments instead of none. | 440 * As [run] except that [action] is called with two arguments instead of none. |
| 441 */ | 441 */ |
| 442 /*=R*/ runBinary/*<R, T1, T2>*/( | 442 R runBinary<R, T1, T2>( |
| 443 /*=R*/ action(/*=T1*/ argument1, /*=T2*/ argument2), /*=T1*/ argument1, | 443 R action(T1 argument1, T2 argument2), T1 argument1, |
| 444 /*=T2*/ argument2); | 444 T2 argument2); |
| 445 | 445 |
| 446 /** | 446 /** |
| 447 * Executes the given [action] in this zone and catches synchronous | 447 * Executes the given [action] in this zone and catches synchronous |
| 448 * errors. | 448 * errors. |
| 449 * | 449 * |
| 450 * This function is equivalent to: | 450 * This function is equivalent to: |
| 451 * ``` | 451 * ``` |
| 452 * try { | 452 * try { |
| 453 * return this.run(action); | 453 * return this.run(action); |
| 454 * } catch (e, s) { | 454 * } catch (e, s) { |
| 455 * return this.handleUncaughtError(e, s); | 455 * return this.handleUncaughtError(e, s); |
| 456 * } | 456 * } |
| 457 * ``` | 457 * ``` |
| 458 * | 458 * |
| 459 * See [run]. | 459 * See [run]. |
| 460 */ | 460 */ |
| 461 /*=R*/ runGuarded/*<R>*/(/*=R*/ action()); | 461 R runGuarded<R>(R action()); |
| 462 | 462 |
| 463 /** | 463 /** |
| 464 * Executes the given [action] with [argument] in this zone and | 464 * Executes the given [action] with [argument] in this zone and |
| 465 * catches synchronous errors. | 465 * catches synchronous errors. |
| 466 * | 466 * |
| 467 * See [runGuarded]. | 467 * See [runGuarded]. |
| 468 */ | 468 */ |
| 469 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ action(/*=T*/ argument), | 469 R runUnaryGuarded<R, T>(R action(T argument), |
| 470 /*=T*/ argument); | 470 T argument); |
| 471 | 471 |
| 472 /** | 472 /** |
| 473 * Executes the given [action] with [argument1] and [argument2] in this | 473 * Executes the given [action] with [argument1] and [argument2] in this |
| 474 * zone and catches synchronous errors. | 474 * zone and catches synchronous errors. |
| 475 * | 475 * |
| 476 * See [runGuarded]. | 476 * See [runGuarded]. |
| 477 */ | 477 */ |
| 478 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( | 478 R runBinaryGuarded<R, T1, T2>( |
| 479 /*=R*/ action(/*=T1*/ argument1, /*=T2*/ argument2), /*=T1*/ argument1, | 479 R action(T1 argument1, T2 argument2), T1 argument1, |
| 480 /*=T2*/ argument2); | 480 T2 argument2); |
| 481 | 481 |
| 482 /** | 482 /** |
| 483 * Registers the given callback in this zone. | 483 * Registers the given callback in this zone. |
| 484 * | 484 * |
| 485 * When implementing an asynchronous primitive that uses callbacks, the | 485 * When implementing an asynchronous primitive that uses callbacks, the |
| 486 * callback must be registered using [registerCallback] at the point where the | 486 * callback must be registered using [registerCallback] at the point where the |
| 487 * user provides the callback. This allows zones to record other information | 487 * user provides the callback. This allows zones to record other information |
| 488 * that they need at the same time, perhaps even wrapping the callback, so | 488 * that they need at the same time, perhaps even wrapping the callback, so |
| 489 * that the callback is prepared when it is later run in the same zones | 489 * that the callback is prepared when it is later run in the same zones |
| 490 * (using [run]). For example, a zone may decide | 490 * (using [run]). For example, a zone may decide |
| 491 * to store the stack trace (at the time of the registration) with the | 491 * to store the stack trace (at the time of the registration) with the |
| 492 * callback. | 492 * callback. |
| 493 * | 493 * |
| 494 * Returns the callback that should be used in place of the provided | 494 * Returns the callback that should be used in place of the provided |
| 495 * [callback]. Frequently zones simply return the original callback. | 495 * [callback]. Frequently zones simply return the original callback. |
| 496 * | 496 * |
| 497 * Custom zones may intercept this operation. The default implementation in | 497 * Custom zones may intercept this operation. The default implementation in |
| 498 * [Zone.ROOT] returns the original callback unchanged. | 498 * [Zone.ROOT] returns the original callback unchanged. |
| 499 */ | 499 */ |
| 500 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()); | 500 ZoneCallback<R> registerCallback<R>(R callback()); |
| 501 | 501 |
| 502 /** | 502 /** |
| 503 * Registers the given callback in this zone. | 503 * Registers the given callback in this zone. |
| 504 * | 504 * |
| 505 * Similar to [registerCallback] but with a unary callback. | 505 * Similar to [registerCallback] but with a unary callback. |
| 506 */ | 506 */ |
| 507 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 507 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( |
| 508 /*=R*/ callback(/*=T*/ arg)); | 508 R callback(T arg)); |
| 509 | 509 |
| 510 /** | 510 /** |
| 511 * Registers the given callback in this zone. | 511 * Registers the given callback in this zone. |
| 512 * | 512 * |
| 513 * Similar to [registerCallback] but with a unary callback. | 513 * Similar to [registerCallback] but with a unary callback. |
| 514 */ | 514 */ |
| 515 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 515 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( |
| 516 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)); | 516 R callback(T1 arg1, T2 arg2)); |
| 517 | 517 |
| 518 /** | 518 /** |
| 519 * Equivalent to: | 519 * Equivalent to: |
| 520 * | 520 * |
| 521 * ZoneCallback registered = this.registerCallback(action); | 521 * ZoneCallback registered = this.registerCallback(action); |
| 522 * if (runGuarded) return () => this.runGuarded(registered); | 522 * if (runGuarded) return () => this.runGuarded(registered); |
| 523 * return () => this.run(registered); | 523 * return () => this.run(registered); |
| 524 * | 524 * |
| 525 */ | 525 */ |
| 526 ZoneCallback/*<R>*/ bindCallback/*<R>*/( | 526 ZoneCallback<R> bindCallback<R>( |
| 527 /*=R*/ action(), { bool runGuarded: true }); | 527 R action(), { bool runGuarded: true }); |
| 528 | 528 |
| 529 /** | 529 /** |
| 530 * Equivalent to: | 530 * Equivalent to: |
| 531 * | 531 * |
| 532 * ZoneCallback registered = this.registerUnaryCallback(action); | 532 * ZoneCallback registered = this.registerUnaryCallback(action); |
| 533 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg); | 533 * if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg); |
| 534 * return (arg) => thin.runUnary(registered, arg); | 534 * return (arg) => thin.runUnary(registered, arg); |
| 535 */ | 535 */ |
| 536 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( | 536 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( |
| 537 /*=R*/ action(/*=T*/ argument), { bool runGuarded: true }); | 537 R action(T argument), { bool runGuarded: true }); |
| 538 | 538 |
| 539 /** | 539 /** |
| 540 * Equivalent to: | 540 * Equivalent to: |
| 541 * | 541 * |
| 542 * ZoneCallback registered = registerBinaryCallback(action); | 542 * ZoneCallback registered = registerBinaryCallback(action); |
| 543 * if (runGuarded) { | 543 * if (runGuarded) { |
| 544 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg); | 544 * return (arg1, arg2) => this.runBinaryGuarded(registered, arg); |
| 545 * } | 545 * } |
| 546 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2); | 546 * return (arg1, arg2) => thin.runBinary(registered, arg1, arg2); |
| 547 */ | 547 */ |
| 548 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( | 548 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( |
| 549 /*=R*/ action(/*=T1*/ argument1, /*=T2*/ argument2), | 549 R action(T1 argument1, T2 argument2), |
| 550 { bool runGuarded: true }); | 550 { bool runGuarded: true }); |
| 551 | 551 |
| 552 /** | 552 /** |
| 553 * Intercepts errors when added programatically to a `Future` or `Stream`. | 553 * Intercepts errors when added programatically to a `Future` or `Stream`. |
| 554 * | 554 * |
| 555 * When calling [Completer.completeError], [Stream.addError], | 555 * When calling [Completer.completeError], [Stream.addError], |
| 556 * or some [Future] constructors, the current zone is allowed to intercept | 556 * or some [Future] constructors, the current zone is allowed to intercept |
| 557 * and replace the error. | 557 * and replace the error. |
| 558 * | 558 * |
| 559 * Future constructors invoke this function when the error is received | 559 * Future constructors invoke this function when the error is received |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 ZoneDelegate _parentDelegate(_Zone zone) { | 665 ZoneDelegate _parentDelegate(_Zone zone) { |
| 666 if (zone.parent == null) return null; | 666 if (zone.parent == null) return null; |
| 667 return zone.parent._delegate; | 667 return zone.parent._delegate; |
| 668 } | 668 } |
| 669 | 669 |
| 670 class _ZoneDelegate implements ZoneDelegate { | 670 class _ZoneDelegate implements ZoneDelegate { |
| 671 final _Zone _delegationTarget; | 671 final _Zone _delegationTarget; |
| 672 | 672 |
| 673 _ZoneDelegate(this._delegationTarget); | 673 _ZoneDelegate(this._delegationTarget); |
| 674 | 674 |
| 675 /*=R*/ handleUncaughtError/*<R>*/( | 675 R handleUncaughtError<R>( |
| 676 Zone zone, error, StackTrace stackTrace) { | 676 Zone zone, error, StackTrace stackTrace) { |
| 677 var implementation = _delegationTarget._handleUncaughtError; | 677 var implementation = _delegationTarget._handleUncaughtError; |
| 678 _Zone implZone = implementation.zone; | 678 _Zone implZone = implementation.zone; |
| 679 HandleUncaughtErrorHandler handler = implementation.function; | 679 HandleUncaughtErrorHandler handler = implementation.function; |
| 680 // TODO(floitsch): make this a generic method call on '<R>' once it's | 680 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 681 // supported. Remove the unnecessary cast. | 681 // supported. Remove the unnecessary cast. |
| 682 return handler( | 682 return handler( |
| 683 implZone, _parentDelegate(implZone), zone, error, stackTrace) | 683 implZone, _parentDelegate(implZone), zone, error, stackTrace) |
| 684 as Object/*=R*/; | 684 as Object/*=R*/; |
| 685 } | 685 } |
| 686 | 686 |
| 687 /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()) { | 687 R run<R>(Zone zone, R f()) { |
| 688 var implementation = _delegationTarget._run; | 688 var implementation = _delegationTarget._run; |
| 689 _Zone implZone = implementation.zone; | 689 _Zone implZone = implementation.zone; |
| 690 RunHandler handler = implementation.function; | 690 RunHandler handler = implementation.function; |
| 691 // TODO(floitsch): make this a generic method call on '<R>' once it's | 691 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 692 // supported. Remove the unnecessary cast. | 692 // supported. Remove the unnecessary cast. |
| 693 return handler(implZone, _parentDelegate(implZone), zone, f) | 693 return handler(implZone, _parentDelegate(implZone), zone, f) |
| 694 as Object/*=R*/; | 694 as Object/*=R*/; |
| 695 } | 695 } |
| 696 | 696 |
| 697 /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 697 R runUnary<R, T>(Zone zone, R f(T arg), T arg) { |
| 698 var implementation = _delegationTarget._runUnary; | 698 var implementation = _delegationTarget._runUnary; |
| 699 _Zone implZone = implementation.zone; | 699 _Zone implZone = implementation.zone; |
| 700 RunUnaryHandler handler = implementation.function; | 700 RunUnaryHandler handler = implementation.function; |
| 701 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 701 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
| 702 // supported. Remove the unnecessary cast. | 702 // supported. Remove the unnecessary cast. |
| 703 return handler( | 703 return handler( |
| 704 implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/; | 704 implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/; |
| 705 } | 705 } |
| 706 | 706 |
| 707 /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone, | 707 R runBinary<R, T1, T2>(Zone zone, |
| 708 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 708 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 709 var implementation = _delegationTarget._runBinary; | 709 var implementation = _delegationTarget._runBinary; |
| 710 _Zone implZone = implementation.zone; | 710 _Zone implZone = implementation.zone; |
| 711 RunBinaryHandler handler = implementation.function; | 711 RunBinaryHandler handler = implementation.function; |
| 712 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 712 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
| 713 // it's supported. Remove the unnecessary cast. | 713 // it's supported. Remove the unnecessary cast. |
| 714 return handler( | 714 return handler( |
| 715 implZone, _parentDelegate(implZone), zone, f, arg1, arg2) | 715 implZone, _parentDelegate(implZone), zone, f, arg1, arg2) |
| 716 as Object/*=R*/; | 716 as Object/*=R*/; |
| 717 } | 717 } |
| 718 | 718 |
| 719 ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) { | 719 ZoneCallback<R> registerCallback<R>(Zone zone, R f()) { |
| 720 var implementation = _delegationTarget._registerCallback; | 720 var implementation = _delegationTarget._registerCallback; |
| 721 _Zone implZone = implementation.zone; | 721 _Zone implZone = implementation.zone; |
| 722 RegisterCallbackHandler handler = implementation.function; | 722 RegisterCallbackHandler handler = implementation.function; |
| 723 // TODO(floitsch): make this a generic method call on '<R>' once it's | 723 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 724 // supported. Remove the unnecessary cast. | 724 // supported. Remove the unnecessary cast. |
| 725 return handler(implZone, _parentDelegate(implZone), zone, f) | 725 return handler(implZone, _parentDelegate(implZone), zone, f) |
| 726 as Object/*=ZoneCallback<R>*/; | 726 as Object/*=ZoneCallback<R>*/; |
| 727 } | 727 } |
| 728 | 728 |
| 729 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 729 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( |
| 730 Zone zone, /*=R*/ f(/*=T*/ arg)) { | 730 Zone zone, R f(T arg)) { |
| 731 var implementation = _delegationTarget._registerUnaryCallback; | 731 var implementation = _delegationTarget._registerUnaryCallback; |
| 732 _Zone implZone = implementation.zone; | 732 _Zone implZone = implementation.zone; |
| 733 RegisterUnaryCallbackHandler handler = implementation.function; | 733 RegisterUnaryCallbackHandler handler = implementation.function; |
| 734 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 734 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
| 735 // supported. Remove the unnecessary cast. | 735 // supported. Remove the unnecessary cast. |
| 736 return handler(implZone, _parentDelegate(implZone), zone, f) | 736 return handler(implZone, _parentDelegate(implZone), zone, f) |
| 737 as Object/*=ZoneUnaryCallback<R, T>*/; | 737 as Object/*=ZoneUnaryCallback<R, T>*/; |
| 738 } | 738 } |
| 739 | 739 |
| 740 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 740 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( |
| 741 Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { | 741 Zone zone, R f(T1 arg1, T2 arg2)) { |
| 742 var implementation = _delegationTarget._registerBinaryCallback; | 742 var implementation = _delegationTarget._registerBinaryCallback; |
| 743 _Zone implZone = implementation.zone; | 743 _Zone implZone = implementation.zone; |
| 744 RegisterBinaryCallbackHandler handler = implementation.function; | 744 RegisterBinaryCallbackHandler handler = implementation.function; |
| 745 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 745 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
| 746 // it's supported. Remove the unnecessary cast. | 746 // it's supported. Remove the unnecessary cast. |
| 747 return handler(implZone, _parentDelegate(implZone), zone, f) | 747 return handler(implZone, _parentDelegate(implZone), zone, f) |
| 748 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; | 748 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
| 749 } | 749 } |
| 750 | 750 |
| 751 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { | 751 AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 912 } | 912 } |
| 913 | 913 |
| 914 /** | 914 /** |
| 915 * The closest error-handling zone. | 915 * The closest error-handling zone. |
| 916 * | 916 * |
| 917 * Returns `this` if `this` has an error-handler. Otherwise returns the | 917 * Returns `this` if `this` has an error-handler. Otherwise returns the |
| 918 * parent's error-zone. | 918 * parent's error-zone. |
| 919 */ | 919 */ |
| 920 Zone get errorZone => _handleUncaughtError.zone; | 920 Zone get errorZone => _handleUncaughtError.zone; |
| 921 | 921 |
| 922 /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) { | 922 R runGuarded<R>(R f()) { |
| 923 try { | 923 try { |
| 924 return run(f); | 924 return run(f); |
| 925 } catch (e, s) { | 925 } catch (e, s) { |
| 926 return handleUncaughtError(e, s); | 926 return handleUncaughtError(e, s); |
| 927 } | 927 } |
| 928 } | 928 } |
| 929 | 929 |
| 930 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 930 R runUnaryGuarded<R, T>(R f(T arg), T arg) { |
| 931 try { | 931 try { |
| 932 return runUnary(f, arg); | 932 return runUnary(f, arg); |
| 933 } catch (e, s) { | 933 } catch (e, s) { |
| 934 return handleUncaughtError(e, s); | 934 return handleUncaughtError(e, s); |
| 935 } | 935 } |
| 936 } | 936 } |
| 937 | 937 |
| 938 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( | 938 R runBinaryGuarded<R, T1, T2>( |
| 939 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 939 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 940 try { | 940 try { |
| 941 return runBinary(f, arg1, arg2); | 941 return runBinary(f, arg1, arg2); |
| 942 } catch (e, s) { | 942 } catch (e, s) { |
| 943 return handleUncaughtError(e, s); | 943 return handleUncaughtError(e, s); |
| 944 } | 944 } |
| 945 } | 945 } |
| 946 | 946 |
| 947 ZoneCallback/*<R>*/ bindCallback/*<R>*/( | 947 ZoneCallback<R> bindCallback<R>( |
| 948 /*=R*/ f(), { bool runGuarded: true }) { | 948 R f(), { bool runGuarded: true }) { |
| 949 var registered = registerCallback(f); | 949 var registered = registerCallback(f); |
| 950 if (runGuarded) { | 950 if (runGuarded) { |
| 951 return () => this.runGuarded(registered); | 951 return () => this.runGuarded(registered); |
| 952 } else { | 952 } else { |
| 953 return () => this.run(registered); | 953 return () => this.run(registered); |
| 954 } | 954 } |
| 955 } | 955 } |
| 956 | 956 |
| 957 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( | 957 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( |
| 958 /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) { | 958 R f(T arg), { bool runGuarded: true }) { |
| 959 var registered = registerUnaryCallback(f); | 959 var registered = registerUnaryCallback(f); |
| 960 if (runGuarded) { | 960 if (runGuarded) { |
| 961 return (arg) => this.runUnaryGuarded(registered, arg); | 961 return (arg) => this.runUnaryGuarded(registered, arg); |
| 962 } else { | 962 } else { |
| 963 return (arg) => this.runUnary(registered, arg); | 963 return (arg) => this.runUnary(registered, arg); |
| 964 } | 964 } |
| 965 } | 965 } |
| 966 | 966 |
| 967 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( | 967 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( |
| 968 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) { | 968 R f(T1 arg1, T2 arg2), { bool runGuarded: true }) { |
| 969 var registered = registerBinaryCallback(f); | 969 var registered = registerBinaryCallback(f); |
| 970 if (runGuarded) { | 970 if (runGuarded) { |
| 971 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2); | 971 return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2); |
| 972 } else { | 972 } else { |
| 973 return (arg1, arg2) => this.runBinary(registered, arg1, arg2); | 973 return (arg1, arg2) => this.runBinary(registered, arg1, arg2); |
| 974 } | 974 } |
| 975 } | 975 } |
| 976 | 976 |
| 977 operator [](Object key) { | 977 operator [](Object key) { |
| 978 var result = _map[key]; | 978 var result = _map[key]; |
| 979 if (result != null || _map.containsKey(key)) return result; | 979 if (result != null || _map.containsKey(key)) return result; |
| 980 // If we are not the root zone, look up in the parent zone. | 980 // If we are not the root zone, look up in the parent zone. |
| 981 if (parent != null) { | 981 if (parent != null) { |
| 982 // We do not optimize for repeatedly looking up a key which isn't | 982 // We do not optimize for repeatedly looking up a key which isn't |
| 983 // there. That would require storing the key and keeping it alive. | 983 // there. That would require storing the key and keeping it alive. |
| 984 // Copying the key/value from the parent does not keep any new values | 984 // Copying the key/value from the parent does not keep any new values |
| 985 // alive. | 985 // alive. |
| 986 var value = parent[key]; | 986 var value = parent[key]; |
| 987 if (value != null) { | 987 if (value != null) { |
| 988 _map[key] = value; | 988 _map[key] = value; |
| 989 } | 989 } |
| 990 return value; | 990 return value; |
| 991 } | 991 } |
| 992 assert(this == _ROOT_ZONE); | 992 assert(this == _ROOT_ZONE); |
| 993 return null; | 993 return null; |
| 994 } | 994 } |
| 995 | 995 |
| 996 // Methods that can be customized by the zone specification. | 996 // Methods that can be customized by the zone specification. |
| 997 | 997 |
| 998 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) { | 998 R handleUncaughtError<R>(error, StackTrace stackTrace) { |
| 999 var implementation = this._handleUncaughtError; | 999 var implementation = this._handleUncaughtError; |
| 1000 assert(implementation != null); | 1000 assert(implementation != null); |
| 1001 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1001 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1002 HandleUncaughtErrorHandler handler = implementation.function; | 1002 HandleUncaughtErrorHandler handler = implementation.function; |
| 1003 // TODO(floitsch): make this a generic method call on '<R>' once it's | 1003 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 1004 // supported. Remove the unnecessary cast. | 1004 // supported. Remove the unnecessary cast. |
| 1005 return handler( | 1005 return handler( |
| 1006 implementation.zone, parentDelegate, this, error, stackTrace) | 1006 implementation.zone, parentDelegate, this, error, stackTrace) |
| 1007 as Object/*=R*/; | 1007 as Object/*=R*/; |
| 1008 } | 1008 } |
| 1009 | 1009 |
| 1010 Zone fork({ZoneSpecification specification, Map zoneValues}) { | 1010 Zone fork({ZoneSpecification specification, Map zoneValues}) { |
| 1011 var implementation = this._fork; | 1011 var implementation = this._fork; |
| 1012 assert(implementation != null); | 1012 assert(implementation != null); |
| 1013 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1013 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1014 ForkHandler handler = implementation.function; | 1014 ForkHandler handler = implementation.function; |
| 1015 return handler(implementation.zone, parentDelegate, this, | 1015 return handler(implementation.zone, parentDelegate, this, |
| 1016 specification, zoneValues); | 1016 specification, zoneValues); |
| 1017 } | 1017 } |
| 1018 | 1018 |
| 1019 /*=R*/ run/*<R>*/(/*=R*/ f()) { | 1019 R run<R>(R f()) { |
| 1020 var implementation = this._run; | 1020 var implementation = this._run; |
| 1021 assert(implementation != null); | 1021 assert(implementation != null); |
| 1022 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1022 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1023 RunHandler handler = implementation.function; | 1023 RunHandler handler = implementation.function; |
| 1024 // TODO(floitsch): make this a generic method call on '<R>' once it's | 1024 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 1025 // supported. Remove the unnecessary cast. | 1025 // supported. Remove the unnecessary cast. |
| 1026 return handler(implementation.zone, parentDelegate, this, f) | 1026 return handler(implementation.zone, parentDelegate, this, f) |
| 1027 as Object/*=R*/; | 1027 as Object/*=R*/; |
| 1028 } | 1028 } |
| 1029 | 1029 |
| 1030 /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 1030 R runUnary<R, T>(R f(T arg), T arg) { |
| 1031 var implementation = this._runUnary; | 1031 var implementation = this._runUnary; |
| 1032 assert(implementation != null); | 1032 assert(implementation != null); |
| 1033 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1033 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1034 RunUnaryHandler handler = implementation.function; | 1034 RunUnaryHandler handler = implementation.function; |
| 1035 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 1035 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
| 1036 // supported. Remove the unnecessary cast. | 1036 // supported. Remove the unnecessary cast. |
| 1037 return handler(implementation.zone, parentDelegate, this, f, arg) | 1037 return handler(implementation.zone, parentDelegate, this, f, arg) |
| 1038 as Object/*=R*/; | 1038 as Object/*=R*/; |
| 1039 } | 1039 } |
| 1040 | 1040 |
| 1041 /*=R*/ runBinary/*<R, T1, T2>*/( | 1041 R runBinary<R, T1, T2>( |
| 1042 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 1042 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 1043 var implementation = this._runBinary; | 1043 var implementation = this._runBinary; |
| 1044 assert(implementation != null); | 1044 assert(implementation != null); |
| 1045 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1045 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1046 RunBinaryHandler handler = implementation.function; | 1046 RunBinaryHandler handler = implementation.function; |
| 1047 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 1047 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
| 1048 // it's supported. Remove the unnecessary cast. | 1048 // it's supported. Remove the unnecessary cast. |
| 1049 return handler( | 1049 return handler( |
| 1050 implementation.zone, parentDelegate, this, f, arg1, arg2) | 1050 implementation.zone, parentDelegate, this, f, arg1, arg2) |
| 1051 as Object/*=R*/; | 1051 as Object/*=R*/; |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) { | 1054 ZoneCallback<R> registerCallback<R>(R callback()) { |
| 1055 var implementation = this._registerCallback; | 1055 var implementation = this._registerCallback; |
| 1056 assert(implementation != null); | 1056 assert(implementation != null); |
| 1057 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1057 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1058 RegisterCallbackHandler handler = implementation.function; | 1058 RegisterCallbackHandler handler = implementation.function; |
| 1059 // TODO(floitsch): make this a generic method call on '<R>' once it's | 1059 // TODO(floitsch): make this a generic method call on '<R>' once it's |
| 1060 // supported. Remove the unnecessary cast. | 1060 // supported. Remove the unnecessary cast. |
| 1061 return handler(implementation.zone, parentDelegate, this, callback) | 1061 return handler(implementation.zone, parentDelegate, this, callback) |
| 1062 as Object/*=ZoneCallback<R>*/; | 1062 as Object/*=ZoneCallback<R>*/; |
| 1063 } | 1063 } |
| 1064 | 1064 |
| 1065 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 1065 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( |
| 1066 /*=R*/ callback(/*=T*/ arg)) { | 1066 R callback(T arg)) { |
| 1067 var implementation = this._registerUnaryCallback; | 1067 var implementation = this._registerUnaryCallback; |
| 1068 assert(implementation != null); | 1068 assert(implementation != null); |
| 1069 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1069 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1070 RegisterUnaryCallbackHandler handler = implementation.function; | 1070 RegisterUnaryCallbackHandler handler = implementation.function; |
| 1071 // TODO(floitsch): make this a generic method call on '<R, T>' once it's | 1071 // TODO(floitsch): make this a generic method call on '<R, T>' once it's |
| 1072 // supported. Remove the unnecessary cast. | 1072 // supported. Remove the unnecessary cast. |
| 1073 return handler(implementation.zone, parentDelegate, this, callback) | 1073 return handler(implementation.zone, parentDelegate, this, callback) |
| 1074 as Object/*=ZoneUnaryCallback<R, T>*/; | 1074 as Object/*=ZoneUnaryCallback<R, T>*/; |
| 1075 } | 1075 } |
| 1076 | 1076 |
| 1077 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 1077 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( |
| 1078 /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) { | 1078 R callback(T1 arg1, T2 arg2)) { |
| 1079 var implementation = this._registerBinaryCallback; | 1079 var implementation = this._registerBinaryCallback; |
| 1080 assert(implementation != null); | 1080 assert(implementation != null); |
| 1081 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1081 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1082 RegisterBinaryCallbackHandler handler = implementation.function; | 1082 RegisterBinaryCallbackHandler handler = implementation.function; |
| 1083 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once | 1083 // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once |
| 1084 // it's supported. Remove the unnecessary cast. | 1084 // it's supported. Remove the unnecessary cast. |
| 1085 return handler(implementation.zone, parentDelegate, this, callback) | 1085 return handler(implementation.zone, parentDelegate, this, callback) |
| 1086 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; | 1086 as Object/*=ZoneBinaryCallback<R, T1, T2>*/; |
| 1087 } | 1087 } |
| 1088 | 1088 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1124 | 1124 |
| 1125 void print(String line) { | 1125 void print(String line) { |
| 1126 var implementation = this._print; | 1126 var implementation = this._print; |
| 1127 assert(implementation != null); | 1127 assert(implementation != null); |
| 1128 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); | 1128 ZoneDelegate parentDelegate = _parentDelegate(implementation.zone); |
| 1129 PrintHandler handler = implementation.function; | 1129 PrintHandler handler = implementation.function; |
| 1130 return handler(implementation.zone, parentDelegate, this, line); | 1130 return handler(implementation.zone, parentDelegate, this, line); |
| 1131 } | 1131 } |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 /*=R*/ _rootHandleUncaughtError/*<R>*/( | 1134 R _rootHandleUncaughtError<R>( |
| 1135 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { | 1135 Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) { |
| 1136 _schedulePriorityAsyncCallback(() { | 1136 _schedulePriorityAsyncCallback(() { |
| 1137 if (error == null) error = new NullThrownError(); | 1137 if (error == null) error = new NullThrownError(); |
| 1138 if (stackTrace == null) throw error; | 1138 if (stackTrace == null) throw error; |
| 1139 _rethrow(error, stackTrace); | 1139 _rethrow(error, stackTrace); |
| 1140 }); | 1140 }); |
| 1141 } | 1141 } |
| 1142 | 1142 |
| 1143 external void _rethrow(Object error, StackTrace stackTrace); | 1143 external void _rethrow(Object error, StackTrace stackTrace); |
| 1144 | 1144 |
| 1145 /*=R*/ _rootRun/*<R>*/(Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) { | 1145 R _rootRun<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) { |
| 1146 if (Zone._current == zone) return f(); | 1146 if (Zone._current == zone) return f(); |
| 1147 | 1147 |
| 1148 Zone old = Zone._enter(zone); | 1148 Zone old = Zone._enter(zone); |
| 1149 try { | 1149 try { |
| 1150 return f(); | 1150 return f(); |
| 1151 } finally { | 1151 } finally { |
| 1152 Zone._leave(old); | 1152 Zone._leave(old); |
| 1153 } | 1153 } |
| 1154 } | 1154 } |
| 1155 | 1155 |
| 1156 /*=R*/ _rootRunUnary/*<R, T>*/(Zone self, ZoneDelegate parent, Zone zone, | 1156 R _rootRunUnary<R, T>(Zone self, ZoneDelegate parent, Zone zone, |
| 1157 /*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 1157 R f(T arg), T arg) { |
| 1158 if (Zone._current == zone) return f(arg); | 1158 if (Zone._current == zone) return f(arg); |
| 1159 | 1159 |
| 1160 Zone old = Zone._enter(zone); | 1160 Zone old = Zone._enter(zone); |
| 1161 try { | 1161 try { |
| 1162 return f(arg); | 1162 return f(arg); |
| 1163 } finally { | 1163 } finally { |
| 1164 Zone._leave(old); | 1164 Zone._leave(old); |
| 1165 } | 1165 } |
| 1166 } | 1166 } |
| 1167 | 1167 |
| 1168 /*=R*/ _rootRunBinary/*<R, T1, T2>*/(Zone self, ZoneDelegate parent, Zone zone, | 1168 R _rootRunBinary<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone, |
| 1169 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 1169 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 1170 if (Zone._current == zone) return f(arg1, arg2); | 1170 if (Zone._current == zone) return f(arg1, arg2); |
| 1171 | 1171 |
| 1172 Zone old = Zone._enter(zone); | 1172 Zone old = Zone._enter(zone); |
| 1173 try { | 1173 try { |
| 1174 return f(arg1, arg2); | 1174 return f(arg1, arg2); |
| 1175 } finally { | 1175 } finally { |
| 1176 Zone._leave(old); | 1176 Zone._leave(old); |
| 1177 } | 1177 } |
| 1178 } | 1178 } |
| 1179 | 1179 |
| 1180 ZoneCallback/*<R>*/ _rootRegisterCallback/*<R>*/( | 1180 ZoneCallback<R> _rootRegisterCallback<R>( |
| 1181 Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) { | 1181 Zone self, ZoneDelegate parent, Zone zone, R f()) { |
| 1182 return f; | 1182 return f; |
| 1183 } | 1183 } |
| 1184 | 1184 |
| 1185 ZoneUnaryCallback/*<R, T>*/ _rootRegisterUnaryCallback/*<R, T>*/( | 1185 ZoneUnaryCallback<R, T> _rootRegisterUnaryCallback<R, T>( |
| 1186 Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f(/*=T*/ arg)) { | 1186 Zone self, ZoneDelegate parent, Zone zone, R f(T arg)) { |
| 1187 return f; | 1187 return f; |
| 1188 } | 1188 } |
| 1189 | 1189 |
| 1190 ZoneBinaryCallback/*<R, T1, T2>*/ _rootRegisterBinaryCallback/*<R, T1, T2>*/( | 1190 ZoneBinaryCallback<R, T1, T2> _rootRegisterBinaryCallback<R, T1, T2>( |
| 1191 Zone self, ZoneDelegate parent, Zone zone, | 1191 Zone self, ZoneDelegate parent, Zone zone, |
| 1192 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) { | 1192 R f(T1 arg1, T2 arg2)) { |
| 1193 return f; | 1193 return f; |
| 1194 } | 1194 } |
| 1195 | 1195 |
| 1196 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone, | 1196 AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone, |
| 1197 Object error, StackTrace stackTrace) => null; | 1197 Object error, StackTrace stackTrace) => null; |
| 1198 | 1198 |
| 1199 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { | 1199 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) { |
| 1200 if (!identical(_ROOT_ZONE, zone)) { | 1200 if (!identical(_ROOT_ZONE, zone)) { |
| 1201 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); | 1201 bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone); |
| 1202 f = zone.bindCallback(f, runGuarded: hasErrorHandler); | 1202 f = zone.bindCallback(f, runGuarded: hasErrorHandler); |
| 1203 // Use root zone as event zone if the function is already bound. | 1203 // Use root zone as event zone if the function is already bound. |
| 1204 zone = _ROOT_ZONE; | 1204 zone = _ROOT_ZONE; |
| 1205 } | 1205 } |
| 1206 _scheduleAsyncCallback(f); | 1206 _scheduleAsyncCallback(f); |
| 1207 } | 1207 } |
| 1208 | 1208 |
| 1209 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, | 1209 Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone, |
| 1210 Duration duration, void callback()) { | 1210 Duration duration, void callback()) { |
| 1211 if (!identical(_ROOT_ZONE, zone)) { | 1211 if (!identical(_ROOT_ZONE, zone)) { |
| 1212 callback = zone.bindCallback(callback); | 1212 callback = zone.bindCallback(callback); |
| 1213 } | 1213 } |
| 1214 return Timer._createTimer(duration, callback); | 1214 return Timer._createTimer(duration, callback); |
| 1215 } | 1215 } |
| 1216 | 1216 |
| 1217 Timer _rootCreatePeriodicTimer( | 1217 Timer _rootCreatePeriodicTimer( |
| 1218 Zone self, ZoneDelegate parent, Zone zone, | 1218 Zone self, ZoneDelegate parent, Zone zone, |
| 1219 Duration duration, void callback(Timer timer)) { | 1219 Duration duration, void callback(Timer timer)) { |
| 1220 if (!identical(_ROOT_ZONE, zone)) { | 1220 if (!identical(_ROOT_ZONE, zone)) { |
| 1221 // TODO(floitsch): the return type should be 'void'. | 1221 // TODO(floitsch): the return type should be 'void'. |
| 1222 callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback); | 1222 callback = zone.bindUnaryCallback<dynamic, Timer>(callback); |
| 1223 } | 1223 } |
| 1224 return Timer._createPeriodicTimer(duration, callback); | 1224 return Timer._createPeriodicTimer(duration, callback); |
| 1225 } | 1225 } |
| 1226 | 1226 |
| 1227 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { | 1227 void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) { |
| 1228 printToConsole(line); | 1228 printToConsole(line); |
| 1229 } | 1229 } |
| 1230 | 1230 |
| 1231 void _printToZone(String line) { | 1231 void _printToZone(String line) { |
| 1232 Zone.current.print(line); | 1232 Zone.current.print(line); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 /** | 1314 /** |
| 1315 * The closest error-handling zone. | 1315 * The closest error-handling zone. |
| 1316 * | 1316 * |
| 1317 * Returns `this` if `this` has an error-handler. Otherwise returns the | 1317 * Returns `this` if `this` has an error-handler. Otherwise returns the |
| 1318 * parent's error-zone. | 1318 * parent's error-zone. |
| 1319 */ | 1319 */ |
| 1320 Zone get errorZone => this; | 1320 Zone get errorZone => this; |
| 1321 | 1321 |
| 1322 // Zone interface. | 1322 // Zone interface. |
| 1323 | 1323 |
| 1324 /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) { | 1324 R runGuarded<R>(R f()) { |
| 1325 try { | 1325 try { |
| 1326 if (identical(_ROOT_ZONE, Zone._current)) { | 1326 if (identical(_ROOT_ZONE, Zone._current)) { |
| 1327 return f(); | 1327 return f(); |
| 1328 } | 1328 } |
| 1329 return _rootRun/*<R>*/(null, null, this, f); | 1329 return _rootRun<R>(null, null, this, f); |
| 1330 } catch (e, s) { | 1330 } catch (e, s) { |
| 1331 return handleUncaughtError/*<R>*/(e, s); | 1331 return handleUncaughtError<R>(e, s); |
| 1332 } | 1332 } |
| 1333 } | 1333 } |
| 1334 | 1334 |
| 1335 /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 1335 R runUnaryGuarded<R, T>(R f(T arg), T arg) { |
| 1336 try { | 1336 try { |
| 1337 if (identical(_ROOT_ZONE, Zone._current)) { | 1337 if (identical(_ROOT_ZONE, Zone._current)) { |
| 1338 return f(arg); | 1338 return f(arg); |
| 1339 } | 1339 } |
| 1340 return _rootRunUnary/*<R, T>*/(null, null, this, f, arg); | 1340 return _rootRunUnary<R, T>(null, null, this, f, arg); |
| 1341 } catch (e, s) { | 1341 } catch (e, s) { |
| 1342 return handleUncaughtError/*<R>*/(e, s); | 1342 return handleUncaughtError<R>(e, s); |
| 1343 } | 1343 } |
| 1344 } | 1344 } |
| 1345 | 1345 |
| 1346 /*=R*/ runBinaryGuarded/*<R, T1, T2>*/( | 1346 R runBinaryGuarded<R, T1, T2>( |
| 1347 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 1347 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 1348 try { | 1348 try { |
| 1349 if (identical(_ROOT_ZONE, Zone._current)) { | 1349 if (identical(_ROOT_ZONE, Zone._current)) { |
| 1350 return f(arg1, arg2); | 1350 return f(arg1, arg2); |
| 1351 } | 1351 } |
| 1352 return _rootRunBinary/*<R, T1, T2>*/(null, null, this, f, arg1, arg2); | 1352 return _rootRunBinary<R, T1, T2>(null, null, this, f, arg1, arg2); |
| 1353 } catch (e, s) { | 1353 } catch (e, s) { |
| 1354 return handleUncaughtError/*<R>*/(e, s); | 1354 return handleUncaughtError<R>(e, s); |
| 1355 } | 1355 } |
| 1356 } | 1356 } |
| 1357 | 1357 |
| 1358 ZoneCallback/*<R>*/ bindCallback/*<R>*/( | 1358 ZoneCallback<R> bindCallback<R>( |
| 1359 /*=R*/ f(), { bool runGuarded: true }) { | 1359 R f(), { bool runGuarded: true }) { |
| 1360 if (runGuarded) { | 1360 if (runGuarded) { |
| 1361 return () => this.runGuarded/*<R>*/(f); | 1361 return () => this.runGuarded<R>(f); |
| 1362 } else { | 1362 } else { |
| 1363 return () => this.run/*<R>*/(f); | 1363 return () => this.run<R>(f); |
| 1364 } | 1364 } |
| 1365 } | 1365 } |
| 1366 | 1366 |
| 1367 ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/( | 1367 ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>( |
| 1368 /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) { | 1368 R f(T arg), { bool runGuarded: true }) { |
| 1369 if (runGuarded) { | 1369 if (runGuarded) { |
| 1370 return (arg) => this.runUnaryGuarded/*<R, T>*/(f, arg); | 1370 return (arg) => this.runUnaryGuarded<R, T>(f, arg); |
| 1371 } else { | 1371 } else { |
| 1372 return (arg) => this.runUnary/*<R, T>*/(f, arg); | 1372 return (arg) => this.runUnary<R, T>(f, arg); |
| 1373 } | 1373 } |
| 1374 } | 1374 } |
| 1375 | 1375 |
| 1376 ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/( | 1376 ZoneBinaryCallback<R, T1, T2> bindBinaryCallback<R, T1, T2>( |
| 1377 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) { | 1377 R f(T1 arg1, T2 arg2), { bool runGuarded: true }) { |
| 1378 if (runGuarded) { | 1378 if (runGuarded) { |
| 1379 return (arg1, arg2) => | 1379 return (arg1, arg2) => |
| 1380 this.runBinaryGuarded/*<R, T1, T2>*/(f, arg1, arg2); | 1380 this.runBinaryGuarded<R, T1, T2>(f, arg1, arg2); |
| 1381 } else { | 1381 } else { |
| 1382 return (arg1, arg2) => this.runBinary/*<R, T1, T2>*/(f, arg1, arg2); | 1382 return (arg1, arg2) => this.runBinary<R, T1, T2>(f, arg1, arg2); |
| 1383 } | 1383 } |
| 1384 } | 1384 } |
| 1385 | 1385 |
| 1386 operator [](Object key) => null; | 1386 operator [](Object key) => null; |
| 1387 | 1387 |
| 1388 // Methods that can be customized by the zone specification. | 1388 // Methods that can be customized by the zone specification. |
| 1389 | 1389 |
| 1390 /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) { | 1390 R handleUncaughtError<R>(error, StackTrace stackTrace) { |
| 1391 return _rootHandleUncaughtError(null, null, this, error, stackTrace); | 1391 return _rootHandleUncaughtError(null, null, this, error, stackTrace); |
| 1392 } | 1392 } |
| 1393 | 1393 |
| 1394 Zone fork({ZoneSpecification specification, Map zoneValues}) { | 1394 Zone fork({ZoneSpecification specification, Map zoneValues}) { |
| 1395 return _rootFork(null, null, this, specification, zoneValues); | 1395 return _rootFork(null, null, this, specification, zoneValues); |
| 1396 } | 1396 } |
| 1397 | 1397 |
| 1398 /*=R*/ run/*<R>*/(/*=R*/ f()) { | 1398 R run<R>(R f()) { |
| 1399 if (identical(Zone._current, _ROOT_ZONE)) return f(); | 1399 if (identical(Zone._current, _ROOT_ZONE)) return f(); |
| 1400 return _rootRun(null, null, this, f); | 1400 return _rootRun(null, null, this, f); |
| 1401 } | 1401 } |
| 1402 | 1402 |
| 1403 /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) { | 1403 R runUnary<R, T>(R f(T arg), T arg) { |
| 1404 if (identical(Zone._current, _ROOT_ZONE)) return f(arg); | 1404 if (identical(Zone._current, _ROOT_ZONE)) return f(arg); |
| 1405 return _rootRunUnary(null, null, this, f, arg); | 1405 return _rootRunUnary(null, null, this, f, arg); |
| 1406 } | 1406 } |
| 1407 | 1407 |
| 1408 /*=R*/ runBinary/*<R, T1, T2>*/( | 1408 R runBinary<R, T1, T2>( |
| 1409 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) { | 1409 R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) { |
| 1410 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2); | 1410 if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2); |
| 1411 return _rootRunBinary(null, null, this, f, arg1, arg2); | 1411 return _rootRunBinary(null, null, this, f, arg1, arg2); |
| 1412 } | 1412 } |
| 1413 | 1413 |
| 1414 ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ f()) => f; | 1414 ZoneCallback<R> registerCallback<R>(R f()) => f; |
| 1415 | 1415 |
| 1416 ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/( | 1416 ZoneUnaryCallback<R, T> registerUnaryCallback<R, T>( |
| 1417 /*=R*/ f(/*=T*/ arg)) => f; | 1417 R f(T arg)) => f; |
| 1418 | 1418 |
| 1419 ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/( | 1419 ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>( |
| 1420 /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f; | 1420 R f(T1 arg1, T2 arg2)) => f; |
| 1421 | 1421 |
| 1422 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; | 1422 AsyncError errorCallback(Object error, StackTrace stackTrace) => null; |
| 1423 | 1423 |
| 1424 void scheduleMicrotask(void f()) { | 1424 void scheduleMicrotask(void f()) { |
| 1425 _rootScheduleMicrotask(null, null, this, f); | 1425 _rootScheduleMicrotask(null, null, this, f); |
| 1426 } | 1426 } |
| 1427 | 1427 |
| 1428 Timer createTimer(Duration duration, void f()) { | 1428 Timer createTimer(Duration duration, void f()) { |
| 1429 return Timer._createTimer(duration, f); | 1429 return Timer._createTimer(duration, f); |
| 1430 } | 1430 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1458 * future = future.catchError((e) { print("Never reached!"); }); | 1458 * future = future.catchError((e) { print("Never reached!"); }); |
| 1459 * }, onError: (e) { print("unused error handler"); }); | 1459 * }, onError: (e) { print("unused error handler"); }); |
| 1460 * }, onError: (e) { print("catches error of first error-zone."); }); | 1460 * }, onError: (e) { print("catches error of first error-zone."); }); |
| 1461 * | 1461 * |
| 1462 * Example: | 1462 * Example: |
| 1463 * | 1463 * |
| 1464 * runZoned(() { | 1464 * runZoned(() { |
| 1465 * new Future(() { throw "asynchronous error"; }); | 1465 * new Future(() { throw "asynchronous error"; }); |
| 1466 * }, onError: print); // Will print "asynchronous error". | 1466 * }, onError: print); // Will print "asynchronous error". |
| 1467 */ | 1467 */ |
| 1468 /*=R*/ runZoned/*<R>*/(/*=R*/ body(), | 1468 R runZoned<R>(R body(), |
| 1469 { Map zoneValues, | 1469 { Map zoneValues, |
| 1470 ZoneSpecification zoneSpecification, | 1470 ZoneSpecification zoneSpecification, |
| 1471 Function onError }) { | 1471 Function onError }) { |
| 1472 HandleUncaughtErrorHandler errorHandler; | 1472 HandleUncaughtErrorHandler errorHandler; |
| 1473 if (onError != null) { | 1473 if (onError != null) { |
| 1474 errorHandler = (Zone self, ZoneDelegate parent, Zone zone, | 1474 errorHandler = (Zone self, ZoneDelegate parent, Zone zone, |
| 1475 error, StackTrace stackTrace) { | 1475 error, StackTrace stackTrace) { |
| 1476 try { | 1476 try { |
| 1477 if (onError is ZoneBinaryCallback<dynamic/*=R*/, dynamic, StackTrace>) { | 1477 if (onError is ZoneBinaryCallback<R, dynamic, StackTrace>) { |
| 1478 return self.parent.runBinary(onError, error, stackTrace); | 1478 return self.parent.runBinary(onError, error, stackTrace); |
| 1479 } | 1479 } |
| 1480 return self.parent.runUnary(onError, error); | 1480 return self.parent.runUnary(onError, error); |
| 1481 } catch(e, s) { | 1481 } catch(e, s) { |
| 1482 if (identical(e, error)) { | 1482 if (identical(e, error)) { |
| 1483 return parent.handleUncaughtError(zone, error, stackTrace); | 1483 return parent.handleUncaughtError(zone, error, stackTrace); |
| 1484 } else { | 1484 } else { |
| 1485 return parent.handleUncaughtError(zone, e, s); | 1485 return parent.handleUncaughtError(zone, e, s); |
| 1486 } | 1486 } |
| 1487 } | 1487 } |
| 1488 }; | 1488 }; |
| 1489 } | 1489 } |
| 1490 if (zoneSpecification == null) { | 1490 if (zoneSpecification == null) { |
| 1491 zoneSpecification = | 1491 zoneSpecification = |
| 1492 new ZoneSpecification(handleUncaughtError: errorHandler); | 1492 new ZoneSpecification(handleUncaughtError: errorHandler); |
| 1493 } else if (errorHandler != null) { | 1493 } else if (errorHandler != null) { |
| 1494 zoneSpecification = | 1494 zoneSpecification = |
| 1495 new ZoneSpecification.from(zoneSpecification, | 1495 new ZoneSpecification.from(zoneSpecification, |
| 1496 handleUncaughtError: errorHandler); | 1496 handleUncaughtError: errorHandler); |
| 1497 } | 1497 } |
| 1498 Zone zone = Zone.current.fork(specification: zoneSpecification, | 1498 Zone zone = Zone.current.fork(specification: zoneSpecification, |
| 1499 zoneValues: zoneValues); | 1499 zoneValues: zoneValues); |
| 1500 if (onError != null) { | 1500 if (onError != null) { |
| 1501 return zone.runGuarded(body); | 1501 return zone.runGuarded(body); |
| 1502 } else { | 1502 } else { |
| 1503 return zone.run(body); | 1503 return zone.run(body); |
| 1504 } | 1504 } |
| 1505 } | 1505 } |
| OLD | NEW |