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; |
} |