| Index: runtime/lib/isolate_patch.dart
|
| ===================================================================
|
| --- runtime/lib/isolate_patch.dart (revision 35287)
|
| +++ runtime/lib/isolate_patch.dart (working copy)
|
| @@ -11,6 +11,16 @@
|
| _ReceivePortImpl.fromRawReceivePort;
|
| }
|
|
|
| +patch class Capability {
|
| + /* patch */ factory Capability() {
|
| + throw new UnimplementedError();
|
| + }
|
| +}
|
| +
|
| +class _CapabilityImpl {
|
| + factory _CapabilityImpl() native "CapabilityImpl_factory";
|
| +}
|
| +
|
| patch class RawReceivePort {
|
| /**
|
| * Opens a long-lived port for receiving messages.
|
| @@ -79,41 +89,39 @@
|
| factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
|
|
|
| close() {
|
| - _portMap.remove(_id);
|
| - _closeInternal(_id);
|
| + // Close the port and remove it from the handler map.
|
| + _handlerMap.remove(this._closeInternal());
|
| }
|
|
|
| SendPort get sendPort {
|
| - return new _SendPortImpl._from(this);
|
| + return _get_sendport();
|
| }
|
|
|
| - /**** Internal implementation details ****/
|
| - // Called from the VM to create a new RawReceivePort instance.
|
| - static _RawReceivePortImpl _get(int id) {
|
| - return _portMap[id];
|
| + bool operator==(var other) {
|
| + return (other is _RawReceivePortImpl) &&
|
| + (this._get_id() == other._get_id());
|
| }
|
|
|
| - static _RawReceivePortImpl _create(int id) {
|
| - assert(_portMap[id]== null);
|
| - return new _RawReceivePortImpl._internal(id);
|
| + int get hashCode {
|
| + return sendPort.hashCode();
|
| }
|
|
|
| - _RawReceivePortImpl._internal(int id) : _id = id {
|
| - _portMap[id] = this;
|
| - }
|
| + /**** Internal implementation details ****/
|
| + _get_id() native "RawReceivePortImpl_get_id";
|
| + _get_sendport() native "RawReceivePortImpl_get_sendport";
|
|
|
| - // Called from the VM to retrieve the RawReceivePort for a message.
|
| - static _RawReceivePortImpl _lookupReceivePort(int id) {
|
| - return _portMap[id];
|
| + // Called from the VM to retrieve the handler for a message.
|
| + static _lookupHandler(int id) {
|
| + var result = _handlerMap[id];
|
| + return result;
|
| }
|
|
|
| // Called from the VM to dispatch to the handler.
|
| - static void _handleMessage(_RawReceivePortImpl port, var message) {
|
| - assert(port != null);
|
| + static void _handleMessage(Function handler, var message) {
|
| // TODO(floitsch): this relies on the fact that any exception aborts the
|
| // VM. Once we have non-fatal global exceptions we need to catch errors
|
| // so that we can run the immediate callbacks.
|
| - port._handler(message);
|
| + handler(message);
|
| if (_pendingImmediateCallback != null) {
|
| var callback = _pendingImmediateCallback;
|
| _pendingImmediateCallback = null;
|
| @@ -122,57 +130,38 @@
|
| }
|
|
|
| // Call into the VM to close the VM maintained mappings.
|
| - static _closeInternal(int id) native "RawReceivePortImpl_closeInternal";
|
| + _closeInternal() native "RawReceivePortImpl_closeInternal";
|
|
|
| - void set handler(Function newHandler) {
|
| - this._handler = newHandler;
|
| + void set handler(Function value) {
|
| + _handlerMap[this._get_id()] = value;
|
| }
|
|
|
| - final int _id;
|
| - Function _handler;
|
| -
|
| - // id to RawReceivePort mapping.
|
| - static final Map _portMap = new HashMap();
|
| + // TODO(iposva): Ideally keep this map in the VM.
|
| + // id to handler mapping.
|
| + static final Map _handlerMap = new HashMap();
|
| }
|
|
|
|
|
| class _SendPortImpl implements SendPort {
|
| /*--- public interface ---*/
|
| void send(var message) {
|
| - _sendInternal(_id, message);
|
| + _sendInternal(message);
|
| }
|
|
|
| bool operator==(var other) {
|
| - return (other is _SendPortImpl) && _id == other._id;
|
| + return (other is _SendPortImpl) && (this._get_id() == other._get_id());
|
| }
|
|
|
| int get hashCode {
|
| - const int MASK = 0x3FFFFFFF;
|
| - int hash = _id;
|
| - hash = (hash + ((hash & (MASK >> 10)) << 10)) & MASK;
|
| - hash ^= (hash >> 6);
|
| - hash = (hash + ((hash & (MASK >> 3)) << 3)) & MASK;
|
| - hash ^= (hash >> 11);
|
| - hash = (hash + ((hash & (MASK >> 15)) << 15)) & MASK;
|
| - return hash;
|
| + return _get_hashcode();
|
| }
|
|
|
| /*--- private implementation ---*/
|
| - _SendPortImpl._from(_RawReceivePortImpl from) : _id = from._id;
|
| - _SendPortImpl._with(int id) : _id = id;
|
| + _get_id() native "SendPortImpl_get_id";
|
| + _get_hashcode() native "SendPortImpl_get_hashcode";
|
|
|
| - // _SendPortImpl._create is called from the VM when a new SendPort instance is
|
| - // needed by the VM code.
|
| - static SendPort _create(int id) {
|
| - return new _SendPortImpl._with(id);
|
| - }
|
| -
|
| - // Forward the implementation of sending messages to the VM. Only port ids
|
| - // are being handed to the VM.
|
| - static _sendInternal(int sendId, var message)
|
| - native "SendPortImpl_sendInternal_";
|
| -
|
| - final int _id;
|
| + // Forward the implementation of sending messages to the VM.
|
| + void _sendInternal(var message) native "SendPortImpl_sendInternal_";
|
| }
|
|
|
| typedef _MainFunction();
|
| @@ -277,9 +266,3 @@
|
|
|
| static SendPort _spawnUri(String uri) native "Isolate_spawnUri";
|
| }
|
| -
|
| -patch class Capability {
|
| - /* patch */ factory Capability() {
|
| - throw new UnimplementedError();
|
| - }
|
| -}
|
|
|