| Index: pkg/stack_trace/lib/src/stack_zone_specification.dart
|
| diff --git a/pkg/stack_trace/lib/src/stack_zone_specification.dart b/pkg/stack_trace/lib/src/stack_zone_specification.dart
|
| index 9a4f7c05af10f18893f1d9f0b0acb8b55fd0318b..292da65286c4cde06397c07edcb6f5e143afcce5 100644
|
| --- a/pkg/stack_trace/lib/src/stack_zone_specification.dart
|
| +++ b/pkg/stack_trace/lib/src/stack_zone_specification.dart
|
| @@ -56,7 +56,8 @@ class StackZoneSpecification {
|
| handleUncaughtError: handleUncaughtError,
|
| registerCallback: registerCallback,
|
| registerUnaryCallback: registerUnaryCallback,
|
| - registerBinaryCallback: registerBinaryCallback);
|
| + registerBinaryCallback: registerBinaryCallback,
|
| + errorCallback: errorCallback);
|
| }
|
|
|
| /// Returns the current stack chain.
|
| @@ -88,7 +89,9 @@ class StackZoneSpecification {
|
| var node = _createNode(level + 1);
|
| future.then(completer.complete).catchError((e, stackTrace) {
|
| if (stackTrace == null) stackTrace = new Trace.current();
|
| - if (_chains[stackTrace] == null) _chains[stackTrace] = node;
|
| + if (stackTrace is! Chain && _chains[stackTrace] == null) {
|
| + _chains[stackTrace] = node;
|
| + }
|
| completer.completeError(e, stackTrace);
|
| });
|
| return completer.future;
|
| @@ -105,7 +108,9 @@ class StackZoneSpecification {
|
| return stream.transform(new StreamTransformer.fromHandlers(
|
| handleError: (error, stackTrace, sink) {
|
| if (stackTrace == null) stackTrace = new Trace.current();
|
| - if (_chains[stackTrace] == null) _chains[stackTrace] = node;
|
| + if (stackTrace is! Chain && _chains[stackTrace] == null) {
|
| + _chains[stackTrace] = node;
|
| + }
|
| sink.addError(error, stackTrace);
|
| }));
|
| }
|
| @@ -163,6 +168,26 @@ class StackZoneSpecification {
|
| }
|
| }
|
|
|
| + /// Attaches the current stack chain to [stackTrace], replacing it if
|
| + /// necessary.
|
| + AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
|
| + Object error, StackTrace stackTrace) {
|
| + var asyncError = parent.errorCallback(zone, error, stackTrace);
|
| + if (asyncError != null) {
|
| + error = asyncError.error;
|
| + stackTrace = asyncError.stackTrace;
|
| + }
|
| +
|
| + // Go up two levels to get through [_CustomZone.errorCallback].
|
| + if (stackTrace == null) {
|
| + stackTrace = _createNode(2).toChain();
|
| + } else {
|
| + if (_chains[stackTrace] == null) _chains[stackTrace] = _createNode(2);
|
| + }
|
| +
|
| + return new AsyncError(error, stackTrace);
|
| + }
|
| +
|
| /// Creates a [_Node] with the current stack trace and linked to
|
| /// [_currentNode].
|
| ///
|
|
|