Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index 6d444bdf84d0df4a81ffe79605ada551959797f3..6a829883b6799a56d4433f38f42c8fb72f078558 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -86,6 +86,14 @@ static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
case Dart_CObject::kString: |
EXPECT_STREQ(first->value.as_string, second->value.as_string); |
break; |
+ case Dart_CObject::kByteArray: |
+ EXPECT_EQ(first->value.as_byte_array.length, |
+ second->value.as_byte_array.length); |
+ for (int i = 0; i < first->value.as_byte_array.length; i++) { |
+ EXPECT_EQ(first->value.as_byte_array.values[i], |
+ second->value.as_byte_array.values[i]); |
+ } |
+ break; |
case Dart_CObject::kArray: |
// Use invalid type as a visited marker to avoid infinite |
// recursion on graphs with cycles. |
@@ -495,6 +503,77 @@ TEST_CASE(SerializeEmptyArray) { |
} |
+TEST_CASE(SerializeByteArray) { |
+ Zone zone(Isolate::Current()); |
+ |
+ // Write snapshot with object content. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
+ const int kByteArrayLength = 256; |
+ InternalByteArray& byte_array = |
+ InternalByteArray::Handle(InternalByteArray::New(kByteArrayLength)); |
+ for (int i = 0; i < kByteArrayLength; i++) { |
+ byte_array.SetAt<uint8_t>(i, i); |
+ } |
+ writer.WriteObject(byte_array.raw()); |
+ writer.FinalizeBuffer(); |
+ |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ |
+ // Read object back from the snapshot. |
+ SnapshotReader reader(snapshot, Isolate::Current()); |
+ ByteArray& serialized_byte_array = ByteArray::Handle(); |
+ serialized_byte_array ^= reader.ReadObject(); |
+ EXPECT(serialized_byte_array.IsByteArray()); |
+ |
+ // Read object back from the snapshot into a C structure. |
+ ApiNativeScope scope; |
+ Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &zone_allocator); |
+ EXPECT_EQ(Dart_CObject::kByteArray, root->type); |
+ EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); |
+ for (int i = 0; i < kByteArrayLength; i++) { |
+ EXPECT(root->value.as_byte_array.values[i] == i); |
+ } |
+ CheckEncodeDecodeMessage(root); |
+} |
+ |
+ |
+TEST_CASE(SerializeEmptyByteArray) { |
+ Zone zone(Isolate::Current()); |
+ |
+ // Write snapshot with object content. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
+ const int kByteArrayLength = 0; |
+ InternalByteArray& byte_array = |
+ InternalByteArray::Handle(InternalByteArray::New(kByteArrayLength)); |
+ writer.WriteObject(byte_array.raw()); |
+ writer.FinalizeBuffer(); |
+ |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ |
+ // Read object back from the snapshot. |
+ SnapshotReader reader(snapshot, Isolate::Current()); |
+ ByteArray& serialized_byte_array = ByteArray::Handle(); |
+ serialized_byte_array ^= reader.ReadObject(); |
+ EXPECT(serialized_byte_array.IsByteArray()); |
+ |
+ // Read object back from the snapshot into a C structure. |
+ ApiNativeScope scope; |
+ Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &zone_allocator); |
+ EXPECT_EQ(Dart_CObject::kByteArray, root->type); |
+ EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); |
+ EXPECT(root->value.as_byte_array.values == NULL); |
+ CheckEncodeDecodeMessage(root); |
+} |
+ |
+ |
TEST_CASE(SerializeScript) { |
const char* kScriptChars = |
"class A {\n" |
@@ -1057,6 +1136,12 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
" for (var i = 0; i < kArrayLength; i++) list[i] = d;\n" |
" return list;\n" |
"}\n" |
+ "getByteArrayList() {\n" |
+ " var byte_array = new ByteArray(256);\n" |
+ " var list = new List<ByteArray>(kArrayLength);\n" |
+ " for (var i = 0; i < kArrayLength; i++) list[i] = byte_array;\n" |
+ " return list;\n" |
+ "}\n" |
"getMixedList() {\n" |
" var list = new List(kArrayLength);\n" |
" for (var i = 0; i < kArrayLength; i++) {\n" |
@@ -1112,6 +1197,20 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
} |
} |
{ |
+ // Generate a list of doubles from Dart code. |
+ ApiNativeScope scope; |
+ Dart_CObject* root = GetDeserializedDartMessage(lib, "getByteArrayList"); |
+ EXPECT_NOTNULL(root); |
+ EXPECT_EQ(Dart_CObject::kArray, root->type); |
+ EXPECT_EQ(kArrayLength, root->value.as_array.length); |
+ for (int i = 0; i < kArrayLength; i++) { |
+ Dart_CObject* element = root->value.as_array.values[i]; |
+ EXPECT_EQ(root->value.as_array.values[0], element); |
+ EXPECT_EQ(Dart_CObject::kByteArray, element->type); |
+ EXPECT_EQ(256, element->value.as_byte_array.length); |
+ } |
+ } |
+ { |
// Generate a list of objects of different types from Dart code. |
ApiNativeScope scope; |
Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |