Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index 6a829883b6799a56d4433f38f42c8fb72f078558..aaeec0aa2e944020241914a0691735cbdf3c3fbb 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -80,6 +80,9 @@ static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
case Dart_CObject::kInt32: |
EXPECT_EQ(first->value.as_int32, second->value.as_int32); |
break; |
+ case Dart_CObject::kInt64: |
+ EXPECT_EQ(first->value.as_int64, second->value.as_int64); |
+ break; |
case Dart_CObject::kDouble: |
EXPECT_EQ(first->value.as_double, second->value.as_double); |
break; |
@@ -213,6 +216,76 @@ TEST_CASE(SerializeSmi2) { |
} |
+Dart_CObject* SerializeAndDeserializeMint(const Mint& mint) { |
+ // Write snapshot with object content. |
+ uint8_t* buffer; |
+ SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
+ writer.WriteObject(mint.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()); |
+ const Object& serialized_object = Object::Handle(reader.ReadObject()); |
+ 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); |
+ EXPECT_NOTNULL(root); |
+ CheckEncodeDecodeMessage(root); |
+ return root; |
+} |
+ |
+ |
+void CheckMint(int64_t value) { |
+ Zone zone(Isolate::Current()); |
+ |
+ const Mint& mint = Mint::Handle(Mint::New(value)); |
+ ApiNativeScope scope; |
+ Dart_CObject* mint_cobject = SerializeAndDeserializeMint(mint); |
+ // On 64-bit platforms mints always require 64-bits as the smi range |
+ // here covers most of the 64-bit range. On 32-bit platforms the smi |
+ // range covers most of the 32-bit range and values outside that |
+ // range are also represented as mints. |
+#if defined(ARCH_IS_64_BIT) |
+ EXPECT_EQ(Dart_CObject::kInt64, mint_cobject->type); |
+ EXPECT_EQ(value, mint_cobject->value.as_int64); |
+#else |
+ if (kMinInt32 < value && value < kMaxInt32) { |
+ EXPECT_EQ(Dart_CObject::kInt32, mint_cobject->type); |
+ EXPECT_EQ(value, mint_cobject->value.as_int32); |
+ } else { |
+ EXPECT_EQ(Dart_CObject::kInt64, mint_cobject->type); |
+ EXPECT_EQ(value, mint_cobject->value.as_int64); |
+ } |
+#endif |
+} |
+ |
+ |
+TEST_CASE(SerializeMints) { |
+ // Min positive mint. |
+ CheckMint(Smi::kMaxValue + 1); |
+ // Min positive mint + 1. |
+ CheckMint(Smi::kMaxValue + 2); |
+ // Max negative mint. |
+ CheckMint(Smi::kMinValue - 1); |
+ // Max negative mint - 1. |
+ CheckMint(Smi::kMinValue - 2); |
+ // Max positive mint. |
+ CheckMint(kMaxInt64); |
+ // Max positive mint - 1. |
+ CheckMint(kMaxInt64 - 1); |
+ // Min negative mint. |
+ CheckMint(kMinInt64); |
+ // Min negative mint + 1. |
+ CheckMint(kMinInt64 + 1); |
+} |
+ |
+ |
TEST_CASE(SerializeDouble) { |
Zone zone(Isolate::Current()); |