| Index: runtime/vm/snapshot_test.cc
|
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
|
| index 2cd08d5c5a0cef93b80028c67c40a412e122b59b..bb8fe8f453b77df7d54c81a3a0224886e960173a 100644
|
| --- a/runtime/vm/snapshot_test.cc
|
| +++ b/runtime/vm/snapshot_test.cc
|
| @@ -38,15 +38,34 @@ static bool Equals(const Object& expected, const Object& actual) {
|
| }
|
|
|
|
|
| -static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
|
| +static uint8_t* malloc_allocator(
|
| + uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
|
| return reinterpret_cast<uint8_t*>(realloc(ptr, new_size));
|
| }
|
|
|
|
|
| +static uint8_t* zone_allocator(
|
| + uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
|
| + Zone* zone = Isolate::Current()->current_zone();
|
| + return reinterpret_cast<uint8_t*>(
|
| + zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size));
|
| +}
|
| +
|
| +
|
| +static Dart_CMessage* DecodeMessage(uint8_t* message,
|
| + intptr_t length,
|
| + ReAlloc allocator) {
|
| + CMessageReader message_reader(message, length, allocator);
|
| + return message_reader.ReadMessage();
|
| +}
|
| +
|
| +
|
| TEST_CASE(SerializeNull) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Object& null_object = Object::Handle();
|
| writer.WriteObject(null_object.raw());
|
| writer.FinalizeBuffer();
|
| @@ -60,20 +79,21 @@ TEST_CASE(SerializeNull) {
|
| EXPECT(Equals(null_object, 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kNull, cobject->type);
|
| - free(cobject);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeSmi1) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Smi& smi = Smi::Handle(Smi::New(124));
|
| writer.WriteObject(smi.raw());
|
| writer.FinalizeBuffer();
|
| @@ -87,21 +107,22 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
|
| EXPECT_EQ(smi.Value(), cobject->value.as_int32);
|
| - free(cobject);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeSmi2) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Smi& smi = Smi::Handle(Smi::New(-1));
|
| writer.WriteObject(smi.raw());
|
| writer.FinalizeBuffer();
|
| @@ -115,21 +136,22 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
|
| EXPECT_EQ(smi.Value(), cobject->value.as_int32);
|
| - free(cobject);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeDouble) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Double& dbl = Double::Handle(Double::New(101.29));
|
| writer.WriteObject(dbl.raw());
|
| writer.FinalizeBuffer();
|
| @@ -143,21 +165,22 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kDouble, cobject->type);
|
| EXPECT_EQ(dbl.value(), cobject->value.as_double);
|
| - free(cobject);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeBool) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Bool& bool1 = Bool::Handle(Bool::True());
|
| const Bool& bool2 = Bool::Handle(Bool::False());
|
| writer.WriteObject(bool1.raw());
|
| @@ -171,28 +194,63 @@ TEST_CASE(SerializeBool) {
|
| SnapshotReader reader(snapshot, Isolate::Current());
|
| EXPECT(Bool::True() == reader.ReadObject());
|
| EXPECT(Bool::False() == reader.ReadObject());
|
| +}
|
| +
|
| +
|
| +TEST_CASE(SerializeTrue) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| + // Write snapshot with true object.
|
| + uint8_t* buffer;
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| + const Bool& bl = Bool::Handle(Bool::True());
|
| + writer.WriteObject(bl.raw());
|
| + writer.FinalizeBuffer();
|
| +
|
| + // Create a snapshot object using the buffer.
|
| + Snapshot::SetupFromBuffer(buffer);
|
|
|
| // 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| + EXPECT_NOTNULL(cobject);
|
| + EXPECT_EQ(Dart_CObject::kBool, cobject->type);
|
| + EXPECT_EQ(true, cobject->value.as_bool);
|
| +}
|
| +
|
| +
|
| +TEST_CASE(SerializeFalse) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| + // Write snapshot with false object.
|
| + uint8_t* buffer;
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| + const Bool& bl = Bool::Handle(Bool::False());
|
| + writer.WriteObject(bl.raw());
|
| + writer.FinalizeBuffer();
|
| +
|
| + // Create a snapshot object using the buffer.
|
| + Snapshot::SetupFromBuffer(buffer);
|
| +
|
| + // Read object back from the snapshot into a C structure.
|
| + Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| + EXPECT_NOTNULL(cobject);
|
| + EXPECT_EQ(Dart_CObject::kBool, cobject->type);
|
| + EXPECT_EQ(false, cobject->value.as_bool);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeBigint) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL));
|
| writer.WriteObject(bigint.raw());
|
| writer.FinalizeBuffer();
|
| @@ -208,10 +266,10 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| // Bigint not supported.
|
| EXPECT(cobject == NULL);
|
| }
|
| @@ -220,7 +278,7 @@ TEST_CASE(SerializeBigint) {
|
| TEST_CASE(SerializeSingletons) {
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &malloc_allocator);
|
| writer.WriteObject(Object::class_class());
|
| writer.WriteObject(Object::null_class());
|
| writer.WriteObject(Object::type_class());
|
| @@ -266,13 +324,17 @@ TEST_CASE(SerializeSingletons) {
|
| EXPECT(Object::exception_handlers_class() == reader.ReadObject());
|
| EXPECT(Object::context_class() == reader.ReadObject());
|
| EXPECT(Object::context_scope_class() == reader.ReadObject());
|
| +
|
| + free(buffer);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeString) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| static const char* cstr = "This string shall be serialized";
|
| String& str = String::Handle(String::New(cstr));
|
| writer.WriteObject(str.raw());
|
| @@ -288,20 +350,21 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_EQ(Dart_CObject::kString, cobject->type);
|
| EXPECT_STREQ(cstr, cobject->value.as_string);
|
| - free(cobject);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeArray) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const int kArrayLength = 10;
|
| Array& array = Array::Handle(Array::New(kArrayLength));
|
| Smi& smi = Smi::Handle();
|
| @@ -322,26 +385,26 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| 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);
|
| }
|
|
|
|
|
| TEST_CASE(SerializeEmptyArray) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const int kArrayLength = 0;
|
| Array& array = Array::Handle(Array::New(kArrayLength));
|
| writer.WriteObject(array.raw());
|
| @@ -357,14 +420,13 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| EXPECT_EQ(Dart_CObject::kArray, cobject->type);
|
| EXPECT_EQ(kArrayLength, cobject->value.as_array.length);
|
| EXPECT(cobject->value.as_array.values == NULL);
|
| - free(cobject);
|
| }
|
|
|
|
|
| @@ -385,7 +447,7 @@ TEST_CASE(SerializeScript) {
|
|
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kScript, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kScript, &buffer, &malloc_allocator);
|
| writer.WriteObject(script.raw());
|
| writer.FinalizeBuffer();
|
|
|
| @@ -415,6 +477,8 @@ TEST_CASE(SerializeScript) {
|
| actual_literal ^= serialized_tokens.LiteralAt(i);
|
| EXPECT(expected_literal.Equals(actual_literal));
|
| }
|
| +
|
| + free(buffer);
|
| }
|
|
|
|
|
| @@ -454,7 +518,7 @@ UNIT_TEST_CASE(FullSnapshot) {
|
| Isolate* isolate = Isolate::Current();
|
| Zone zone(isolate);
|
| HandleScope scope(isolate);
|
| - SnapshotWriter writer(Snapshot::kFull, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator);
|
| writer.WriteFullSnapshot();
|
| }
|
|
|
| @@ -510,7 +574,7 @@ UNIT_TEST_CASE(FullSnapshot1) {
|
| OS::PrintErr("Without Snapshot: %dus\n", timer1.TotalElapsedTime());
|
|
|
| // Write snapshot with object content.
|
| - SnapshotWriter writer(Snapshot::kFull, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kFull, &buffer, &malloc_allocator);
|
| writer.WriteFullSnapshot();
|
|
|
| // Invoke a function which returns an object.
|
| @@ -674,8 +738,9 @@ UNIT_TEST_CASE(ScriptSnapshot) {
|
|
|
|
|
| TEST_CASE(IntArrayMessage) {
|
| + Zone zone(Isolate::Current());
|
| uint8_t* buffer = NULL;
|
| - MessageWriter writer(&buffer, &allocator);
|
| + MessageWriter writer(&buffer, &zone_allocator);
|
|
|
| static const int kArrayLength = 2;
|
| intptr_t data[kArrayLength] = {1, 2};
|
| @@ -683,26 +748,24 @@ 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| + 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);
|
| }
|
|
|
|
|
| // 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(""),
|
| @@ -713,18 +776,16 @@ static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib,
|
|
|
| // Serialize the list into a message.
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| const Object& list = Object::Handle(Api::UnwrapHandle(result));
|
| writer.WriteObject(list.raw());
|
| 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 = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + return cmessage;
|
| }
|
|
|
|
|
| @@ -768,42 +829,40 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| DARTSCOPE_NOCHECKS(isolate);
|
|
|
| {
|
| + Zone zone(Isolate::Current());
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| Smi& smi = Smi::Handle();
|
| smi ^= Api::UnwrapHandle(smi_result);
|
| writer.WriteObject(smi.raw());
|
| writer.FinalizeBuffer();
|
|
|
| // Read object back from the snapshot into a C structure.
|
| - CMessageReader mreader(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_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| + EXPECT_NOTNULL(cobject);
|
| + EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
|
| + EXPECT_EQ(42, cobject->value.as_int32);
|
| }
|
| {
|
| + Zone zone(Isolate::Current());
|
| uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| String& str = String::Handle();
|
| str ^= Api::UnwrapHandle(string_result);
|
| writer.WriteObject(str.raw());
|
| writer.FinalizeBuffer();
|
|
|
| // Read object back from the snapshot into a C structure.
|
| - CMessageReader mreader(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_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + Dart_CObject* cobject = cmessage->root;
|
| + EXPECT_NOTNULL(cobject);
|
| + EXPECT_EQ(Dart_CObject::kString, cobject->type);
|
| + EXPECT_STREQ("Hello, world!", cobject->value.as_string);
|
| }
|
| }
|
| Dart_ExitScope();
|
| @@ -850,32 +909,35 @@ UNIT_TEST_CASE(DartGeneratedListMessages) {
|
|
|
| {
|
| // Generate a list of nulls from Dart code.
|
| - Dart_CObject* value = GetDeserializedDartObject(lib, "getList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList");
|
| + Dart_CObject* value = cmessage->root;
|
| 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);
|
| }
|
| {
|
| // Generate a list of ints from Dart code.
|
| - Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList");
|
| + Dart_CObject* value = cmessage->root;
|
| 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);
|
| }
|
| {
|
| // Generate a list of strings from Dart code.
|
| - Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage =
|
| + GetDeserializedDartMessage(lib, "getStringList");
|
| + Dart_CObject* value = cmessage->root;
|
| EXPECT_NOTNULL(value);
|
| EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| @@ -884,13 +946,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);
|
| }
|
| {
|
| // Generate a list of objects of different types from Dart code.
|
| - Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList");
|
| + Dart_CObject* value = cmessage->root;
|
| EXPECT_NOTNULL(value);
|
| EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| @@ -908,9 +970,7 @@ 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);
|
| }
|
| }
|
| Dart_ExitScope();
|
| @@ -962,7 +1022,10 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
|
|
|
| {
|
| // Generate a list of strings from Dart code.
|
| - Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage =
|
| + GetDeserializedDartMessage(lib, "getStringList");
|
| + Dart_CObject* object = cmessage->root;
|
| EXPECT_NOTNULL(object);
|
| EXPECT_EQ(Dart_CObject::kArray, object->type);
|
| EXPECT_EQ(kArrayLength, object->value.as_array.length);
|
| @@ -972,12 +1035,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);
|
| }
|
| {
|
| // Generate a list of doubles from Dart code.
|
| - Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage =
|
| + GetDeserializedDartMessage(lib, "getDoubleList");
|
| + Dart_CObject* object = cmessage->root;
|
| EXPECT_NOTNULL(object);
|
| EXPECT_EQ(Dart_CObject::kArray, object->type);
|
| EXPECT_EQ(kArrayLength, object->value.as_array.length);
|
| @@ -987,12 +1051,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);
|
| }
|
| {
|
| // Generate a list of objects of different types from Dart code.
|
| - Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList");
|
| + Dart_CObject* object = cmessage->root;
|
| EXPECT_NOTNULL(object);
|
| EXPECT_EQ(Dart_CObject::kArray, object->type);
|
| EXPECT_EQ(kArrayLength, object->value.as_array.length);
|
| @@ -1008,13 +1072,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);
|
| }
|
| {
|
| // Generate a list of objects of different types from Dart code.
|
| - Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList");
|
| + Zone zone(Isolate::Current());
|
| + Dart_CMessage* cmessage =
|
| + GetDeserializedDartMessage(lib, "getSelfRefList");
|
| + Dart_CObject* object = cmessage->root;
|
| EXPECT_NOTNULL(object);
|
| EXPECT_EQ(Dart_CObject::kArray, object->type);
|
| EXPECT_EQ(kArrayLength, object->value.as_array.length);
|
| @@ -1023,7 +1087,6 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) {
|
| EXPECT_EQ(Dart_CObject::kArray, element->type);
|
| EXPECT_EQ(object, element);
|
| }
|
| - free(object);
|
| }
|
| }
|
| Dart_ExitScope();
|
|
|