| Index: sdk/lib/isolate/isolate.dart
|
| diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
|
| index 65f0bcee02574313998ee011a885107e84cb47c7..4a4a104d9c75842db406df2a9678e255ee36afba 100644
|
| --- a/sdk/lib/isolate/isolate.dart
|
| +++ b/sdk/lib/isolate/isolate.dart
|
| @@ -47,6 +47,7 @@ class Isolate {
|
| * Capability granting the ability to pause the isolate.
|
| */
|
| final Capability pauseCapability;
|
| +
|
| /**
|
| * Capability granting the ability to terminate the isolate.
|
| */
|
| @@ -298,6 +299,80 @@ class Isolate {
|
| ..[2] = pingType;
|
| controlPort.send(message);
|
| }
|
| +
|
| + /**
|
| + * Requests that uncaught errors of the isolate are sent back to [port].
|
| + *
|
| + * The errors are sent back as two elements lists.
|
| + * The first element is a `String` representation of the error, usually
|
| + * created by calling `toString` on the error.
|
| + * The second element is a `String` representation of an accompanying
|
| + * stack trace, or `null` if no stack trace was provided.
|
| + *
|
| + * Listening using the same port more than once does nothing. It will only
|
| + * get each error once.
|
| + */
|
| + void addErrorListener(SendPort port) {
|
| + var message = new List(2)
|
| + ..[0] = "getErrors"
|
| + ..[1] = port;
|
| + controlPort.send(message);
|
| + }
|
| +
|
| + /**
|
| + * Stop listening for uncaught errors through [port].
|
| + *
|
| + * The `port` should be a port that is listening for errors through
|
| + * [addErrorListener]. This call requests that the isolate stops sending
|
| + * errors on the port.
|
| + *
|
| + * If the same port has been passed via `addErrorListener` more than once,
|
| + * only one call to `removeErrorListener` is needed to stop it from receiving
|
| + * errors.
|
| + *
|
| + * Closing the receive port at the end of the send port will not stop the
|
| + * isolate from sending errors, they are just going to be lost.
|
| + */
|
| + void removeErrorListener(SendPort port) {
|
| + var message = new List(2)
|
| + ..[0] = "stopErrors"
|
| + ..[1] = port;
|
| + controlPort.send(message);
|
| + }
|
| +
|
| + /**
|
| + * Returns a broadcast stream of uncaught errors from the isolate.
|
| + *
|
| + * Each error is provided as an error event on the stream.
|
| + *
|
| + * The actual error object and stackTraces will not necessarily
|
| + * be the same object types as in the actual isolate, but they will
|
| + * always have the same [Object.toString] result.
|
| + *
|
| + * This stream is based on [addErrorListener] and [removeErrorListener].
|
| + */
|
| + Stream get errors {
|
| + StreamController controller;
|
| + RawReceivePort port;
|
| + void handleError(message) {
|
| + String errorDescription = message[0];
|
| + String stackDescription = message[1];
|
| + var error = new RemoteError(errorDescription, stackDescription);
|
| + controller.addError(error, error.stackTrace);
|
| + }
|
| + controller = new StreamController.broadcast(
|
| + sync: true,
|
| + onListen: () {
|
| + port = new RawReceivePort(handleError);
|
| + this.addErrorListener(port.sendPort);
|
| + },
|
| + onCancel: () {
|
| + this.removeErrorListener(port.sendPort);
|
| + port.close();
|
| + port = null;
|
| + });
|
| + return controller.stream;
|
| + }
|
| }
|
|
|
| /**
|
| @@ -464,3 +539,24 @@ class _IsolateUnhandledException implements Exception {
|
| '${stackTrace.toString().replaceAll("\n","\n ")}';
|
| }
|
| }
|
| +
|
| +/**
|
| + * Description of an error from another isolate.
|
| + *
|
| + * This error has the same `toString()` and `stackTrace.toString()` behavior
|
| + * as the original error, but has no other features of the original error.
|
| + */
|
| +class RemoteError implements Error {
|
| + final String _description;
|
| + final StackTrace stackTrace;
|
| + RemoteError(String description, String stackDescription)
|
| + : _description = description,
|
| + stackTrace = new _RemoteStackTrace(stackDescription);
|
| + String toString() => _description;
|
| +}
|
| +
|
| +class _RemoteStackTrace implements StackTrace {
|
| + String _trace;
|
| + _RemoteStackTrace(this._trace);
|
| + String toString() => _trace;
|
| +}
|
|
|