| Index: runtime/vm/snapshot_test.cc
|
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
|
| index aaeec0aa2e944020241914a0691735cbdf3c3fbb..b24fe317c0636187c77f01ea17ce4ac4688b5099 100644
|
| --- a/runtime/vm/snapshot_test.cc
|
| +++ b/runtime/vm/snapshot_test.cc
|
| @@ -83,6 +83,9 @@ static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) {
|
| case Dart_CObject::kInt64:
|
| EXPECT_EQ(first->value.as_int64, second->value.as_int64);
|
| break;
|
| + case Dart_CObject::kBigint:
|
| + EXPECT_STREQ(first->value.as_bigint, second->value.as_bigint);
|
| + break;
|
| case Dart_CObject::kDouble:
|
| EXPECT_EQ(first->value.as_double, second->value.as_double);
|
| break;
|
| @@ -388,13 +391,18 @@ TEST_CASE(SerializeFalse) {
|
| }
|
|
|
|
|
| +static uword allocator(intptr_t size) {
|
| + return reinterpret_cast<uword>(malloc(size));
|
| +}
|
| +
|
| +
|
| TEST_CASE(SerializeBigint) {
|
| Zone zone(Isolate::Current());
|
|
|
| // Write snapshot with object content.
|
| uint8_t* buffer;
|
| SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| - const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL));
|
| + const Bigint& bigint = Bigint::Handle(Bigint::New(DART_INT64_C(0xfffffffff)));
|
| writer.WriteObject(bigint.raw());
|
| writer.FinalizeBuffer();
|
|
|
| @@ -405,7 +413,7 @@ TEST_CASE(SerializeBigint) {
|
| SnapshotReader reader(snapshot, Isolate::Current());
|
| Bigint& obj = Bigint::Handle();
|
| obj ^= reader.ReadObject();
|
| - OS::Print("%lld", BigintOperations::ToInt64(obj));
|
| +
|
| EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj));
|
|
|
| // Read object back from the snapshot into a C structure.
|
| @@ -414,7 +422,71 @@ TEST_CASE(SerializeBigint) {
|
| writer.BytesWritten(),
|
| &zone_allocator);
|
| // Bigint not supported.
|
| - EXPECT(root == NULL);
|
| + EXPECT_NOTNULL(root);
|
| + EXPECT_EQ(Dart_CObject::kBigint, root->type);
|
| + EXPECT_STREQ("FFFFFFFFF", root->value.as_bigint);
|
| + CheckEncodeDecodeMessage(root);
|
| +}
|
| +
|
| +
|
| +Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) {
|
| + // Write snapshot with object content.
|
| + uint8_t* buffer;
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| + writer.WriteObject(bigint.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());
|
| + Bigint& serialized_bigint = Bigint::Handle();
|
| + serialized_bigint ^= reader.ReadObject();
|
| + const char *str1 = BigintOperations::ToDecCString(bigint, allocator);
|
| + const char *str2 =
|
| + BigintOperations::ToDecCString(serialized_bigint, allocator);
|
| + EXPECT_STREQ(str1, str2);
|
| + free(const_cast<char*>(str1));
|
| + free(const_cast<char*>(str2));
|
| +
|
| + // Read object back from the snapshot into a C structure.
|
| + ApiNativeScope scope;
|
| + Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + // Bigint not supported.
|
| + EXPECT_NOTNULL(root);
|
| + CheckEncodeDecodeMessage(root);
|
| + return root;
|
| +}
|
| +
|
| +
|
| +void CheckBigint(const char* bigint_value) {
|
| + Zone zone(Isolate::Current());
|
| +
|
| + Bigint& bigint = Bigint::Handle();
|
| + bigint ^= BigintOperations::NewFromCString(bigint_value);
|
| + Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint);
|
| + EXPECT_EQ(Dart_CObject::kBigint, bigint_cobject->type);
|
| + if (bigint_value[0] == '0') {
|
| + EXPECT_STREQ(bigint_value + 2, bigint_cobject->value.as_bigint);
|
| + } else {
|
| + EXPECT_EQ('-', bigint_value[0]);
|
| + EXPECT_EQ('-', bigint_cobject->value.as_bigint[0]);
|
| + EXPECT_STREQ(bigint_value + 3, bigint_cobject->value.as_bigint + 1);
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST_CASE(SerializeBigint2) {
|
| + CheckBigint("0x0");
|
| + CheckBigint("0x1");
|
| + CheckBigint("-0x1");
|
| + CheckBigint("0x11111111111111111111");
|
| + CheckBigint("-0x11111111111111111111");
|
| + CheckBigint("0x9876543210987654321098765432109876543210");
|
| + CheckBigint("-0x9876543210987654321098765432109876543210");
|
| }
|
|
|
|
|
| @@ -1011,6 +1083,9 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| "getSmi() {\n"
|
| " return 42;\n"
|
| "}\n"
|
| + "getBigint() {\n"
|
| + " return -0x424242424242424242424242424242424242;\n"
|
| + "}\n"
|
| "getString() {\n"
|
| " return \"Hello, world!\";\n"
|
| "}\n"
|
| @@ -1033,6 +1108,13 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| 0,
|
| NULL);
|
| EXPECT_VALID(smi_result);
|
| + Dart_Handle bigint_result;
|
| + bigint_result = Dart_InvokeStatic(lib,
|
| + Dart_NewString(""),
|
| + Dart_NewString("getBigint"),
|
| + 0,
|
| + NULL);
|
| + EXPECT_VALID(bigint_result);
|
| Dart_Handle string_result;
|
| string_result = Dart_InvokeStatic(lib,
|
| Dart_NewString(""),
|
| @@ -1068,6 +1150,26 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| Zone zone(Isolate::Current());
|
| uint8_t* buffer;
|
| SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| + Bigint& bigint = Bigint::Handle();
|
| + bigint ^= Api::UnwrapHandle(bigint_result);
|
| + writer.WriteObject(bigint.raw());
|
| + writer.FinalizeBuffer();
|
| +
|
| + // Read object back from the snapshot into a C structure.
|
| + ApiNativeScope scope;
|
| + Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &zone_allocator);
|
| + EXPECT_NOTNULL(root);
|
| + EXPECT_EQ(Dart_CObject::kBigint, root->type);
|
| + EXPECT_STREQ("-424242424242424242424242424242424242",
|
| + root->value.as_bigint);
|
| + CheckEncodeDecodeMessage(root);
|
| + }
|
| + {
|
| + Zone zone(Isolate::Current());
|
| + uint8_t* buffer;
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator);
|
| String& str = String::Handle();
|
| str ^= Api::UnwrapHandle(string_result);
|
| writer.WriteObject(str.raw());
|
|
|