Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index ce7f3f224381181852419369a28fe38c58483946..68df7d535fa566d73d630c954049aae81927830d 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -42,6 +42,15 @@ static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
} |
+static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { |
+ for (int i = 0; i < cmessage->allocated_length; i++) { |
+ free(cmessage->allocated[i]); |
+ } |
+ free(cmessage->original_message - Snapshot::kHeaderSize); |
+ free(cmessage); |
+} |
+ |
+ |
TEST_CASE(SerializeNull) { |
// Write snapshot with object content. |
uint8_t* buffer; |
@@ -59,13 +68,13 @@ TEST_CASE(SerializeNull) { |
EXPECT(Equals(null_object, serialized_object)); |
// Read object back from the snapshot into a C structure. |
siva
2012/02/01 01:48:36
If you start a Zone here and use a zone allocator
Søren Gjesse
2012/02/01 12:12:23
Agree. But I wanted to cover the case where the em
|
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -86,14 +95,14 @@ TEST_CASE(SerializeSmi1) { |
EXPECT(Equals(smi, serialized_object)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
siva
2012/02/01 01:48:36
Ditto comment here and below about not needing Fre
Søren Gjesse
2012/02/01 12:12:23
See above.
|
} |
@@ -114,14 +123,14 @@ TEST_CASE(SerializeSmi2) { |
EXPECT(Equals(smi, serialized_object)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -142,14 +151,14 @@ TEST_CASE(SerializeDouble) { |
EXPECT(Equals(dbl, serialized_object)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
EXPECT_EQ(dbl.value(), cobject->value.as_double); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -170,21 +179,54 @@ TEST_CASE(SerializeBool) { |
SnapshotReader reader(snapshot, Isolate::Current()); |
EXPECT(Bool::True() == reader.ReadObject()); |
EXPECT(Bool::False() == reader.ReadObject()); |
+} |
+ |
+ |
+TEST_CASE(SerializeTrue) { |
+ // Write snapshot with true object. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
+ const Bool& bl = Bool::Handle(Bool::True()); |
+ writer.WriteObject(bl.raw()); |
+ writer.FinalizeBuffer(); |
+ |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ USE(snapshot); |
siva
2012/02/01 01:48:36
Why not just Snapshot::SetupFromBuffer(buffer);
Søren Gjesse
2012/02/01 12:12:23
Done.
|
+ |
+ // Read object back from the snapshot into a C structure. |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
+ EXPECT_NOTNULL(cobject); |
+ EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
+ EXPECT_EQ(true, cobject->value.as_bool); |
+ FreeDeserializedDartMessage(cmessage); |
+} |
+ |
+ |
+TEST_CASE(SerializeFalse) { |
+ // Write snapshot with false object. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
+ const Bool& bl = Bool::Handle(Bool::False()); |
+ writer.WriteObject(bl.raw()); |
+ writer.FinalizeBuffer(); |
+ |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ USE(snapshot); |
siva
2012/02/01 01:48:36
Ditto.
Søren Gjesse
2012/02/01 12:12:23
Done.
|
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject1 = mreader.ReadObject(); |
- EXPECT_NOTNULL(cobject1); |
- EXPECT_EQ(Dart_CObject::kBool, cobject1->type); |
- EXPECT_EQ(true, cobject1->value.as_bool); |
- Dart_CObject* cobject2 = mreader.ReadObject(); |
- EXPECT_NOTNULL(cobject2); |
- EXPECT_EQ(Dart_CObject::kBool, cobject2->type); |
- EXPECT_EQ(false, cobject2->value.as_bool); |
- free(cobject1); |
- free(cobject2); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
+ EXPECT_NOTNULL(cobject); |
+ EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
+ EXPECT_EQ(false, cobject->value.as_bool); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -207,12 +249,13 @@ TEST_CASE(SerializeBigint) { |
EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
// Bigint not supported. |
EXPECT(cobject == NULL); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -287,13 +330,13 @@ TEST_CASE(SerializeString) { |
EXPECT(str.Equals(serialized_str)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_EQ(Dart_CObject::kString, cobject->type); |
EXPECT_STREQ(cstr, cobject->value.as_string); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -321,19 +364,18 @@ TEST_CASE(SerializeArray) { |
EXPECT(array.Equals(serialized_array)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
Dart_CObject* element = cobject->value.as_array.values[i]; |
EXPECT_EQ(Dart_CObject::kInt32, element->type); |
EXPECT_EQ(i, element->value.as_int32); |
- free(element); |
} |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -356,14 +398,14 @@ TEST_CASE(SerializeEmptyArray) { |
EXPECT(array.Equals(serialized_array)); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* cobject = mreader.ReadObject(); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
EXPECT(cobject->value.as_array.values == NULL); |
- free(cobject); |
+ FreeDeserializedDartMessage(cmessage); |
} |
@@ -654,26 +696,25 @@ TEST_CASE(IntArrayMessage) { |
writer.WriteMessage(len, data); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* value = mreader.ReadObject(); |
- EXPECT_EQ(Dart_CObject::kArray, value->type); |
- EXPECT_EQ(kArrayLength, value->value.as_array.length); |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ Dart_CObject* cobject = cmessage->object; |
+ EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
+ EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
- Dart_CObject* element = value->value.as_array.values[i]; |
+ Dart_CObject* element = cobject->value.as_array.values[i]; |
EXPECT_EQ(Dart_CObject::kInt32, element->type); |
EXPECT_EQ(i + 1, element->value.as_int32); |
- free(element); |
} |
- free(value); |
+ FreeDeserializedDartMessage(cmessage); |
} |
// Helper function to call a top level Dart function, serialize the |
// result and deserialize the result into a Dart_CObject structure. |
-static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, |
- const char* dart_function) { |
+static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, |
+ const char* dart_function) { |
Dart_Handle result; |
result = Dart_InvokeStatic(lib, |
Dart_NewString(""), |
@@ -690,12 +731,10 @@ static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, |
writer.FinalizeBuffer(); |
// Read object back from the snapshot into a C structure. |
- CMessageReader reader(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &allocator); |
- Dart_CObject* value = reader.ReadObject(); |
- free(buffer); |
- return value; |
+ Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
+ writer.BytesWritten(), |
+ &allocator); |
+ return cmessage; |
} |
@@ -747,15 +786,15 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
writer.FinalizeBuffer(); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
+ Dart_CMessage* cmessage = |
+ Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
writer.BytesWritten(), |
&allocator); |
- Dart_CObject* value = mreader.ReadObject(); |
- EXPECT_NOTNULL(value); |
- EXPECT_EQ(Dart_CObject::kInt32, value->type); |
- EXPECT_EQ(42, value->value.as_int32); |
- free(value); |
- free(buffer); |
+ Dart_CObject* cobject = cmessage->object; |
+ EXPECT_NOTNULL(cobject); |
+ EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
+ EXPECT_EQ(42, cobject->value.as_int32); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
uint8_t* buffer; |
@@ -766,15 +805,15 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
writer.FinalizeBuffer(); |
// Read object back from the snapshot into a C structure. |
- CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
+ Dart_CMessage* cmessage = |
+ Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
writer.BytesWritten(), |
&allocator); |
- Dart_CObject* value = mreader.ReadObject(); |
- EXPECT_NOTNULL(value); |
- EXPECT_EQ(Dart_CObject::kString, value->type); |
- EXPECT_STREQ("Hello, world!", value->value.as_string); |
- free(value); |
- free(buffer); |
+ Dart_CObject* cobject = cmessage->object; |
+ EXPECT_NOTNULL(cobject); |
+ EXPECT_EQ(Dart_CObject::kString, cobject->type); |
+ EXPECT_STREQ("Hello, world!", cobject->value.as_string); |
+ FreeDeserializedDartMessage(cmessage); |
} |
} |
Dart_ExitScope(); |
@@ -821,32 +860,34 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
{ |
// Generate a list of nulls from Dart code. |
- Dart_CObject* value = GetDeserializedDartObject(lib, "getList"); |
+ Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); |
+ Dart_CObject* value = cmessage->object; |
EXPECT_NOTNULL(value); |
EXPECT_EQ(Dart_CObject::kArray, value->type); |
EXPECT_EQ(kArrayLength, value->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
- free(value->value.as_array.values[i]); |
} |
- free(value); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of ints from Dart code. |
- Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList"); |
+ Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); |
+ Dart_CObject* value = cmessage->object; |
EXPECT_NOTNULL(value); |
EXPECT_EQ(Dart_CObject::kArray, value->type); |
EXPECT_EQ(kArrayLength, value->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
- free(value->value.as_array.values[i]); |
} |
- free(value); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of strings from Dart code. |
- Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList"); |
+ Dart_CMessage* cmessage = |
+ GetDeserializedDartMessage(lib, "getStringList"); |
+ Dart_CObject* value = cmessage->object; |
EXPECT_NOTNULL(value); |
EXPECT_EQ(Dart_CObject::kArray, value->type); |
EXPECT_EQ(kArrayLength, value->value.as_array.length); |
@@ -855,13 +896,13 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
char buffer[3]; |
snprintf(buffer, sizeof(buffer), "%d", i); |
EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
- free(value->value.as_array.values[i]); |
} |
- free(value); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of objects of different types from Dart code. |
- Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList"); |
+ Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
+ Dart_CObject* value = cmessage->object; |
EXPECT_NOTNULL(value); |
EXPECT_EQ(Dart_CObject::kArray, value->type); |
EXPECT_EQ(kArrayLength, value->value.as_array.length); |
@@ -879,9 +920,8 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
if (i > 3) { |
EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
} |
- free(value->value.as_array.values[i]); |
} |
- free(value); |
+ FreeDeserializedDartMessage(cmessage); |
} |
} |
Dart_ExitScope(); |
@@ -933,7 +973,9 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
{ |
// Generate a list of strings from Dart code. |
- Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList"); |
+ Dart_CMessage* cmessage = |
+ GetDeserializedDartMessage(lib, "getStringList"); |
+ Dart_CObject* object = cmessage->object; |
EXPECT_NOTNULL(object); |
EXPECT_EQ(Dart_CObject::kArray, object->type); |
EXPECT_EQ(kArrayLength, object->value.as_array.length); |
@@ -943,12 +985,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kString, element->type); |
EXPECT_STREQ("Hello, world!", element->value.as_string); |
} |
- free(object->value.as_array.values[0]); |
- free(object); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of doubles from Dart code. |
- Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList"); |
+ Dart_CMessage* cmessage = |
+ GetDeserializedDartMessage(lib, "getDoubleList"); |
+ Dart_CObject* object = cmessage->object; |
EXPECT_NOTNULL(object); |
EXPECT_EQ(Dart_CObject::kArray, object->type); |
EXPECT_EQ(kArrayLength, object->value.as_array.length); |
@@ -958,12 +1001,12 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kDouble, element->type); |
EXPECT_EQ(3.14, element->value.as_double); |
} |
- free(object->value.as_array.values[0]); |
- free(object); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of objects of different types from Dart code. |
- Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList"); |
+ Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
+ Dart_CObject* object = cmessage->object; |
EXPECT_NOTNULL(object); |
EXPECT_EQ(Dart_CObject::kArray, object->type); |
EXPECT_EQ(kArrayLength, object->value.as_array.length); |
@@ -979,13 +1022,13 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_STREQ(2.72, element->value.as_double); |
} |
} |
- free(object->value.as_array.values[0]); |
- free(object->value.as_array.values[1]); |
- free(object); |
+ FreeDeserializedDartMessage(cmessage); |
} |
{ |
// Generate a list of objects of different types from Dart code. |
- Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList"); |
+ Dart_CMessage* cmessage = |
+ GetDeserializedDartMessage(lib, "getSelfRefList"); |
+ Dart_CObject* object = cmessage->object; |
EXPECT_NOTNULL(object); |
EXPECT_EQ(Dart_CObject::kArray, object->type); |
EXPECT_EQ(kArrayLength, object->value.as_array.length); |
@@ -994,7 +1037,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kArray, element->type); |
EXPECT_EQ(object, element); |
} |
- free(object); |
+ FreeDeserializedDartMessage(cmessage); |
} |
} |
Dart_ExitScope(); |