Index: runtime/vm/dart_api_message.cc |
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc |
index ab1e0605a1457f4e2bd07186a15b33d8d265761a..5315301baef99a21bf587b324ed0342745bd06ad 100644 |
--- a/runtime/vm/dart_api_message.cc |
+++ b/runtime/vm/dart_api_message.cc |
@@ -164,6 +164,22 @@ Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { |
} |
+Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectInternal( |
+ Dart_CObject_Internal::Type type) { |
+ Dart_CObject_Internal* value = |
+ reinterpret_cast<Dart_CObject_Internal*>( |
+ alloc_(NULL, 0, sizeof(Dart_CObject_Internal))); |
+ ASSERT(value != NULL); |
+ value->type = static_cast<Dart_CObject::Type>(type); |
+ return value; |
+} |
+ |
+ |
+Dart_CObject_Internal* ApiMessageReader::AllocateDartCObjectClass() { |
+ return AllocateDartCObjectInternal(Dart_CObject_Internal::kClass); |
+} |
+ |
+ |
ApiMessageReader::BackRefNode* ApiMessageReader::AllocateBackRefNode( |
Dart_CObject* reference, |
DeserializeState state) { |
@@ -182,9 +198,55 @@ Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { |
USE(tags); |
intptr_t class_id; |
- // Reading of regular dart instances is not supported. |
+ // There is limited support for reading regular dart instances. Only |
+ // typed data views are currently handled. |
if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
- return AllocateDartCObjectUnsupported(); |
+ Dart_CObject_Internal* object = |
+ reinterpret_cast<Dart_CObject_Internal*>(GetBackRef(object_id)); |
+ if (object == NULL) { |
+ object = |
+ AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized); |
+ AddBackRef(object_id, object, kIsDeserialized); |
+ // Read class of object. |
+ object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl()); |
+ ASSERT(object->cls->type == |
+ static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass)); |
+ } |
+ ASSERT(object->type == |
+ static_cast<Dart_CObject::Type>( |
+ Dart_CObject_Internal::kUninitialized)); |
+ |
+ // Handle typed data views. |
+ char* library_url = |
+ object->cls->internal.as_class.library_url->value.as_string; |
+ char* class_name = |
+ object->cls->internal.as_class.class_name->value.as_string; |
+ if (strcmp("dart:typeddata", library_url) == 0 && |
+ strncmp("_Uint8ArrayView", class_name, 15) == 0) { |
siva
2013/04/15 20:17:47
This seems rather inefficient having to do a strcm
Søren Gjesse
2013/04/17 12:54:58
That would be a great idea. I added this way of pr
siva
2013/04/18 02:30:40
Yes these predefined Cid's are already assigned to
|
+ object->type = |
+ static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kView); |
+ // Skip type arguments. |
+ ReadObjectImpl(); |
+ object->internal.as_view.buffer = ReadObjectImpl(); |
+ object->internal.as_view.offset_in_bytes = ReadSmiValue(); |
+ object->internal.as_view.length = ReadSmiValue(); |
+ |
+ // The buffer is fully read now as typed data objects are |
+ // serialized in-line. |
+ Dart_CObject* buffer = object->internal.as_view.buffer; |
+ ASSERT(buffer->type == Dart_CObject::kUint8Array); |
+ |
+ // Now turn the view into a byte array. |
siva
2013/04/15 20:26:30
Another issue that might need addressing :
if we
Søren Gjesse
2013/04/17 12:54:58
Why is that? The view will just point to the under
siva
2013/04/18 02:30:40
True it would point to the underlying deserialized
|
+ object->type = Dart_CObject::kUint8Array; |
+ object->value.as_byte_array.length = object->internal.as_view.length; |
+ object->value.as_byte_array.values = |
+ buffer->value.as_byte_array.values + |
+ object->internal.as_view.offset_in_bytes; |
+ } else { |
+ // TODO(sgjesse): Handle other instances. Currently this will |
+ // skew the reading as the fields of the instance is not read. |
+ } |
+ return object; |
} |
ASSERT((class_header & kSmiTagMask) != 0); |
@@ -265,11 +327,17 @@ Dart_CObject* ApiMessageReader::ReadObjectRef() { |
// Read the class header information and lookup the class. |
intptr_t class_header = ReadIntptrValue(); |
- // Reading of regular dart instances is not supported. |
+ // Reading of regular dart instances has limited support in order to |
+ // read typed data views. |
if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) { |
intptr_t object_id = SerializedHeaderData::decode(value); |
- Dart_CObject* object = AllocateDartCObjectUnsupported(); |
+ Dart_CObject_Internal* object = |
+ AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized); |
AddBackRef(object_id, object, kIsNotDeserialized); |
+ // Read class of object. |
+ object->cls = reinterpret_cast<Dart_CObject_Internal*>(ReadObjectImpl()); |
+ ASSERT(object->cls->type == |
+ static_cast<Dart_CObject::Type>(Dart_CObject_Internal::kClass)); |
return object; |
} |
ASSERT((class_header & kSmiTagMask) != 0); |
@@ -313,8 +381,14 @@ Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id, |
intptr_t object_id) { |
switch (class_id) { |
case kClassCid: { |
- Dart_CObject* object = AllocateDartCObjectUnsupported(); |
+ Dart_CObject_Internal* object = AllocateDartCObjectClass(); |
AddBackRef(object_id, object, kIsDeserialized); |
+ object->internal.as_class.library_url = ReadObjectImpl(); |
+ ASSERT(object->internal.as_class.library_url->type == |
+ Dart_CObject::kString); |
+ object->internal.as_class.class_name = ReadObjectImpl(); |
+ ASSERT(object->internal.as_class.class_name->type == |
+ Dart_CObject::kString); |
return object; |
} |
case kTypeArgumentsCid: { |