Index: runtime/vm/snapshot_test.cc |
=================================================================== |
--- runtime/vm/snapshot_test.cc (revision 10993) |
+++ runtime/vm/snapshot_test.cc (working copy) |
@@ -53,14 +53,6 @@ |
} |
-static Dart_CObject* DecodeMessage(uint8_t* message, |
- intptr_t length, |
- ReAlloc allocator) { |
- ApiMessageReader message_reader(message, length, allocator); |
- return message_reader.ReadMessage(); |
-} |
- |
- |
// Compare two Dart_CObject object graphs rooted in first and |
// second. The second graph will be destroyed by this operation no matter |
// whether the graphs are equal or not. |
@@ -120,12 +112,15 @@ |
// Encode and decode the message. |
uint8_t* buffer = NULL; |
ApiMessageWriter writer(&buffer, &malloc_allocator); |
- writer.WriteCMessage(root); |
+ intptr_t buffer_len = writer.WriteCMessage(root); |
- Dart_CObject* new_root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* new_root = api_reader.ReadMessage(); |
+ |
// Check that the two messages are the same. |
CompareDartCObjects(root, new_root); |
} |
@@ -138,10 +133,11 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Object& null_object = Object::Handle(); |
writer.WriteObject(null_object.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -150,9 +146,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kNull, root->type); |
CheckEncodeDecodeMessage(root); |
@@ -167,10 +162,11 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Smi& smi = Smi::Handle(Smi::New(124)); |
writer.WriteObject(smi.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -179,9 +175,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kInt32, root->type); |
EXPECT_EQ(smi.Value(), root->value.as_int32); |
@@ -197,10 +192,11 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Smi& smi = Smi::Handle(Smi::New(-1)); |
writer.WriteObject(smi.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -209,9 +205,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kInt32, root->type); |
EXPECT_EQ(smi.Value(), root->value.as_int32); |
@@ -224,10 +219,11 @@ |
uint8_t* buffer; |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
writer.WriteObject(mint.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -235,9 +231,8 @@ |
EXPECT(serialized_object.IsMint()); |
// Read object back from the snapshot into a C structure. |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
CheckEncodeDecodeMessage(root); |
return root; |
@@ -297,10 +292,11 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Double& dbl = Double::Handle(Double::New(101.29)); |
writer.WriteObject(dbl.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -309,9 +305,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kDouble, root->type); |
EXPECT_EQ(dbl.value(), root->value.as_double); |
@@ -329,10 +324,11 @@ |
const Bool& bool2 = Bool::Handle(Bool::False()); |
writer.WriteObject(bool1.raw()); |
writer.WriteObject(bool2.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -349,16 +345,16 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Bool& bl = Bool::Handle(Bool::True()); |
writer.WriteObject(bl.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kBool, root->type); |
EXPECT_EQ(true, root->value.as_bool); |
@@ -374,16 +370,16 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Bool& bl = Bool::Handle(Bool::False()); |
writer.WriteObject(bl.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kBool, root->type); |
EXPECT_EQ(false, root->value.as_bool); |
@@ -404,10 +400,11 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Bigint& bigint = Bigint::Handle(Bigint::New(DART_INT64_C(0xfffffffff))); |
writer.WriteObject(bigint.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -418,9 +415,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
// Bigint not supported. |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kBigint, root->type); |
@@ -434,10 +430,11 @@ |
uint8_t* buffer; |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
writer.WriteObject(bigint.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -452,9 +449,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
// Bigint not supported. |
EXPECT_NOTNULL(root); |
CheckEncodeDecodeMessage(root); |
@@ -511,10 +507,11 @@ |
writer.WriteObject(Object::exception_handlers_class()); |
writer.WriteObject(Object::context_class()); |
writer.WriteObject(Object::context_scope_class()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -549,10 +546,11 @@ |
static const char* cstr = "This string shall be serialized"; |
String& str = String::Handle(String::New(cstr)); |
writer.WriteObject(str.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -562,9 +560,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kString, root->type); |
EXPECT_STREQ(cstr, root->value.as_string); |
CheckEncodeDecodeMessage(root); |
@@ -585,10 +582,11 @@ |
array.SetAt(i, smi); |
} |
writer.WriteObject(array.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -598,9 +596,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kArray, root->type); |
EXPECT_EQ(kArrayLength, root->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
@@ -621,10 +618,11 @@ |
const int kArrayLength = 0; |
Array& array = Array::Handle(Array::New(kArrayLength)); |
writer.WriteObject(array.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -634,9 +632,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kArray, root->type); |
EXPECT_EQ(kArrayLength, root->value.as_array.length); |
EXPECT(root->value.as_array.values == NULL); |
@@ -657,10 +654,11 @@ |
byte_array.SetAt(i, i); |
} |
writer.WriteObject(byte_array.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -670,9 +668,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kUint8Array, root->type); |
EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); |
for (int i = 0; i < kByteArrayLength; i++) { |
@@ -692,10 +689,11 @@ |
Uint8Array& byte_array = |
Uint8Array::Handle(Uint8Array::New(kByteArrayLength)); |
writer.WriteObject(byte_array.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -705,9 +703,8 @@ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kUint8Array, root->type); |
EXPECT_EQ(kByteArrayLength, root->value.as_byte_array.length); |
EXPECT(root->value.as_byte_array.values == NULL); |
@@ -715,6 +712,49 @@ |
} |
+TEST_CASE(IllegalSnapshot_LengthMismatch) { |
+ Zone zone(Isolate::Current()); |
+ |
+ // Write snapshot with object content. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
+ const Object& null_object = Object::Handle(); |
+ writer.WriteObject(null_object.raw()); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
+ |
+ // Create a snapshot object using the wrong buffer length. |
+ const Snapshot* snapshot = |
+ Snapshot::SetupFromBuffer(buffer, buffer_len + sizeof(int32_t)); |
+ EXPECT(snapshot == NULL); |
+ |
+ snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+} |
+ |
+ |
+TEST_CASE(IllegalSnapshot_TooShort) { |
+ Zone zone(Isolate::Current()); |
+ |
+ // Write snapshot with object content. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
+ const Object& null_object = Object::Handle(); |
+ writer.WriteObject(null_object.raw()); |
+ writer.FinalizeBuffer(); |
+ |
+ // Give the message an illegal size. |
+ intptr_t snapshot_address = reinterpret_cast<intptr_t>(buffer); |
+ intptr_t length_address = snapshot_address + Snapshot::length_offset(); |
+ int32_t* len_ptr = reinterpret_cast<int32_t*>(length_address); |
+ *len_ptr = sizeof(int32_t); |
+ |
+ // Check that SetupFromBuffer returns NULL because the buffer length |
+ // is too short to possibly be valid. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, sizeof(int32_t)); |
+ EXPECT(snapshot == NULL); |
+} |
+ |
+ |
TEST_CASE(SerializeScript) { |
const char* kScriptChars = |
"class A {\n" |
@@ -740,10 +780,11 @@ |
uint8_t* buffer; |
SnapshotWriter writer(Snapshot::kScript, &buffer, &malloc_allocator); |
writer.WriteObject(script.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
// Create a snapshot object using the buffer. |
- const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
// Read object back from the snapshot. |
SnapshotReader reader(snapshot, Isolate::Current()); |
@@ -1060,13 +1101,16 @@ |
static const int kArrayLength = 2; |
intptr_t data[kArrayLength] = {1, 2}; |
int len = kArrayLength; |
- writer.WriteMessage(len, data); |
+ intptr_t buffer_len = writer.WriteMessage(len, data); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_EQ(Dart_CObject::kArray, root->type); |
EXPECT_EQ(kArrayLength, root->value.as_array.length); |
for (int i = 0; i < kArrayLength; i++) { |
@@ -1091,12 +1135,15 @@ |
SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
writer.WriteObject(list.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ |
// Read object back from the snapshot into a C structure. |
- return DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ return api_reader.ReadMessage(); |
} |
@@ -1144,13 +1191,16 @@ |
Smi& smi = Smi::Handle(); |
smi ^= Api::UnwrapHandle(smi_result); |
writer.WriteObject(smi.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kInt32, root->type); |
EXPECT_EQ(42, root->value.as_int32); |
@@ -1163,13 +1213,16 @@ |
Bigint& bigint = Bigint::Handle(); |
bigint ^= Api::UnwrapHandle(bigint_result); |
writer.WriteObject(bigint.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kBigint, root->type); |
EXPECT_STREQ("-424242424242424242424242424242424242", |
@@ -1183,13 +1236,16 @@ |
String& str = String::Handle(); |
str ^= Api::UnwrapHandle(string_result); |
writer.WriteObject(str.raw()); |
- writer.FinalizeBuffer(); |
+ intptr_t buffer_len = writer.FinalizeBuffer(); |
+ // Create a snapshot object using the buffer. |
+ const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer, buffer_len); |
+ EXPECT_NOTNULL(snapshot); |
+ |
// Read object back from the snapshot into a C structure. |
ApiNativeScope scope; |
- Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
- writer.BytesWritten(), |
- &zone_allocator); |
+ ApiMessageReader api_reader(snapshot, &zone_allocator); |
+ Dart_CObject* root = api_reader.ReadMessage(); |
EXPECT_NOTNULL(root); |
EXPECT_EQ(Dart_CObject::kString, root->type); |
EXPECT_STREQ("Hello, world!", root->value.as_string); |