Index: sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart |
diff --git a/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart b/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart |
deleted file mode 100644 |
index 9230bba9ff3e37e81bdacb6fde5929e2ab03e1d7..0000000000000000000000000000000000000000 |
--- a/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart |
+++ /dev/null |
@@ -1,362 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-part of _isolate_helper; |
- |
-/// Serialize [message]. |
-_serializeMessage(message) { |
- return new _Serializer().serialize(message); |
-} |
- |
-/// Deserialize [message]. |
-_deserializeMessage(message) { |
- return new _Deserializer().deserialize(message); |
-} |
- |
-/// Clones the message. |
-/// |
-/// Contrary to a `_deserializeMessage(_serializeMessage(x))` the `_clone` |
-/// function will not try to adjust SendPort values and pass them through. |
-_clone(message) { |
- _Serializer serializer = new _Serializer(serializeSendPorts: false); |
- _Deserializer deserializer = new _Deserializer(); |
- return deserializer.deserialize(serializer.serialize(message)); |
-} |
- |
-class _Serializer { |
- final bool _serializeSendPorts; |
- Map<dynamic, int> serializedObjectIds = new Map<dynamic, int>.identity(); |
- |
- _Serializer({serializeSendPorts: true}) |
- : _serializeSendPorts = serializeSendPorts; |
- |
- /// Returns a message that can be transmitted through web-worker channels. |
- serialize(x) { |
- if (isPrimitive(x)) return serializePrimitive(x); |
- |
- int serializationId = serializedObjectIds[x]; |
- if (serializationId != null) return makeRef(serializationId); |
- |
- serializationId = serializedObjectIds.length; |
- serializedObjectIds[x] = serializationId; |
- |
- if (x is NativeByteBuffer) return serializeByteBuffer(x); |
- if (x is NativeTypedData) return serializeTypedData(x); |
- if (x is JSIndexable) return serializeJSIndexable(x); |
- if (x is InternalMap) return serializeMap(x); |
- |
- if (x is JSObject) return serializeJSObject(x); |
- |
- // We should not have any interceptors any more. |
- if (x is Interceptor) unsupported(x); |
- |
- if (x is RawReceivePort) { |
- unsupported(x, "RawReceivePorts can't be transmitted:"); |
- } |
- |
- // SendPorts need their workerIds adjusted (either during serialization or |
- // deserialization). |
- if (x is _NativeJsSendPort) return serializeJsSendPort(x); |
- if (x is _WorkerSendPort) return serializeWorkerSendPort(x); |
- |
- if (x is Closure) return serializeClosure(x); |
- |
- return serializeDartObject(x); |
- } |
- |
- void unsupported(x, [String message]) { |
- if (message == null) message = "Can't transmit:"; |
- throw new UnsupportedError("$message $x"); |
- } |
- |
- makeRef(int serializationId) => ["ref", serializationId]; |
- |
- bool isPrimitive(x) => x == null || x is String || x is num || x is bool; |
- serializePrimitive(primitive) => primitive; |
- |
- serializeByteBuffer(NativeByteBuffer buffer) { |
- return ["buffer", buffer]; |
- } |
- |
- serializeTypedData(NativeTypedData data) { |
- return ["typed", data]; |
- } |
- |
- serializeJSIndexable(JSIndexable indexable) { |
- // Strings are JSIndexable but should have been treated earlier. |
- assert(indexable is! String); |
- List serialized = serializeArray(indexable); |
- if (indexable is JSFixedArray) return ["fixed", serialized]; |
- if (indexable is JSExtendableArray) return ["extendable", serialized]; |
- // MutableArray check must be last, since JSFixedArray and JSExtendableArray |
- // extend JSMutableArray. |
- if (indexable is JSMutableArray) return ["mutable", serialized]; |
- // The only JSArrays left are the const Lists (as in `const [1, 2]`). |
- if (indexable is JSArray) return ["const", serialized]; |
- unsupported(indexable, "Can't serialize indexable: "); |
- return null; |
- } |
- |
- serializeArray(JSArray x) { |
- List serialized = []; |
- serialized.length = x.length; |
- for (int i = 0; i < x.length; i++) { |
- serialized[i] = serialize(x[i]); |
- } |
- return serialized; |
- } |
- |
- serializeArrayInPlace(JSArray x) { |
- for (int i = 0; i < x.length; i++) { |
- x[i] = serialize(x[i]); |
- } |
- return x; |
- } |
- |
- serializeMap(Map x) { |
- Function serializeTearOff = serialize; |
- return ['map', |
- x.keys.map(serializeTearOff).toList(), |
- x.values.map(serializeTearOff).toList()]; |
- } |
- |
- serializeJSObject(JSObject x) { |
- // Don't serialize objects if their `constructor` property isn't `Object` |
- // or undefined/null. |
- // A different constructor is taken as a sign that the object has complex |
- // internal state, or that it is a function, and won't be serialized. |
- if (JS('bool', '!!(#.constructor)', x) && |
- JS('bool', 'x.constructor !== Object')) { |
- unsupported(x, "Only plain JS Objects are supported:"); |
- } |
- List keys = JS('JSArray', 'Object.keys(#)', x); |
- List values = []; |
- values.length = keys.length; |
- for (int i = 0; i < keys.length; i++) { |
- values[i] = serialize(JS('', '#[#]', x, keys[i])); |
- } |
- return ['js-object', keys, values]; |
- } |
- |
- serializeWorkerSendPort(_WorkerSendPort x) { |
- if (_serializeSendPorts) { |
- return ['sendport', x._workerId, x._isolateId, x._receivePortId]; |
- } |
- return ['raw sendport', x]; |
- } |
- |
- serializeJsSendPort(_NativeJsSendPort x) { |
- if (_serializeSendPorts) { |
- int workerId = _globalState.currentManagerId; |
- return ['sendport', workerId, x._isolateId, x._receivePort._id]; |
- } |
- return ['raw sendport', x]; |
- } |
- |
- serializeCapability(CapabilityImpl x) => ['capability', x._id]; |
- |
- serializeClosure(Closure x) { |
- final name = IsolateNatives._getJSFunctionName(x); |
- if (name == null) { |
- unsupported(x, "Closures can't be transmitted:"); |
- } |
- return ['function', name]; |
- } |
- |
- serializeDartObject(x) { |
- if (!isDartObject(x)) unsupported(x); |
- var classExtractor = JS_EMBEDDED_GLOBAL('', CLASS_ID_EXTRACTOR); |
- var fieldsExtractor = JS_EMBEDDED_GLOBAL('', CLASS_FIELDS_EXTRACTOR); |
- String classId = JS('String', '#(#)', classExtractor, x); |
- List fields = JS('JSArray', '#(#)', fieldsExtractor, x); |
- return ['dart', classId, serializeArrayInPlace(fields)]; |
- } |
-} |
- |
-class _Deserializer { |
- /// When `true`, encodes sendports specially so that they can be adjusted on |
- /// the receiving end. |
- /// |
- /// When `false`, sendports are cloned like any other object. |
- final bool _adjustSendPorts; |
- |
- List<dynamic> deserializedObjects = new List<dynamic>(); |
- |
- _Deserializer({adjustSendPorts: true}) : _adjustSendPorts = adjustSendPorts; |
- |
- /// Returns a message that can be transmitted through web-worker channels. |
- deserialize(x) { |
- if (isPrimitive(x)) return deserializePrimitive(x); |
- |
- if (x is! JSArray) throw new ArgumentError("Bad serialized message: $x"); |
- |
- switch (x.first) { |
- case "ref": return deserializeRef(x); |
- case "buffer": return deserializeByteBuffer(x); |
- case "typed": return deserializeTypedData(x); |
- case "fixed": return deserializeFixed(x); |
- case "extendable": return deserializeExtendable(x); |
- case "mutable": return deserializeMutable(x); |
- case "const": return deserializeConst(x); |
- case "map": return deserializeMap(x); |
- case "sendport": return deserializeSendPort(x); |
- case "raw sendport": return deserializeRawSendPort(x); |
- case "js-object": return deserializeJSObject(x); |
- case "function": return deserializeClosure(x); |
- case "dart": return deserializeDartObject(x); |
- default: throw "couldn't deserialize: $x"; |
- } |
- } |
- |
- bool isPrimitive(x) => x == null || x is String || x is num || x is bool; |
- deserializePrimitive(x) => x; |
- |
- // ['ref', id]. |
- deserializeRef(x) { |
- assert(x[0] == 'ref'); |
- int serializationId = x[1]; |
- return deserializedObjects[serializationId]; |
- } |
- |
- // ['buffer', <byte buffer>]. |
- NativeByteBuffer deserializeByteBuffer(x) { |
- assert(x[0] == 'buffer'); |
- NativeByteBuffer result = x[1]; |
- deserializedObjects.add(result); |
- return result; |
- } |
- |
- // ['typed', <typed array>]. |
- NativeTypedData deserializeTypedData(x) { |
- assert(x[0] == 'typed'); |
- NativeTypedData result = x[1]; |
- deserializedObjects.add(result); |
- return result; |
- } |
- |
- // Updates the given array in place with its deserialized content. |
- List deserializeArrayInPlace(JSArray x) { |
- for (int i = 0; i < x.length; i++) { |
- x[i] = deserialize(x[i]); |
- } |
- return x; |
- } |
- |
- // ['fixed', <array>]. |
- List deserializeFixed(x) { |
- assert(x[0] == 'fixed'); |
- List result = x[1]; |
- deserializedObjects.add(result); |
- return new JSArray.markFixed(deserializeArrayInPlace(result)); |
- } |
- |
- // ['extendable', <array>]. |
- List deserializeExtendable(x) { |
- assert(x[0] == 'extendable'); |
- List result = x[1]; |
- deserializedObjects.add(result); |
- return new JSArray.markGrowable(deserializeArrayInPlace(result)); |
- } |
- |
- // ['mutable', <array>]. |
- List deserializeMutable(x) { |
- assert(x[0] == 'mutable'); |
- List result = x[1]; |
- deserializedObjects.add(result); |
- return deserializeArrayInPlace(result); |
- } |
- |
- // ['const', <array>]. |
- List deserializeConst(x) { |
- assert(x[0] == 'const'); |
- List result = x[1]; |
- deserializedObjects.add(result); |
- // TODO(floitsch): need to mark list as non-changeable. |
- return new JSArray.markFixed(deserializeArrayInPlace(result)); |
- } |
- |
- // ['map', <key-list>, <value-list>]. |
- Map deserializeMap(x) { |
- assert(x[0] == 'map'); |
- List keys = x[1]; |
- List values = x[2]; |
- Map result = {}; |
- deserializedObjects.add(result); |
- // We need to keep the order of how objects were serialized. |
- // First deserialize all keys, and then only deserialize the values. |
- keys = keys.map(deserialize).toList(); |
- |
- for (int i = 0; i < keys.length; i++) { |
- result[keys[i]] = deserialize(values[i]); |
- } |
- return result; |
- } |
- |
- // ['sendport', <managerId>, <isolateId>, <receivePortId>]. |
- SendPort deserializeSendPort(x) { |
- assert(x[0] == 'sendport'); |
- int managerId = x[1]; |
- int isolateId = x[2]; |
- int receivePortId = x[3]; |
- SendPort result; |
- // If two isolates are in the same manager, we use NativeJsSendPorts to |
- // deliver messages directly without using postMessage. |
- if (managerId == _globalState.currentManagerId) { |
- var isolate = _globalState.isolates[isolateId]; |
- if (isolate == null) return null; // Isolate has been closed. |
- var receivePort = isolate.lookup(receivePortId); |
- if (receivePort == null) return null; // Port has been closed. |
- result = new _NativeJsSendPort(receivePort, isolateId); |
- } else { |
- result = new _WorkerSendPort(managerId, isolateId, receivePortId); |
- } |
- deserializedObjects.add(result); |
- return result; |
- } |
- |
- // ['raw sendport', <sendport>]. |
- SendPort deserializeRawSendPort(x) { |
- assert(x[0] == 'raw sendport'); |
- SendPort result = x[1]; |
- deserializedObjects.add(result); |
- return result; |
- } |
- |
- // ['js-object', <key-list>, <value-list>]. |
- deserializeJSObject(x) { |
- assert(x[0] == 'js-object'); |
- List keys = x[1]; |
- List values = x[2]; |
- var o = JS('', '{}'); |
- deserializedObjects.add(o); |
- for (int i = 0; i < keys.length; i++) { |
- JS('', '#[#]=#', o, keys[i], deserialize(values[i])); |
- } |
- return o; |
- } |
- |
- // ['function', <name>]. |
- Function deserializeClosure(x) { |
- assert(x[0] == 'function'); |
- String name = x[1]; |
- Function result = IsolateNatives._getJSFunctionFromName(name); |
- deserializedObjects.add(result); |
- return result; |
- } |
- |
- // ['dart', <class-id>, <field-list>]. |
- deserializeDartObject(x) { |
- assert(x[0] == 'dart'); |
- String classId = x[1]; |
- List fields = x[2]; |
- var instanceFromClassId = JS_EMBEDDED_GLOBAL('', INSTANCE_FROM_CLASS_ID); |
- var initializeObject = JS_EMBEDDED_GLOBAL('', INITIALIZE_EMPTY_INSTANCE); |
- |
- var emptyInstance = JS('', '#(#)', instanceFromClassId, classId); |
- deserializedObjects.add(emptyInstance); |
- deserializeArrayInPlace(fields); |
- return JS('', '#(#, #, #)', |
- initializeObject, classId, emptyInstance, fields); |
- } |
-} |