Index: runtime/vm/dart_api_message.cc |
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc |
index cef65c67e1b7dcba785bc5d613ed87adaa6799f4..d5f2e69d77bd4af57603a0de4fb1e5e0daa59104 100644 |
--- a/runtime/vm/dart_api_message.cc |
+++ b/runtime/vm/dart_api_message.cc |
@@ -56,6 +56,7 @@ intptr_t ApiMessageReader::LookupInternalClass(intptr_t class_header) { |
Dart_CObject* ApiMessageReader::AllocateDartCObject(Dart_CObject::Type type) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>(alloc_(NULL, 0, sizeof(Dart_CObject))); |
+ ASSERT(value != NULL); |
value->type = type; |
return value; |
} |
@@ -94,12 +95,33 @@ Dart_CObject* ApiMessageReader::AllocateDartCObjectString(intptr_t length) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>( |
alloc_(NULL, 0, sizeof(Dart_CObject) + length + 1)); |
+ ASSERT(value != NULL); |
value->value.as_string = reinterpret_cast<char*>(value) + sizeof(*value); |
value->type = Dart_CObject::kString; |
return value; |
} |
+Dart_CObject* ApiMessageReader::AllocateDartCObjectByteArray(intptr_t length) { |
+ // Allocate a Dart_CObject structure followed by an array of bytes |
+ // for the byte array content. The pointer to the byte array content |
+ // is set up to this area. |
+ Dart_CObject* value = |
+ reinterpret_cast<Dart_CObject*>( |
+ alloc_(NULL, 0, sizeof(Dart_CObject) + length)); |
+ ASSERT(value != NULL); |
+ value->type = Dart_CObject::kByteArray; |
+ value->value.as_array.length = length; |
+ if (length > 0) { |
+ value->value.as_byte_array.values = |
+ reinterpret_cast<uint8_t*>(value) + sizeof(*value); |
+ } else { |
+ value->value.as_byte_array.values = NULL; |
+ } |
+ return value; |
+} |
+ |
+ |
Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { |
// Allocate a Dart_CObject structure followed by an array of |
// pointers to Dart_CObject structures. The pointer to the array |
@@ -107,6 +129,7 @@ Dart_CObject* ApiMessageReader::AllocateDartCObjectArray(intptr_t length) { |
Dart_CObject* value = |
reinterpret_cast<Dart_CObject*>( |
alloc_(NULL, 0, sizeof(Dart_CObject) + length * sizeof(value))); |
+ ASSERT(value != NULL); |
value->type = Dart_CObject::kArray; |
value->value.as_array.length = length; |
if (length > 0) { |
@@ -182,10 +205,9 @@ Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { |
AddBackwardReference(object_id, object); |
char* p = object->value.as_string; |
for (intptr_t i = 0; i < len; i++) { |
- *p = Read<uint8_t>(); |
- p++; |
+ p[i] = Read<uint8_t>(); |
} |
- *p = '\0'; |
+ p[len] = '\0'; |
return object; |
break; |
} |
@@ -197,6 +219,19 @@ Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) { |
// Four byte strings not supported. |
return NULL; |
break; |
+ case ObjectStore::kInternalByteArrayClass: { |
+ intptr_t len = ReadSmiValue(); |
+ Dart_CObject* object = AllocateDartCObjectByteArray(len); |
+ AddBackwardReference(object_id, object); |
+ if (len > 0) { |
+ uint8_t* p = object->value.as_byte_array.values; |
+ for (intptr_t i = 0; i < len; i++) { |
+ p[i] = Read<uint8_t>(); |
+ } |
+ } |
+ return object; |
+ break; |
+ } |
default: |
// Everything else not supported. |
return NULL; |
@@ -215,7 +250,8 @@ Dart_CObject* ApiMessageReader::ReadIndexedObject(intptr_t object_id) { |
object_id == ObjectStore::kDoubleInterface || |
object_id == ObjectStore::kIntInterface || |
object_id == ObjectStore::kBoolInterface || |
- object_id == ObjectStore::kStringInterface) { |
+ object_id == ObjectStore::kStringInterface || |
+ object_id == ObjectStore::kByteArrayInterface) { |
// Always return dynamic type (this is only a marker). |
return &dynamic_type_marker; |
} else { |