OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
6 | 6 |
7 #include "include/dart_debugger_api.h" | 7 #include "include/dart_debugger_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/bigint_operations.h" | |
10 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
11 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
12 #include "vm/dart_api_message.h" | 11 #include "vm/dart_api_message.h" |
13 #include "vm/dart_api_state.h" | 12 #include "vm/dart_api_state.h" |
14 #include "vm/flags.h" | 13 #include "vm/flags.h" |
15 #include "vm/snapshot.h" | 14 #include "vm/snapshot.h" |
16 #include "vm/symbols.h" | 15 #include "vm/symbols.h" |
17 #include "vm/unicode.h" | 16 #include "vm/unicode.h" |
18 #include "vm/unit_test.h" | 17 #include "vm/unit_test.h" |
19 | 18 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 break; | 79 break; |
81 case Dart_CObject_kBool: | 80 case Dart_CObject_kBool: |
82 EXPECT_EQ(first->value.as_bool, second->value.as_bool); | 81 EXPECT_EQ(first->value.as_bool, second->value.as_bool); |
83 break; | 82 break; |
84 case Dart_CObject_kInt32: | 83 case Dart_CObject_kInt32: |
85 EXPECT_EQ(first->value.as_int32, second->value.as_int32); | 84 EXPECT_EQ(first->value.as_int32, second->value.as_int32); |
86 break; | 85 break; |
87 case Dart_CObject_kInt64: | 86 case Dart_CObject_kInt64: |
88 EXPECT_EQ(first->value.as_int64, second->value.as_int64); | 87 EXPECT_EQ(first->value.as_int64, second->value.as_int64); |
89 break; | 88 break; |
90 case Dart_CObject_kBigint: | 89 case Dart_CObject_kBigint: { |
91 EXPECT_STREQ(first->value.as_bigint, second->value.as_bigint); | 90 char* first_hex_value = TestCase::BigintToHexValue(first); |
| 91 char* second_hex_value = TestCase::BigintToHexValue(second); |
| 92 EXPECT_STREQ(first_hex_value, second_hex_value); |
| 93 free(first_hex_value); |
| 94 free(second_hex_value); |
92 break; | 95 break; |
| 96 } |
93 case Dart_CObject_kDouble: | 97 case Dart_CObject_kDouble: |
94 EXPECT_EQ(first->value.as_double, second->value.as_double); | 98 EXPECT_EQ(first->value.as_double, second->value.as_double); |
95 break; | 99 break; |
96 case Dart_CObject_kString: | 100 case Dart_CObject_kString: |
97 EXPECT_STREQ(first->value.as_string, second->value.as_string); | 101 EXPECT_STREQ(first->value.as_string, second->value.as_string); |
98 break; | 102 break; |
99 case Dart_CObject_kTypedData: | 103 case Dart_CObject_kTypedData: |
100 EXPECT_EQ(first->value.as_typed_data.length, | 104 EXPECT_EQ(first->value.as_typed_data.length, |
101 second->value.as_typed_data.length); | 105 second->value.as_typed_data.length); |
102 for (int i = 0; i < first->value.as_typed_data.length; i++) { | 106 for (int i = 0; i < first->value.as_typed_data.length; i++) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 bigint ^= Integer::NewCanonical(str); | 394 bigint ^= Integer::NewCanonical(str); |
391 writer.WriteMessage(bigint); | 395 writer.WriteMessage(bigint); |
392 intptr_t buffer_len = writer.BytesWritten(); | 396 intptr_t buffer_len = writer.BytesWritten(); |
393 | 397 |
394 // Read object back from the snapshot. | 398 // Read object back from the snapshot. |
395 SnapshotReader reader(buffer, buffer_len, | 399 SnapshotReader reader(buffer, buffer_len, |
396 Snapshot::kMessage, Isolate::Current()); | 400 Snapshot::kMessage, Isolate::Current()); |
397 Bigint& obj = Bigint::Handle(); | 401 Bigint& obj = Bigint::Handle(); |
398 obj ^= reader.ReadObject(); | 402 obj ^= reader.ReadObject(); |
399 | 403 |
400 EXPECT_STREQ(BigintOperations::ToHexCString(bigint, &allocator), | 404 EXPECT_STREQ(bigint.ToHexCString(allocator), obj.ToHexCString(allocator)); |
401 BigintOperations::ToHexCString(obj, &allocator)); | |
402 | 405 |
403 // Read object back from the snapshot into a C structure. | 406 // Read object back from the snapshot into a C structure. |
404 ApiNativeScope scope; | 407 ApiNativeScope scope; |
405 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | 408 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
406 Dart_CObject* root = api_reader.ReadMessage(); | 409 Dart_CObject* root = api_reader.ReadMessage(); |
407 // Bigint not supported. | |
408 EXPECT_NOTNULL(root); | 410 EXPECT_NOTNULL(root); |
409 EXPECT_EQ(Dart_CObject_kBigint, root->type); | 411 EXPECT_EQ(Dart_CObject_kBigint, root->type); |
410 EXPECT_STREQ("270FFFFFFFFFFFFFD8F0", root->value.as_bigint); | 412 char* hex_value = TestCase::BigintToHexValue(root); |
| 413 EXPECT_STREQ(cstr, hex_value); |
| 414 free(hex_value); |
411 CheckEncodeDecodeMessage(root); | 415 CheckEncodeDecodeMessage(root); |
412 } | 416 } |
413 | 417 |
414 | 418 |
415 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { | 419 Dart_CObject* SerializeAndDeserializeBigint(const Bigint& bigint) { |
416 // Write snapshot with object content. | 420 // Write snapshot with object content. |
417 uint8_t* buffer; | 421 uint8_t* buffer; |
418 MessageWriter writer(&buffer, &zone_allocator); | 422 MessageWriter writer(&buffer, &zone_allocator); |
419 writer.WriteMessage(bigint); | 423 writer.WriteMessage(bigint); |
420 intptr_t buffer_len = writer.BytesWritten(); | 424 intptr_t buffer_len = writer.BytesWritten(); |
421 | 425 |
422 // Read object back from the snapshot. | 426 // Read object back from the snapshot. |
423 SnapshotReader reader(buffer, buffer_len, | 427 SnapshotReader reader(buffer, buffer_len, |
424 Snapshot::kMessage, Isolate::Current()); | 428 Snapshot::kMessage, Isolate::Current()); |
425 Bigint& serialized_bigint = Bigint::Handle(); | 429 Bigint& serialized_bigint = Bigint::Handle(); |
426 serialized_bigint ^= reader.ReadObject(); | 430 serialized_bigint ^= reader.ReadObject(); |
427 const char* str1 = BigintOperations::ToHexCString(bigint, allocator); | 431 const char* str1 = bigint.ToHexCString(allocator); |
428 const char* str2 = | 432 const char* str2 = serialized_bigint.ToHexCString(allocator); |
429 BigintOperations::ToHexCString(serialized_bigint, allocator); | |
430 EXPECT_STREQ(str1, str2); | 433 EXPECT_STREQ(str1, str2); |
431 free(const_cast<char*>(str1)); | 434 free(const_cast<char*>(str1)); |
432 free(const_cast<char*>(str2)); | 435 free(const_cast<char*>(str2)); |
433 | 436 |
434 // Read object back from the snapshot into a C structure. | 437 // Read object back from the snapshot into a C structure. |
435 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | 438 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
436 Dart_CObject* root = api_reader.ReadMessage(); | 439 Dart_CObject* root = api_reader.ReadMessage(); |
437 // Bigint not supported. | 440 // Bigint not supported. |
438 EXPECT_NOTNULL(root); | 441 EXPECT_NOTNULL(root); |
439 CheckEncodeDecodeMessage(root); | 442 CheckEncodeDecodeMessage(root); |
440 return root; | 443 return root; |
441 } | 444 } |
442 | 445 |
443 | 446 |
444 void CheckBigint(const char* bigint_value) { | 447 void CheckBigint(const char* bigint_value) { |
445 StackZone zone(Isolate::Current()); | 448 StackZone zone(Isolate::Current()); |
446 ApiNativeScope scope; | 449 ApiNativeScope scope; |
447 | 450 |
448 Bigint& bigint = Bigint::Handle(); | 451 Bigint& bigint = Bigint::Handle(); |
449 bigint ^= BigintOperations::NewFromCString(bigint_value); | 452 bigint ^= Bigint::NewFromCString(bigint_value); |
450 Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint); | 453 Dart_CObject* bigint_cobject = SerializeAndDeserializeBigint(bigint); |
451 EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type); | 454 EXPECT_EQ(Dart_CObject_kBigint, bigint_cobject->type); |
452 if (bigint_value[0] == '0') { | 455 char* hex_value = TestCase::BigintToHexValue(bigint_cobject); |
453 EXPECT_STREQ(bigint_value + 2, bigint_cobject->value.as_bigint); | 456 EXPECT_STREQ(bigint_value, hex_value); |
454 } else { | 457 free(hex_value); |
455 EXPECT_EQ('-', bigint_value[0]); | |
456 EXPECT_EQ('-', bigint_cobject->value.as_bigint[0]); | |
457 EXPECT_STREQ(bigint_value + 3, bigint_cobject->value.as_bigint + 1); | |
458 } | |
459 } | 458 } |
460 | 459 |
461 | 460 |
462 TEST_CASE(SerializeBigint2) { | 461 TEST_CASE(SerializeBigint2) { |
463 CheckBigint("0x0"); | 462 CheckBigint("0x0"); |
464 CheckBigint("0x1"); | 463 CheckBigint("0x1"); |
465 CheckBigint("-0x1"); | 464 CheckBigint("-0x1"); |
466 CheckBigint("0x11111111111111111111"); | 465 CheckBigint("0x11111111111111111111"); |
467 CheckBigint("-0x11111111111111111111"); | 466 CheckBigint("-0x11111111111111111111"); |
468 CheckBigint("0x9876543210987654321098765432109876543210"); | 467 CheckBigint("0x9876543210987654321098765432109876543210"); |
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 bigint ^= Api::UnwrapHandle(bigint_result); | 1630 bigint ^= Api::UnwrapHandle(bigint_result); |
1632 writer.WriteMessage(bigint); | 1631 writer.WriteMessage(bigint); |
1633 intptr_t buffer_len = writer.BytesWritten(); | 1632 intptr_t buffer_len = writer.BytesWritten(); |
1634 | 1633 |
1635 // Read object back from the snapshot into a C structure. | 1634 // Read object back from the snapshot into a C structure. |
1636 ApiNativeScope scope; | 1635 ApiNativeScope scope; |
1637 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | 1636 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
1638 Dart_CObject* root = api_reader.ReadMessage(); | 1637 Dart_CObject* root = api_reader.ReadMessage(); |
1639 EXPECT_NOTNULL(root); | 1638 EXPECT_NOTNULL(root); |
1640 EXPECT_EQ(Dart_CObject_kBigint, root->type); | 1639 EXPECT_EQ(Dart_CObject_kBigint, root->type); |
1641 EXPECT_STREQ("-424242424242424242424242424242424242", | 1640 char* hex_value = TestCase::BigintToHexValue(root); |
1642 root->value.as_bigint); | 1641 EXPECT_STREQ("-0x424242424242424242424242424242424242", hex_value); |
| 1642 free(hex_value); |
1643 CheckEncodeDecodeMessage(root); | 1643 CheckEncodeDecodeMessage(root); |
1644 } | 1644 } |
1645 CheckString(ascii_string_result, "Hello, world!"); | 1645 CheckString(ascii_string_result, "Hello, world!"); |
1646 CheckString(non_ascii_string_result, "Blåbærgrød"); | 1646 CheckString(non_ascii_string_result, "Blåbærgrød"); |
1647 CheckString(non_bmp_string_result, | 1647 CheckString(non_bmp_string_result, |
1648 "\xf0\x90\x80\x80" | 1648 "\xf0\x90\x80\x80" |
1649 "\xf0\x9f\x98\x81" | 1649 "\xf0\x9f\x98\x81" |
1650 "\xf0\x9f\x98\xb7" | 1650 "\xf0\x9f\x98\xb7" |
1651 "\xf0\xa0\x80\x80"); | 1651 "\xf0\xa0\x80\x80"); |
1652 CheckStringInvalid(lead_surrogate_string_result); | 1652 CheckStringInvalid(lead_surrogate_string_result); |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2078 // Generate a list of bigints from Dart code. | 2078 // Generate a list of bigints from Dart code. |
2079 ApiNativeScope scope; | 2079 ApiNativeScope scope; |
2080 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); | 2080 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
2081 EXPECT_NOTNULL(root); | 2081 EXPECT_NOTNULL(root); |
2082 EXPECT_EQ(Dart_CObject_kArray, root->type); | 2082 EXPECT_EQ(Dart_CObject_kArray, root->type); |
2083 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 2083 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
2084 for (int i = 0; i < kArrayLength; i++) { | 2084 for (int i = 0; i < kArrayLength; i++) { |
2085 Dart_CObject* element = root->value.as_array.values[i]; | 2085 Dart_CObject* element = root->value.as_array.values[i]; |
2086 EXPECT_EQ(root->value.as_array.values[0], element); | 2086 EXPECT_EQ(root->value.as_array.values[0], element); |
2087 EXPECT_EQ(Dart_CObject_kBigint, element->type); | 2087 EXPECT_EQ(Dart_CObject_kBigint, element->type); |
2088 EXPECT_STREQ("1234567890123456789012345678901234567890", | 2088 char* hex_value = TestCase::BigintToHexValue(element); |
2089 element->value.as_bigint); | 2089 EXPECT_STREQ("0x1234567890123456789012345678901234567890", hex_value); |
| 2090 free(hex_value); |
2090 } | 2091 } |
2091 } | 2092 } |
2092 { | 2093 { |
2093 // Generate a list of doubles from Dart code. | 2094 // Generate a list of doubles from Dart code. |
2094 ApiNativeScope scope; | 2095 ApiNativeScope scope; |
2095 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); | 2096 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
2096 EXPECT_NOTNULL(root); | 2097 EXPECT_NOTNULL(root); |
2097 EXPECT_EQ(Dart_CObject_kArray, root->type); | 2098 EXPECT_EQ(Dart_CObject_kArray, root->type); |
2098 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 2099 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
2099 Dart_CObject* element = root->value.as_array.values[0]; | 2100 Dart_CObject* element = root->value.as_array.values[0]; |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2293 // Generate a list of bigints from Dart code. | 2294 // Generate a list of bigints from Dart code. |
2294 ApiNativeScope scope; | 2295 ApiNativeScope scope; |
2295 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); | 2296 Dart_CObject* root = GetDeserializedDartMessage(lib, "getBigintList"); |
2296 EXPECT_NOTNULL(root); | 2297 EXPECT_NOTNULL(root); |
2297 EXPECT_EQ(Dart_CObject_kArray, root->type); | 2298 EXPECT_EQ(Dart_CObject_kArray, root->type); |
2298 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 2299 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
2299 for (int i = 0; i < kArrayLength; i++) { | 2300 for (int i = 0; i < kArrayLength; i++) { |
2300 Dart_CObject* element = root->value.as_array.values[i]; | 2301 Dart_CObject* element = root->value.as_array.values[i]; |
2301 EXPECT_EQ(root->value.as_array.values[0], element); | 2302 EXPECT_EQ(root->value.as_array.values[0], element); |
2302 EXPECT_EQ(Dart_CObject_kBigint, element->type); | 2303 EXPECT_EQ(Dart_CObject_kBigint, element->type); |
2303 EXPECT_STREQ("1234567890123456789012345678901234567890", | 2304 char* hex_value = TestCase::BigintToHexValue(element); |
2304 element->value.as_bigint); | 2305 EXPECT_STREQ("0x1234567890123456789012345678901234567890", hex_value); |
| 2306 free(hex_value); |
2305 } | 2307 } |
2306 } | 2308 } |
2307 { | 2309 { |
2308 // Generate a list of doubles from Dart code. | 2310 // Generate a list of doubles from Dart code. |
2309 ApiNativeScope scope; | 2311 ApiNativeScope scope; |
2310 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); | 2312 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
2311 EXPECT_NOTNULL(root); | 2313 EXPECT_NOTNULL(root); |
2312 EXPECT_EQ(Dart_CObject_kArray, root->type); | 2314 EXPECT_EQ(Dart_CObject_kArray, root->type); |
2313 EXPECT_EQ(kArrayLength, root->value.as_array.length); | 2315 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
2314 Dart_CObject* element = root->value.as_array.values[0]; | 2316 Dart_CObject* element = root->value.as_array.values[0]; |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2724 StackZone zone(Isolate::Current()); | 2726 StackZone zone(Isolate::Current()); |
2725 uint8_t* buffer; | 2727 uint8_t* buffer; |
2726 MessageWriter writer(&buffer, &zone_allocator); | 2728 MessageWriter writer(&buffer, &zone_allocator); |
2727 writer.WriteInlinedObjectHeader(kOmittedObjectId); | 2729 writer.WriteInlinedObjectHeader(kOmittedObjectId); |
2728 // For performance, we'd like single-byte headers when ids are omitted. | 2730 // For performance, we'd like single-byte headers when ids are omitted. |
2729 // If this starts failing, consider renumbering the snapshot ids. | 2731 // If this starts failing, consider renumbering the snapshot ids. |
2730 EXPECT_EQ(1, writer.BytesWritten()); | 2732 EXPECT_EQ(1, writer.BytesWritten()); |
2731 } | 2733 } |
2732 | 2734 |
2733 } // namespace dart | 2735 } // namespace dart |
OLD | NEW |