| Index: runtime/lib/isolate_patch.dart
|
| diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
|
| index a98bb5a052f6d855e324ea0d53d6c70f1d7e4efc..bb3737159a0c5c13f52dda777906b26862bd822e 100644
|
| --- a/runtime/lib/isolate_patch.dart
|
| +++ b/runtime/lib/isolate_patch.dart
|
| @@ -284,18 +284,7 @@ patch class Isolate {
|
| readyPort = new RawReceivePort();
|
| _spawnFunction(readyPort.sendPort, entryPoint, message,
|
| paused, errorsAreFatal, onExit, onError);
|
| - Completer completer = new Completer<Isolate>.sync();
|
| - readyPort.handler = (readyMessage) {
|
| - readyPort.close();
|
| - assert(readyMessage is List);
|
| - assert(readyMessage.length == 2);
|
| - SendPort controlPort = readyMessage[0];
|
| - List capabilities = readyMessage[1];
|
| - completer.complete(new Isolate(controlPort,
|
| - pauseCapability: capabilities[0],
|
| - terminateCapability: capabilities[1]));
|
| - };
|
| - return completer.future;
|
| + return _spawnCommon(readyPort);
|
| } catch (e, st) {
|
| if (readyPort != null) {
|
| readyPort.close();
|
| @@ -328,24 +317,36 @@ patch class Isolate {
|
| errorsAreFatal, checked,
|
| null, /* environment */
|
| packageRootString, packagesList);
|
| - Completer completer = new Completer<Isolate>.sync();
|
| - readyPort.handler = (readyMessage) {
|
| + return _spawnCommon(readyPort);
|
| + } catch (e, st) {
|
| + if (readyPort != null) {
|
| readyPort.close();
|
| - assert(readyMessage is List);
|
| - assert(readyMessage.length == 2);
|
| + }
|
| + return new Future<Isolate>.error(e, st);
|
| + }
|
| + }
|
| +
|
| + static Future<Isolate> _spawnCommon(RawReceivePort readyPort) {
|
| + Completer completer = new Completer<Isolate>.sync();
|
| + readyPort.handler = (readyMessage) {
|
| + readyPort.close();
|
| + if (readyMessage is List && readyMessage.length == 2) {
|
| SendPort controlPort = readyMessage[0];
|
| List capabilities = readyMessage[1];
|
| completer.complete(new Isolate(controlPort,
|
| pauseCapability: capabilities[0],
|
| terminateCapability: capabilities[1]));
|
| - };
|
| - return completer.future;
|
| - } catch (e, st) {
|
| - if (readyPort != null) {
|
| - readyPort.close();
|
| + } else if (readyMessage is String) {
|
| + // We encountered an error while starting the new isolate.
|
| + completer.completeError(new IsolateSpawnException(
|
| + 'Unable to spawn isolate: ${readyMessage}'));
|
| + } else {
|
| + // This shouldn't happen.
|
| + completer.completeError(new IsolateSpawnException(
|
| + "Internal error: unexpected format for ready message: "
|
| + "'${readyMessage}'"));
|
| }
|
| - return new Future<Isolate>.error(e, st);
|
| - }
|
| + };
|
| return completer.future;
|
| }
|
|
|
|
|