| Index: runtime/lib/isolate_patch.dart
|
| diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
|
| index 4ae2741c835f2aa8a744aa18e2d27f127011e42c..96144fd2f3f0060ec68fe9d58d76b23d2412ffa6 100644
|
| --- a/runtime/lib/isolate_patch.dart
|
| +++ b/runtime/lib/isolate_patch.dart
|
| @@ -5,21 +5,26 @@
|
| import "dart:collection" show HashMap;
|
| import "dart:_internal" hide Symbol;
|
|
|
| -@patch class ReceivePort {
|
| - @patch factory ReceivePort() = _ReceivePortImpl;
|
| +@patch
|
| +class ReceivePort {
|
| + @patch
|
| + factory ReceivePort() = _ReceivePortImpl;
|
|
|
| - @patch factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) =
|
| + @patch
|
| + factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) =
|
| _ReceivePortImpl.fromRawReceivePort;
|
| }
|
|
|
| -@patch class Capability {
|
| - @patch factory Capability() = _CapabilityImpl;
|
| +@patch
|
| +class Capability {
|
| + @patch
|
| + factory Capability() = _CapabilityImpl;
|
| }
|
|
|
| class _CapabilityImpl implements Capability {
|
| factory _CapabilityImpl() native "CapabilityImpl_factory";
|
|
|
| - bool operator==(var other) {
|
| + bool operator ==(var other) {
|
| return (other is _CapabilityImpl) && _equals(other);
|
| }
|
|
|
| @@ -31,7 +36,8 @@ class _CapabilityImpl implements Capability {
|
| _get_hashcode() native "CapabilityImpl_get_hashcode";
|
| }
|
|
|
| -@patch class RawReceivePort {
|
| +@patch
|
| +class RawReceivePort {
|
| /**
|
| * Opens a long-lived port for receiving messages.
|
| *
|
| @@ -39,7 +45,8 @@ class _CapabilityImpl implements Capability {
|
| * can not be paused. The data-handler must be set before the first
|
| * event is received.
|
| */
|
| - @patch factory RawReceivePort([void handler(event)]) {
|
| + @patch
|
| + factory RawReceivePort([void handler(event)]) {
|
| _RawReceivePortImpl result = new _RawReceivePortImpl();
|
| result.handler = handler;
|
| return result;
|
| @@ -59,13 +66,9 @@ class _ReceivePortImpl extends Stream implements ReceivePort {
|
| }
|
|
|
| StreamSubscription listen(void onData(var message),
|
| - { Function onError,
|
| - void onDone(),
|
| - bool cancelOnError }) {
|
| + {Function onError, void onDone(), bool cancelOnError}) {
|
| return _controller.stream.listen(onData,
|
| - onError: onError,
|
| - onDone: onDone,
|
| - cancelOnError: cancelOnError);
|
| + onError: onError, onDone: onDone, cancelOnError: cancelOnError);
|
| }
|
|
|
| close() {
|
| @@ -121,7 +124,7 @@ class _RawReceivePortImpl implements RawReceivePort {
|
| return _get_sendport();
|
| }
|
|
|
| - bool operator==(var other) {
|
| + bool operator ==(var other) {
|
| return (other is _RawReceivePortImpl) &&
|
| (this._get_id() == other._get_id());
|
| }
|
| @@ -167,17 +170,17 @@ class _RawReceivePortImpl implements RawReceivePort {
|
|
|
| return new HashMap();
|
| }
|
| +
|
| static final Map _handlerMap = _initHandlerMap();
|
| }
|
|
|
| -
|
| class _SendPortImpl implements SendPort {
|
| /*--- public interface ---*/
|
| void send(var message) {
|
| _sendInternal(message);
|
| }
|
|
|
| - bool operator==(var other) {
|
| + bool operator ==(var other) {
|
| return (other is _SendPortImpl) && (this._get_id() == other._get_id());
|
| }
|
|
|
| @@ -202,31 +205,32 @@ typedef _BinaryFunction(args, message);
|
| * initial message. Defers execution of the entry point until the
|
| * isolate is in the message loop.
|
| */
|
| -void _startMainIsolate(Function entryPoint,
|
| - List<String> args) {
|
| - _startIsolate(null, // no parent port
|
| - entryPoint,
|
| - args,
|
| - null, // no message
|
| - true, // isSpawnUri
|
| - null, // no control port
|
| - null); // no capabilities
|
| +void _startMainIsolate(Function entryPoint, List<String> args) {
|
| + _startIsolate(
|
| + null, // no parent port
|
| + entryPoint,
|
| + args,
|
| + null, // no message
|
| + true, // isSpawnUri
|
| + null, // no control port
|
| + null); // no capabilities
|
| }
|
|
|
| /**
|
| * Takes the real entry point as argument and invokes it with the initial
|
| * message.
|
| */
|
| -void _startIsolate(SendPort parentPort,
|
| - Function entryPoint,
|
| - List<String> args,
|
| - var message,
|
| - bool isSpawnUri,
|
| - RawReceivePort controlPort,
|
| - List capabilities) {
|
| +void _startIsolate(
|
| + SendPort parentPort,
|
| + Function entryPoint,
|
| + List<String> args,
|
| + var message,
|
| + bool isSpawnUri,
|
| + RawReceivePort controlPort,
|
| + List capabilities) {
|
| // The control port (aka the main isolate port) does not handle any messages.
|
| if (controlPort != null) {
|
| - controlPort.handler = (_) {}; // Nobody home on the control port.
|
| + controlPort.handler = (_) {}; // Nobody home on the control port.
|
| }
|
|
|
| if (parentPort != null) {
|
| @@ -268,13 +272,16 @@ void _startIsolate(SendPort parentPort,
|
| port.sendPort.send(null);
|
| }
|
|
|
| -@patch class Isolate {
|
| +@patch
|
| +class Isolate {
|
| static final _currentIsolate = _getCurrentIsolate();
|
| static final _rootUri = _getCurrentRootUri();
|
|
|
| - @patch static Isolate get current => _currentIsolate;
|
| + @patch
|
| + static Isolate get current => _currentIsolate;
|
|
|
| - @patch static Future<Uri> get packageRoot {
|
| + @patch
|
| + static Future<Uri> get packageRoot {
|
| var hook = VMLibraryHooks.packageRootUriFuture;
|
| if (hook == null) {
|
| throw new UnsupportedError("Isolate.packageRoot");
|
| @@ -282,7 +289,8 @@ void _startIsolate(SendPort parentPort,
|
| return hook();
|
| }
|
|
|
| - @patch static Future<Uri> get packageConfig {
|
| + @patch
|
| + static Future<Uri> get packageConfig {
|
| var hook = VMLibraryHooks.packageConfigUriFuture;
|
| if (hook == null) {
|
| throw new UnsupportedError("Isolate.packageConfig");
|
| @@ -290,7 +298,8 @@ void _startIsolate(SendPort parentPort,
|
| return hook();
|
| }
|
|
|
| - @patch static Future<Uri> resolvePackageUri(Uri packageUri) {
|
| + @patch
|
| + static Future<Uri> resolvePackageUri(Uri packageUri) {
|
| var hook = VMLibraryHooks.resolvePackageUriFuture;
|
| if (hook == null) {
|
| throw new UnsupportedError("Isolate.resolvePackageUri");
|
| @@ -303,10 +312,12 @@ void _startIsolate(SendPort parentPort,
|
| (VMLibraryHooks.packageConfigUriFuture != null) &&
|
| (VMLibraryHooks.resolvePackageUriFuture != null);
|
|
|
| - @patch static Future<Isolate> spawn(
|
| - void entryPoint(message), var message,
|
| - {bool paused: false, bool errorsAreFatal,
|
| - SendPort onExit, SendPort onError}) async {
|
| + @patch
|
| + static Future<Isolate> spawn(void entryPoint(message), var message,
|
| + {bool paused: false,
|
| + bool errorsAreFatal,
|
| + SendPort onExit,
|
| + SendPort onError}) async {
|
| // `paused` isn't handled yet.
|
| RawReceivePort readyPort;
|
| try {
|
| @@ -334,8 +345,7 @@ void _startIsolate(SendPort parentPort,
|
| }
|
|
|
| _spawnFunction(readyPort.sendPort, script.toString(), entryPoint, message,
|
| - paused, errorsAreFatal, onExit, onError,
|
| - packageRoot, packageConfig);
|
| + paused, errorsAreFatal, onExit, onError, packageRoot, packageConfig);
|
| return await _spawnCommon(readyPort);
|
| } catch (e, st) {
|
| if (readyPort != null) {
|
| @@ -345,17 +355,17 @@ void _startIsolate(SendPort parentPort,
|
| }
|
| }
|
|
|
| - @patch static Future<Isolate> spawnUri(
|
| - Uri uri, List<String> args, var message,
|
| + @patch
|
| + static Future<Isolate> spawnUri(Uri uri, List<String> args, var message,
|
| {bool paused: false,
|
| - SendPort onExit,
|
| - SendPort onError,
|
| - bool errorsAreFatal,
|
| - bool checked,
|
| - Map<String, String> environment,
|
| - Uri packageRoot,
|
| - Uri packageConfig,
|
| - bool automaticPackageResolution: false}) async {
|
| + SendPort onExit,
|
| + SendPort onError,
|
| + bool errorsAreFatal,
|
| + bool checked,
|
| + Map<String, String> environment,
|
| + Uri packageRoot,
|
| + Uri packageConfig,
|
| + bool automaticPackageResolution: false}) async {
|
| RawReceivePort readyPort;
|
| if (environment != null) {
|
| throw new UnimplementedError("environment");
|
| @@ -365,18 +375,18 @@ void _startIsolate(SendPort parentPort,
|
| if (automaticPackageResolution) {
|
| if (packageRoot != null) {
|
| throw new ArgumentError("Cannot simultaneously request "
|
| - "automaticPackageResolution and specify a"
|
| - "packageRoot.");
|
| + "automaticPackageResolution and specify a"
|
| + "packageRoot.");
|
| }
|
| if (packageConfig != null) {
|
| throw new ArgumentError("Cannot simultaneously request "
|
| - "automaticPackageResolution and specify a"
|
| - "packageConfig.");
|
| + "automaticPackageResolution and specify a"
|
| + "packageConfig.");
|
| }
|
| } else {
|
| if ((packageRoot != null) && (packageConfig != null)) {
|
| throw new ArgumentError("Cannot simultaneously specify a "
|
| - "packageRoot and a packageConfig.");
|
| + "packageRoot and a packageConfig.");
|
| }
|
| }
|
| try {
|
| @@ -413,12 +423,20 @@ void _startIsolate(SendPort parentPort,
|
| var packageRootString = packageRoot?.toString();
|
| var packageConfigString = packageConfig?.toString();
|
|
|
| - _spawnUri(readyPort.sendPort, spawnedUri.toString(),
|
| - args, message,
|
| - paused, onExit, onError,
|
| - errorsAreFatal, checked,
|
| - null, /* environment */
|
| - packageRootString, packageConfigString);
|
| + _spawnUri(
|
| + readyPort.sendPort,
|
| + spawnedUri.toString(),
|
| + args,
|
| + message,
|
| + paused,
|
| + onExit,
|
| + onError,
|
| + errorsAreFatal,
|
| + checked,
|
| + null,
|
| + /* environment */
|
| + packageRootString,
|
| + packageConfigString);
|
| return await _spawnCommon(readyPort);
|
| } catch (e, st) {
|
| if (readyPort != null) {
|
| @@ -436,8 +454,8 @@ void _startIsolate(SendPort parentPort,
|
| SendPort controlPort = readyMessage[0];
|
| List capabilities = readyMessage[1];
|
| completer.complete(new Isolate(controlPort,
|
| - pauseCapability: capabilities[0],
|
| - terminateCapability: capabilities[1]));
|
| + pauseCapability: capabilities[0],
|
| + terminateCapability: capabilities[1]));
|
| } else if (readyMessage is String) {
|
| // We encountered an error while starting the new isolate.
|
| completer.completeError(new IsolateSpawnException(
|
| @@ -465,110 +483,127 @@ void _startIsolate(SendPort parentPort,
|
| static const _DEL_ERROR = 8;
|
| static const _ERROR_FATAL = 9;
|
|
|
| -
|
| - static void _spawnFunction(SendPort readyPort, String uri,
|
| - Function topLevelFunction,
|
| - var message, bool paused, bool errorsAreFatal,
|
| - SendPort onExit, SendPort onError,
|
| - String packageRoot, String packageConfig)
|
| - native "Isolate_spawnFunction";
|
| -
|
| - static void _spawnUri(SendPort readyPort, String uri,
|
| - List<String> args, var message,
|
| - bool paused, SendPort onExit, SendPort onError,
|
| - bool errorsAreFatal, bool checked,
|
| - List environment,
|
| - String packageRoot, String packageConfig)
|
| - native "Isolate_spawnUri";
|
| + static void _spawnFunction(
|
| + SendPort readyPort,
|
| + String uri,
|
| + Function topLevelFunction,
|
| + var message,
|
| + bool paused,
|
| + bool errorsAreFatal,
|
| + SendPort onExit,
|
| + SendPort onError,
|
| + String packageRoot,
|
| + String packageConfig) native "Isolate_spawnFunction";
|
| +
|
| + static void _spawnUri(
|
| + SendPort readyPort,
|
| + String uri,
|
| + List<String> args,
|
| + var message,
|
| + bool paused,
|
| + SendPort onExit,
|
| + SendPort onError,
|
| + bool errorsAreFatal,
|
| + bool checked,
|
| + List environment,
|
| + String packageRoot,
|
| + String packageConfig) native "Isolate_spawnUri";
|
|
|
| static void _sendOOB(port, msg) native "Isolate_sendOOB";
|
|
|
| - @patch void _pause(Capability resumeCapability) {
|
| + @patch
|
| + void _pause(Capability resumeCapability) {
|
| var msg = new List(4)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _PAUSE
|
| - ..[2] = pauseCapability
|
| - ..[3] = resumeCapability;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _PAUSE
|
| + ..[2] = pauseCapability
|
| + ..[3] = resumeCapability;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void resume(Capability resumeCapability) {
|
| + @patch
|
| + void resume(Capability resumeCapability) {
|
| var msg = new List(4)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _RESUME
|
| - ..[2] = pauseCapability
|
| - ..[3] = resumeCapability;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _RESUME
|
| + ..[2] = pauseCapability
|
| + ..[3] = resumeCapability;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void addOnExitListener(SendPort responsePort,
|
| - {Object response}) {
|
| + @patch
|
| + void addOnExitListener(SendPort responsePort, {Object response}) {
|
| var msg = new List(4)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _ADD_EXIT
|
| - ..[2] = responsePort
|
| - ..[3] = response;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _ADD_EXIT
|
| + ..[2] = responsePort
|
| + ..[3] = response;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void removeOnExitListener(SendPort responsePort) {
|
| + @patch
|
| + void removeOnExitListener(SendPort responsePort) {
|
| var msg = new List(3)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _DEL_EXIT
|
| - ..[2] = responsePort;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _DEL_EXIT
|
| + ..[2] = responsePort;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void setErrorsFatal(bool errorsAreFatal) {
|
| + @patch
|
| + void setErrorsFatal(bool errorsAreFatal) {
|
| var msg = new List(4)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| + ..[0] = 0 // Make room for OOB message type.
|
| ..[1] = _ERROR_FATAL
|
| ..[2] = terminateCapability
|
| ..[3] = errorsAreFatal;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void kill({int priority: BEFORE_NEXT_EVENT}) {
|
| + @patch
|
| + void kill({int priority: BEFORE_NEXT_EVENT}) {
|
| var msg = new List(4)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _KILL
|
| - ..[2] = terminateCapability
|
| - ..[3] = priority;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _KILL
|
| + ..[2] = terminateCapability
|
| + ..[3] = priority;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void ping(SendPort responsePort, {Object response,
|
| - int priority: IMMEDIATE}) {
|
| + @patch
|
| + void ping(SendPort responsePort, {Object response, int priority: IMMEDIATE}) {
|
| var msg = new List(5)
|
| - ..[0] = 0 // Make room for OOM message type.
|
| - ..[1] = _PING
|
| - ..[2] = responsePort
|
| - ..[3] = priority
|
| - ..[4] = response;
|
| + ..[0] = 0 // Make room for OOM message type.
|
| + ..[1] = _PING
|
| + ..[2] = responsePort
|
| + ..[3] = priority
|
| + ..[4] = response;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void addErrorListener(SendPort port) {
|
| + @patch
|
| + void addErrorListener(SendPort port) {
|
| var msg = new List(3)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _ADD_ERROR
|
| - ..[2] = port;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _ADD_ERROR
|
| + ..[2] = port;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| - @patch void removeErrorListener(SendPort port) {
|
| + @patch
|
| + void removeErrorListener(SendPort port) {
|
| var msg = new List(3)
|
| - ..[0] = 0 // Make room for OOB message type.
|
| - ..[1] = _DEL_ERROR
|
| - ..[2] = port;
|
| + ..[0] = 0 // Make room for OOB message type.
|
| + ..[1] = _DEL_ERROR
|
| + ..[2] = port;
|
| _sendOOB(controlPort, msg);
|
| }
|
|
|
| static Isolate _getCurrentIsolate() {
|
| List portAndCapabilities = _getPortAndCapabilitiesOfCurrentIsolate();
|
| return new Isolate(portAndCapabilities[0],
|
| - pauseCapability: portAndCapabilities[1],
|
| - terminateCapability: portAndCapabilities[2]);
|
| + pauseCapability: portAndCapabilities[1],
|
| + terminateCapability: portAndCapabilities[2]);
|
| }
|
|
|
| static List _getPortAndCapabilitiesOfCurrentIsolate()
|
| @@ -582,6 +617,5 @@ void _startIsolate(SendPort parentPort,
|
| }
|
| }
|
|
|
| - static String _getCurrentRootUriStr()
|
| - native "Isolate_getCurrentRootUriStr";
|
| + static String _getCurrentRootUriStr() native "Isolate_getCurrentRootUriStr";
|
| }
|
|
|