Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2114)

Unified Diff: runtime/vm/snapshot_test.cc

Issue 10829444: Avoid trusting the length encoded in the Snapshot if there is an (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« runtime/vm/isolate.cc ('K') | « runtime/vm/snapshot.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« runtime/vm/isolate.cc ('K') | « runtime/vm/snapshot.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698