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/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/bigint_operations.h" | 6 #include "vm/bigint_operations.h" |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
10 #include "vm/snapshot.h" | 10 #include "vm/snapshot.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 // Read object back from the snapshot. | 56 // Read object back from the snapshot. |
57 SnapshotReader reader(snapshot, Isolate::Current()); | 57 SnapshotReader reader(snapshot, Isolate::Current()); |
58 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 58 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
59 EXPECT(Equals(null_object, serialized_object)); | 59 EXPECT(Equals(null_object, serialized_object)); |
60 | 60 |
61 // Read object back from the snapshot into a C structure. | 61 // Read object back from the snapshot into a C structure. |
62 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 62 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
63 writer.BytesWritten(), | 63 writer.BytesWritten(), |
64 &allocator); | 64 &allocator); |
65 Dart_CObject* cobject = mreader.ReadObject(); | 65 Dart_CObject* cobject = mreader.ReadObject(); |
| 66 EXPECT_NOTNULL(cobject); |
66 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 67 EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
67 free(cobject); | 68 free(cobject); |
68 } | 69 } |
69 | 70 |
70 | 71 |
71 TEST_CASE(SerializeSmi1) { | 72 TEST_CASE(SerializeSmi1) { |
72 // Write snapshot with object content. | 73 // Write snapshot with object content. |
73 uint8_t* buffer; | 74 uint8_t* buffer; |
74 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 75 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
75 const Smi& smi = Smi::Handle(Smi::New(124)); | 76 const Smi& smi = Smi::Handle(Smi::New(124)); |
76 writer.WriteObject(smi.raw()); | 77 writer.WriteObject(smi.raw()); |
77 writer.FinalizeBuffer(); | 78 writer.FinalizeBuffer(); |
78 | 79 |
79 // Create a snapshot object using the buffer. | 80 // Create a snapshot object using the buffer. |
80 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 81 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
81 | 82 |
82 // Read object back from the snapshot. | 83 // Read object back from the snapshot. |
83 SnapshotReader reader(snapshot, Isolate::Current()); | 84 SnapshotReader reader(snapshot, Isolate::Current()); |
84 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 85 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
85 EXPECT(Equals(smi, serialized_object)); | 86 EXPECT(Equals(smi, serialized_object)); |
86 | 87 |
87 // Read object back from the snapshot into a C structure. | 88 // Read object back from the snapshot into a C structure. |
88 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 89 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
89 writer.BytesWritten(), | 90 writer.BytesWritten(), |
90 &allocator); | 91 &allocator); |
91 Dart_CObject* cobject = mreader.ReadObject(); | 92 Dart_CObject* cobject = mreader.ReadObject(); |
| 93 EXPECT_NOTNULL(cobject); |
92 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 94 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
93 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 95 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
94 free(cobject); | 96 free(cobject); |
95 } | 97 } |
96 | 98 |
97 | 99 |
98 TEST_CASE(SerializeSmi2) { | 100 TEST_CASE(SerializeSmi2) { |
99 // Write snapshot with object content. | 101 // Write snapshot with object content. |
100 uint8_t* buffer; | 102 uint8_t* buffer; |
101 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 103 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
102 const Smi& smi = Smi::Handle(Smi::New(-1)); | 104 const Smi& smi = Smi::Handle(Smi::New(-1)); |
103 writer.WriteObject(smi.raw()); | 105 writer.WriteObject(smi.raw()); |
104 writer.FinalizeBuffer(); | 106 writer.FinalizeBuffer(); |
105 | 107 |
106 // Create a snapshot object using the buffer. | 108 // Create a snapshot object using the buffer. |
107 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 109 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
108 | 110 |
109 // Read object back from the snapshot. | 111 // Read object back from the snapshot. |
110 SnapshotReader reader(snapshot, Isolate::Current()); | 112 SnapshotReader reader(snapshot, Isolate::Current()); |
111 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 113 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
112 EXPECT(Equals(smi, serialized_object)); | 114 EXPECT(Equals(smi, serialized_object)); |
113 | 115 |
114 // Read object back from the snapshot into a C structure. | 116 // Read object back from the snapshot into a C structure. |
115 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 117 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
116 writer.BytesWritten(), | 118 writer.BytesWritten(), |
117 &allocator); | 119 &allocator); |
118 Dart_CObject* cobject = mreader.ReadObject(); | 120 Dart_CObject* cobject = mreader.ReadObject(); |
| 121 EXPECT_NOTNULL(cobject); |
119 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 122 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
120 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 123 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
121 free(cobject); | 124 free(cobject); |
122 } | 125 } |
123 | 126 |
124 | 127 |
125 TEST_CASE(SerializeDouble) { | 128 TEST_CASE(SerializeDouble) { |
126 // Write snapshot with object content. | 129 // Write snapshot with object content. |
127 uint8_t* buffer; | 130 uint8_t* buffer; |
128 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 131 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
129 const Double& dbl = Double::Handle(Double::New(101.29)); | 132 const Double& dbl = Double::Handle(Double::New(101.29)); |
130 writer.WriteObject(dbl.raw()); | 133 writer.WriteObject(dbl.raw()); |
131 writer.FinalizeBuffer(); | 134 writer.FinalizeBuffer(); |
132 | 135 |
133 // Create a snapshot object using the buffer. | 136 // Create a snapshot object using the buffer. |
134 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 137 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
135 | 138 |
136 // Read object back from the snapshot. | 139 // Read object back from the snapshot. |
137 SnapshotReader reader(snapshot, Isolate::Current()); | 140 SnapshotReader reader(snapshot, Isolate::Current()); |
138 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 141 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
139 EXPECT(Equals(dbl, serialized_object)); | 142 EXPECT(Equals(dbl, serialized_object)); |
140 | 143 |
141 // Read object back from the snapshot into a C structure. | 144 // Read object back from the snapshot into a C structure. |
142 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 145 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
143 writer.BytesWritten(), | 146 writer.BytesWritten(), |
144 &allocator); | 147 &allocator); |
145 Dart_CObject* cobject = mreader.ReadObject(); | 148 Dart_CObject* cobject = mreader.ReadObject(); |
| 149 EXPECT_NOTNULL(cobject); |
146 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 150 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
147 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 151 EXPECT_EQ(dbl.value(), cobject->value.as_double); |
148 free(cobject); | 152 free(cobject); |
149 } | 153 } |
150 | 154 |
151 | 155 |
152 TEST_CASE(SerializeBool) { | 156 TEST_CASE(SerializeBool) { |
153 // Write snapshot with object content. | 157 // Write snapshot with object content. |
154 uint8_t* buffer; | 158 uint8_t* buffer; |
155 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 159 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
156 const Bool& bool1 = Bool::Handle(Bool::True()); | 160 const Bool& bool1 = Bool::Handle(Bool::True()); |
157 const Bool& bool2 = Bool::Handle(Bool::False()); | 161 const Bool& bool2 = Bool::Handle(Bool::False()); |
158 writer.WriteObject(bool1.raw()); | 162 writer.WriteObject(bool1.raw()); |
159 writer.WriteObject(bool2.raw()); | 163 writer.WriteObject(bool2.raw()); |
160 writer.FinalizeBuffer(); | 164 writer.FinalizeBuffer(); |
161 | 165 |
162 // Create a snapshot object using the buffer. | 166 // Create a snapshot object using the buffer. |
163 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 167 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
164 | 168 |
165 // Read object back from the snapshot. | 169 // Read object back from the snapshot. |
166 SnapshotReader reader(snapshot, Isolate::Current()); | 170 SnapshotReader reader(snapshot, Isolate::Current()); |
167 EXPECT(Bool::True() == reader.ReadObject()); | 171 EXPECT(Bool::True() == reader.ReadObject()); |
168 EXPECT(Bool::False() == reader.ReadObject()); | 172 EXPECT(Bool::False() == reader.ReadObject()); |
169 | 173 |
170 // Read object back from the snapshot into a C structure. | 174 // Read object back from the snapshot into a C structure. |
171 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 175 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
172 writer.BytesWritten(), | 176 writer.BytesWritten(), |
173 &allocator); | 177 &allocator); |
174 Dart_CObject* cobject1 = mreader.ReadObject(); | 178 Dart_CObject* cobject1 = mreader.ReadObject(); |
| 179 EXPECT_NOTNULL(cobject1); |
175 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); | 180 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); |
176 EXPECT_EQ(true, cobject1->value.as_bool); | 181 EXPECT_EQ(true, cobject1->value.as_bool); |
177 Dart_CObject* cobject2 = mreader.ReadObject(); | 182 Dart_CObject* cobject2 = mreader.ReadObject(); |
| 183 EXPECT_NOTNULL(cobject2); |
178 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); | 184 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); |
179 EXPECT_EQ(false, cobject2->value.as_bool); | 185 EXPECT_EQ(false, cobject2->value.as_bool); |
180 free(cobject1); | 186 free(cobject1); |
181 free(cobject2); | 187 free(cobject2); |
182 } | 188 } |
183 | 189 |
184 | 190 |
185 TEST_CASE(SerializeBigint) { | 191 TEST_CASE(SerializeBigint) { |
186 // Write snapshot with object content. | 192 // Write snapshot with object content. |
187 uint8_t* buffer; | 193 uint8_t* buffer; |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 for (int i = 0; i < kArrayLength; i++) { | 663 for (int i = 0; i < kArrayLength; i++) { |
658 Dart_CObject* element = value->value.as_array.values[i]; | 664 Dart_CObject* element = value->value.as_array.values[i]; |
659 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 665 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
660 EXPECT_EQ(i + 1, element->value.as_int32); | 666 EXPECT_EQ(i + 1, element->value.as_int32); |
661 free(element); | 667 free(element); |
662 } | 668 } |
663 free(value); | 669 free(value); |
664 } | 670 } |
665 | 671 |
666 | 672 |
| 673 // Helper function to call a top level Dart function, serialize the |
| 674 // result and deserialize the result into a Dart_CObject structure. |
| 675 static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, |
| 676 const char* dart_function) { |
| 677 Dart_Handle result; |
| 678 result = Dart_InvokeStatic(lib, |
| 679 Dart_NewString(""), |
| 680 Dart_NewString(dart_function), |
| 681 0, |
| 682 NULL); |
| 683 EXPECT_VALID(result); |
| 684 |
| 685 // Serialize the list into a message. |
| 686 uint8_t* buffer; |
| 687 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 688 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| 689 writer.WriteObject(list.raw()); |
| 690 writer.FinalizeBuffer(); |
| 691 |
| 692 // Read object back from the snapshot into a C structure. |
| 693 CMessageReader reader(buffer + Snapshot::kHeaderSize, |
| 694 writer.BytesWritten(), |
| 695 &allocator); |
| 696 Dart_CObject* value = reader.ReadObject(); |
| 697 free(buffer); |
| 698 return value; |
| 699 } |
| 700 |
| 701 |
667 UNIT_TEST_CASE(DartGeneratedMessages) { | 702 UNIT_TEST_CASE(DartGeneratedMessages) { |
668 const int kArrayLength = 10; | |
669 static const char* kCustomIsolateScriptChars = | 703 static const char* kCustomIsolateScriptChars = |
670 "getSmi() {\n" | 704 "getSmi() {\n" |
671 " return 42;\n" | 705 " return 42;\n" |
672 "}\n" | 706 "}\n" |
673 "getString() {\n" | 707 "getString() {\n" |
674 " return \"Hello, world!\";\n" | 708 " return \"Hello, world!\";\n" |
675 "}\n" | 709 "}\n" |
676 "getList() {\n" | 710 "getList() {\n" |
677 " return [1,2,3,4,5,6,7,8,9,10];\n" | 711 " return new List(kArrayLength);\n" |
678 "}\n"; | 712 "}\n"; |
679 | 713 |
680 TestCase::CreateTestIsolate(); | 714 TestCase::CreateTestIsolate(); |
681 Isolate* isolate = Isolate::Current(); | 715 Isolate* isolate = Isolate::Current(); |
682 EXPECT(isolate != NULL); | 716 EXPECT(isolate != NULL); |
683 Dart_EnterScope(); | 717 Dart_EnterScope(); |
684 | 718 |
685 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, | 719 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, |
686 NULL); | 720 NULL); |
687 EXPECT_VALID(lib); | 721 EXPECT_VALID(lib); |
688 Dart_Handle smi_result; | 722 Dart_Handle smi_result; |
689 smi_result = Dart_InvokeStatic(lib, | 723 smi_result = Dart_InvokeStatic(lib, |
690 Dart_NewString(""), | 724 Dart_NewString(""), |
691 Dart_NewString("getSmi"), | 725 Dart_NewString("getSmi"), |
692 0, | 726 0, |
693 NULL); | 727 NULL); |
694 EXPECT_VALID(smi_result); | 728 EXPECT_VALID(smi_result); |
695 Dart_Handle string_result; | 729 Dart_Handle string_result; |
696 string_result = Dart_InvokeStatic(lib, | 730 string_result = Dart_InvokeStatic(lib, |
697 Dart_NewString(""), | 731 Dart_NewString(""), |
698 Dart_NewString("getString"), | 732 Dart_NewString("getString"), |
699 0, | 733 0, |
700 NULL); | 734 NULL); |
701 EXPECT_VALID(string_result); | 735 EXPECT_VALID(string_result); |
702 EXPECT(Dart_IsString(string_result)); | 736 EXPECT(Dart_IsString(string_result)); |
703 Dart_Handle list_result; | 737 |
704 list_result = Dart_InvokeStatic(lib, | |
705 Dart_NewString(""), | |
706 Dart_NewString("getList"), | |
707 0, | |
708 NULL); | |
709 EXPECT_VALID(list_result); | |
710 EXPECT(Dart_IsList(list_result)); | |
711 intptr_t result_len = 0; | |
712 EXPECT_VALID(Dart_ListLength(list_result, &result_len)); | |
713 EXPECT_EQ(kArrayLength, result_len); | |
714 { | 738 { |
715 DARTSCOPE_NOCHECKS(isolate); | 739 DARTSCOPE_NOCHECKS(isolate); |
716 | 740 |
717 { | 741 { |
718 uint8_t* buffer; | 742 uint8_t* buffer; |
719 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 743 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
720 Smi& smi = Smi::Handle(); | 744 Smi& smi = Smi::Handle(); |
721 smi ^= Api::UnwrapHandle(smi_result); | 745 smi ^= Api::UnwrapHandle(smi_result); |
722 writer.WriteObject(smi.raw()); | 746 writer.WriteObject(smi.raw()); |
723 writer.FinalizeBuffer(); | 747 writer.FinalizeBuffer(); |
724 | 748 |
725 // Read object back from the snapshot into a C structure. | 749 // Read object back from the snapshot into a C structure. |
726 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 750 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
727 writer.BytesWritten(), | 751 writer.BytesWritten(), |
728 &allocator); | 752 &allocator); |
729 Dart_CObject* value = mreader.ReadObject(); | 753 Dart_CObject* value = mreader.ReadObject(); |
| 754 EXPECT_NOTNULL(value); |
730 EXPECT_EQ(Dart_CObject::kInt32, value->type); | 755 EXPECT_EQ(Dart_CObject::kInt32, value->type); |
731 EXPECT_EQ(42, value->value.as_int32); | 756 EXPECT_EQ(42, value->value.as_int32); |
732 free(value); | 757 free(value); |
733 free(buffer); | 758 free(buffer); |
734 } | 759 } |
735 { | 760 { |
736 uint8_t* buffer; | 761 uint8_t* buffer; |
737 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 762 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
738 String& str = String::Handle(); | 763 String& str = String::Handle(); |
739 str ^= Api::UnwrapHandle(string_result); | 764 str ^= Api::UnwrapHandle(string_result); |
740 writer.WriteObject(str.raw()); | 765 writer.WriteObject(str.raw()); |
741 writer.FinalizeBuffer(); | 766 writer.FinalizeBuffer(); |
742 | 767 |
743 // Read object back from the snapshot into a C structure. | 768 // Read object back from the snapshot into a C structure. |
744 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 769 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
745 writer.BytesWritten(), | 770 writer.BytesWritten(), |
746 &allocator); | 771 &allocator); |
747 Dart_CObject* value = mreader.ReadObject(); | 772 Dart_CObject* value = mreader.ReadObject(); |
| 773 EXPECT_NOTNULL(value); |
748 EXPECT_EQ(Dart_CObject::kString, value->type); | 774 EXPECT_EQ(Dart_CObject::kString, value->type); |
749 EXPECT_STREQ("Hello, world!", value->value.as_string); | 775 EXPECT_STREQ("Hello, world!", value->value.as_string); |
750 free(value); | 776 free(value); |
751 free(buffer); | 777 free(buffer); |
752 } | 778 } |
| 779 } |
| 780 Dart_ExitScope(); |
| 781 Dart_ShutdownIsolate(); |
| 782 } |
| 783 |
| 784 |
| 785 UNIT_TEST_CASE(DartGeneratedListMessages) { |
| 786 const int kArrayLength = 10; |
| 787 static const char* kScriptChars = |
| 788 "final int kArrayLength = 10;\n" |
| 789 "getList() {\n" |
| 790 " return new List(kArrayLength);\n" |
| 791 "}\n" |
| 792 "getIntList() {\n" |
| 793 " var list = new List<int>(kArrayLength);\n" |
| 794 " for (var i = 0; i < kArrayLength; i++) list[i] = i;\n" |
| 795 " return list;\n" |
| 796 "}\n" |
| 797 "getStringList() {\n" |
| 798 " var list = new List<String>(kArrayLength);\n" |
| 799 " for (var i = 0; i < kArrayLength; i++) list[i] = i.toString();\n" |
| 800 " return list;\n" |
| 801 "}\n" |
| 802 "getMixedList() {\n" |
| 803 " var list = new List(kArrayLength);\n" |
| 804 " list[0] = 0;\n" |
| 805 " list[1] = '1';\n" |
| 806 " list[2] = 2.2;\n" |
| 807 " list[3] = true;\n" |
| 808 " return list;\n" |
| 809 "}\n"; |
| 810 |
| 811 TestCase::CreateTestIsolate(); |
| 812 Isolate* isolate = Isolate::Current(); |
| 813 EXPECT(isolate != NULL); |
| 814 Dart_EnterScope(); |
| 815 |
| 816 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 817 EXPECT_VALID(lib); |
| 818 |
| 819 { |
| 820 DARTSCOPE_NOCHECKS(isolate); |
| 821 |
753 { | 822 { |
754 uint8_t* buffer; | 823 // Generate a list of nulls from Dart code. |
755 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 824 Dart_CObject* value = GetDeserializedDartObject(lib, "getList"); |
756 const Object& list = Object::Handle(Api::UnwrapHandle(list_result)); | 825 EXPECT_NOTNULL(value); |
757 writer.WriteObject(list.raw()); | 826 EXPECT_EQ(Dart_CObject::kArray, value->type); |
758 writer.FinalizeBuffer(); | 827 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
759 // TODO(sgjesse): Make this work! | 828 for (int i = 0; i < kArrayLength; i++) { |
760 free(buffer); | 829 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 830 free(value->value.as_array.values[i]); |
| 831 } |
| 832 free(value); |
| 833 } |
| 834 { |
| 835 // Generate a list of ints from Dart code. |
| 836 Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList"); |
| 837 EXPECT_NOTNULL(value); |
| 838 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 839 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 840 for (int i = 0; i < kArrayLength; i++) { |
| 841 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
| 842 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
| 843 free(value->value.as_array.values[i]); |
| 844 } |
| 845 free(value); |
| 846 } |
| 847 { |
| 848 // Generate a list of strings from Dart code. |
| 849 Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList"); |
| 850 EXPECT_NOTNULL(value); |
| 851 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 852 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 853 for (int i = 0; i < kArrayLength; i++) { |
| 854 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); |
| 855 char buffer[3]; |
| 856 snprintf(buffer, sizeof(buffer), "%d", i); |
| 857 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
| 858 free(value->value.as_array.values[i]); |
| 859 } |
| 860 free(value); |
| 861 } |
| 862 { |
| 863 // Generate a list of objects of different types from Dart code. |
| 864 Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList"); |
| 865 EXPECT_NOTNULL(value); |
| 866 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 867 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 868 |
| 869 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); |
| 870 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); |
| 871 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); |
| 872 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); |
| 873 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); |
| 874 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); |
| 875 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); |
| 876 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); |
| 877 |
| 878 for (int i = 0; i < kArrayLength; i++) { |
| 879 if (i > 3) { |
| 880 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 881 } |
| 882 free(value->value.as_array.values[i]); |
| 883 } |
| 884 free(value); |
761 } | 885 } |
762 } | 886 } |
763 Dart_ExitScope(); | 887 Dart_ExitScope(); |
764 Dart_ShutdownIsolate(); | 888 Dart_ShutdownIsolate(); |
765 } | 889 } |
766 | 890 |
767 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 891 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
768 | 892 |
769 } // namespace dart | 893 } // namespace dart |
OLD | NEW |