| 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_api_state.h" | 10 #include "vm/dart_api_state.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 // Read object back from the snapshot. | 57 // Read object back from the snapshot. |
| 58 SnapshotReader reader(snapshot, Isolate::Current()); | 58 SnapshotReader reader(snapshot, Isolate::Current()); |
| 59 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 59 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 60 EXPECT(Equals(null_object, serialized_object)); | 60 EXPECT(Equals(null_object, serialized_object)); |
| 61 | 61 |
| 62 // Read object back from the snapshot into a C structure. | 62 // Read object back from the snapshot into a C structure. |
| 63 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 63 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 64 writer.BytesWritten(), | 64 writer.BytesWritten(), |
| 65 &allocator); | 65 &allocator); |
| 66 Dart_CObject* cobject = mreader.ReadObject(); | 66 Dart_CObject* cobject = mreader.ReadObject(); |
| 67 EXPECT_NOTNULL(cobject); |
| 67 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 68 EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
| 68 free(cobject); | 69 free(cobject); |
| 69 } | 70 } |
| 70 | 71 |
| 71 | 72 |
| 72 TEST_CASE(SerializeSmi1) { | 73 TEST_CASE(SerializeSmi1) { |
| 73 // Write snapshot with object content. | 74 // Write snapshot with object content. |
| 74 uint8_t* buffer; | 75 uint8_t* buffer; |
| 75 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 76 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 76 const Smi& smi = Smi::Handle(Smi::New(124)); | 77 const Smi& smi = Smi::Handle(Smi::New(124)); |
| 77 writer.WriteObject(smi.raw()); | 78 writer.WriteObject(smi.raw()); |
| 78 writer.FinalizeBuffer(); | 79 writer.FinalizeBuffer(); |
| 79 | 80 |
| 80 // Create a snapshot object using the buffer. | 81 // Create a snapshot object using the buffer. |
| 81 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 82 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 82 | 83 |
| 83 // Read object back from the snapshot. | 84 // Read object back from the snapshot. |
| 84 SnapshotReader reader(snapshot, Isolate::Current()); | 85 SnapshotReader reader(snapshot, Isolate::Current()); |
| 85 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 86 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 86 EXPECT(Equals(smi, serialized_object)); | 87 EXPECT(Equals(smi, serialized_object)); |
| 87 | 88 |
| 88 // Read object back from the snapshot into a C structure. | 89 // Read object back from the snapshot into a C structure. |
| 89 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 90 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 90 writer.BytesWritten(), | 91 writer.BytesWritten(), |
| 91 &allocator); | 92 &allocator); |
| 92 Dart_CObject* cobject = mreader.ReadObject(); | 93 Dart_CObject* cobject = mreader.ReadObject(); |
| 94 EXPECT_NOTNULL(cobject); |
| 93 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 95 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
| 94 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 96 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 95 free(cobject); | 97 free(cobject); |
| 96 } | 98 } |
| 97 | 99 |
| 98 | 100 |
| 99 TEST_CASE(SerializeSmi2) { | 101 TEST_CASE(SerializeSmi2) { |
| 100 // Write snapshot with object content. | 102 // Write snapshot with object content. |
| 101 uint8_t* buffer; | 103 uint8_t* buffer; |
| 102 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 104 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 103 const Smi& smi = Smi::Handle(Smi::New(-1)); | 105 const Smi& smi = Smi::Handle(Smi::New(-1)); |
| 104 writer.WriteObject(smi.raw()); | 106 writer.WriteObject(smi.raw()); |
| 105 writer.FinalizeBuffer(); | 107 writer.FinalizeBuffer(); |
| 106 | 108 |
| 107 // Create a snapshot object using the buffer. | 109 // Create a snapshot object using the buffer. |
| 108 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 110 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 109 | 111 |
| 110 // Read object back from the snapshot. | 112 // Read object back from the snapshot. |
| 111 SnapshotReader reader(snapshot, Isolate::Current()); | 113 SnapshotReader reader(snapshot, Isolate::Current()); |
| 112 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 114 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 113 EXPECT(Equals(smi, serialized_object)); | 115 EXPECT(Equals(smi, serialized_object)); |
| 114 | 116 |
| 115 // Read object back from the snapshot into a C structure. | 117 // Read object back from the snapshot into a C structure. |
| 116 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 118 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 117 writer.BytesWritten(), | 119 writer.BytesWritten(), |
| 118 &allocator); | 120 &allocator); |
| 119 Dart_CObject* cobject = mreader.ReadObject(); | 121 Dart_CObject* cobject = mreader.ReadObject(); |
| 122 EXPECT_NOTNULL(cobject); |
| 120 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 123 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
| 121 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 124 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 122 free(cobject); | 125 free(cobject); |
| 123 } | 126 } |
| 124 | 127 |
| 125 | 128 |
| 126 TEST_CASE(SerializeDouble) { | 129 TEST_CASE(SerializeDouble) { |
| 127 // Write snapshot with object content. | 130 // Write snapshot with object content. |
| 128 uint8_t* buffer; | 131 uint8_t* buffer; |
| 129 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 132 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 130 const Double& dbl = Double::Handle(Double::New(101.29)); | 133 const Double& dbl = Double::Handle(Double::New(101.29)); |
| 131 writer.WriteObject(dbl.raw()); | 134 writer.WriteObject(dbl.raw()); |
| 132 writer.FinalizeBuffer(); | 135 writer.FinalizeBuffer(); |
| 133 | 136 |
| 134 // Create a snapshot object using the buffer. | 137 // Create a snapshot object using the buffer. |
| 135 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 138 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 136 | 139 |
| 137 // Read object back from the snapshot. | 140 // Read object back from the snapshot. |
| 138 SnapshotReader reader(snapshot, Isolate::Current()); | 141 SnapshotReader reader(snapshot, Isolate::Current()); |
| 139 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 142 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 140 EXPECT(Equals(dbl, serialized_object)); | 143 EXPECT(Equals(dbl, serialized_object)); |
| 141 | 144 |
| 142 // Read object back from the snapshot into a C structure. | 145 // Read object back from the snapshot into a C structure. |
| 143 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 146 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 144 writer.BytesWritten(), | 147 writer.BytesWritten(), |
| 145 &allocator); | 148 &allocator); |
| 146 Dart_CObject* cobject = mreader.ReadObject(); | 149 Dart_CObject* cobject = mreader.ReadObject(); |
| 150 EXPECT_NOTNULL(cobject); |
| 147 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 151 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
| 148 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 152 EXPECT_EQ(dbl.value(), cobject->value.as_double); |
| 149 free(cobject); | 153 free(cobject); |
| 150 } | 154 } |
| 151 | 155 |
| 152 | 156 |
| 153 TEST_CASE(SerializeBool) { | 157 TEST_CASE(SerializeBool) { |
| 154 // Write snapshot with object content. | 158 // Write snapshot with object content. |
| 155 uint8_t* buffer; | 159 uint8_t* buffer; |
| 156 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 160 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 157 const Bool& bool1 = Bool::Handle(Bool::True()); | 161 const Bool& bool1 = Bool::Handle(Bool::True()); |
| 158 const Bool& bool2 = Bool::Handle(Bool::False()); | 162 const Bool& bool2 = Bool::Handle(Bool::False()); |
| 159 writer.WriteObject(bool1.raw()); | 163 writer.WriteObject(bool1.raw()); |
| 160 writer.WriteObject(bool2.raw()); | 164 writer.WriteObject(bool2.raw()); |
| 161 writer.FinalizeBuffer(); | 165 writer.FinalizeBuffer(); |
| 162 | 166 |
| 163 // Create a snapshot object using the buffer. | 167 // Create a snapshot object using the buffer. |
| 164 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 168 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 165 | 169 |
| 166 // Read object back from the snapshot. | 170 // Read object back from the snapshot. |
| 167 SnapshotReader reader(snapshot, Isolate::Current()); | 171 SnapshotReader reader(snapshot, Isolate::Current()); |
| 168 EXPECT(Bool::True() == reader.ReadObject()); | 172 EXPECT(Bool::True() == reader.ReadObject()); |
| 169 EXPECT(Bool::False() == reader.ReadObject()); | 173 EXPECT(Bool::False() == reader.ReadObject()); |
| 170 | 174 |
| 171 // Read object back from the snapshot into a C structure. | 175 // Read object back from the snapshot into a C structure. |
| 172 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 176 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 173 writer.BytesWritten(), | 177 writer.BytesWritten(), |
| 174 &allocator); | 178 &allocator); |
| 175 Dart_CObject* cobject1 = mreader.ReadObject(); | 179 Dart_CObject* cobject1 = mreader.ReadObject(); |
| 180 EXPECT_NOTNULL(cobject1); |
| 176 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); | 181 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); |
| 177 EXPECT_EQ(true, cobject1->value.as_bool); | 182 EXPECT_EQ(true, cobject1->value.as_bool); |
| 178 Dart_CObject* cobject2 = mreader.ReadObject(); | 183 Dart_CObject* cobject2 = mreader.ReadObject(); |
| 184 EXPECT_NOTNULL(cobject2); |
| 179 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); | 185 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); |
| 180 EXPECT_EQ(false, cobject2->value.as_bool); | 186 EXPECT_EQ(false, cobject2->value.as_bool); |
| 181 free(cobject1); | 187 free(cobject1); |
| 182 free(cobject2); | 188 free(cobject2); |
| 183 } | 189 } |
| 184 | 190 |
| 185 | 191 |
| 186 TEST_CASE(SerializeBigint) { | 192 TEST_CASE(SerializeBigint) { |
| 187 // Write snapshot with object content. | 193 // Write snapshot with object content. |
| 188 uint8_t* buffer; | 194 uint8_t* buffer; |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 for (int i = 0; i < kArrayLength; i++) { | 692 for (int i = 0; i < kArrayLength; i++) { |
| 687 Dart_CObject* element = value->value.as_array.values[i]; | 693 Dart_CObject* element = value->value.as_array.values[i]; |
| 688 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 694 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
| 689 EXPECT_EQ(i + 1, element->value.as_int32); | 695 EXPECT_EQ(i + 1, element->value.as_int32); |
| 690 free(element); | 696 free(element); |
| 691 } | 697 } |
| 692 free(value); | 698 free(value); |
| 693 } | 699 } |
| 694 | 700 |
| 695 | 701 |
| 702 // Helper function to call a top level Dart function, serialize the |
| 703 // result and deserialize the result into a Dart_CObject structure. |
| 704 static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, |
| 705 const char* dart_function) { |
| 706 Dart_Handle result; |
| 707 result = Dart_InvokeStatic(lib, |
| 708 Dart_NewString(""), |
| 709 Dart_NewString(dart_function), |
| 710 0, |
| 711 NULL); |
| 712 EXPECT_VALID(result); |
| 713 |
| 714 // Serialize the list into a message. |
| 715 uint8_t* buffer; |
| 716 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 717 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| 718 writer.WriteObject(list.raw()); |
| 719 writer.FinalizeBuffer(); |
| 720 |
| 721 // Read object back from the snapshot into a C structure. |
| 722 CMessageReader reader(buffer + Snapshot::kHeaderSize, |
| 723 writer.BytesWritten(), |
| 724 &allocator); |
| 725 Dart_CObject* value = reader.ReadObject(); |
| 726 free(buffer); |
| 727 return value; |
| 728 } |
| 729 |
| 730 |
| 696 UNIT_TEST_CASE(DartGeneratedMessages) { | 731 UNIT_TEST_CASE(DartGeneratedMessages) { |
| 697 const int kArrayLength = 10; | |
| 698 static const char* kCustomIsolateScriptChars = | 732 static const char* kCustomIsolateScriptChars = |
| 699 "getSmi() {\n" | 733 "getSmi() {\n" |
| 700 " return 42;\n" | 734 " return 42;\n" |
| 701 "}\n" | 735 "}\n" |
| 702 "getString() {\n" | 736 "getString() {\n" |
| 703 " return \"Hello, world!\";\n" | 737 " return \"Hello, world!\";\n" |
| 704 "}\n" | 738 "}\n" |
| 705 "getList() {\n" | 739 "getList() {\n" |
| 706 " return [1,2,3,4,5,6,7,8,9,10];\n" | 740 " return new List(kArrayLength);\n" |
| 707 "}\n"; | 741 "}\n"; |
| 708 | 742 |
| 709 TestCase::CreateTestIsolate(); | 743 TestCase::CreateTestIsolate(); |
| 710 Isolate* isolate = Isolate::Current(); | 744 Isolate* isolate = Isolate::Current(); |
| 711 EXPECT(isolate != NULL); | 745 EXPECT(isolate != NULL); |
| 712 Dart_EnterScope(); | 746 Dart_EnterScope(); |
| 713 | 747 |
| 714 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, | 748 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, |
| 715 NULL); | 749 NULL); |
| 716 EXPECT_VALID(lib); | 750 EXPECT_VALID(lib); |
| 717 Dart_Handle smi_result; | 751 Dart_Handle smi_result; |
| 718 smi_result = Dart_InvokeStatic(lib, | 752 smi_result = Dart_InvokeStatic(lib, |
| 719 Dart_NewString(""), | 753 Dart_NewString(""), |
| 720 Dart_NewString("getSmi"), | 754 Dart_NewString("getSmi"), |
| 721 0, | 755 0, |
| 722 NULL); | 756 NULL); |
| 723 EXPECT_VALID(smi_result); | 757 EXPECT_VALID(smi_result); |
| 724 Dart_Handle string_result; | 758 Dart_Handle string_result; |
| 725 string_result = Dart_InvokeStatic(lib, | 759 string_result = Dart_InvokeStatic(lib, |
| 726 Dart_NewString(""), | 760 Dart_NewString(""), |
| 727 Dart_NewString("getString"), | 761 Dart_NewString("getString"), |
| 728 0, | 762 0, |
| 729 NULL); | 763 NULL); |
| 730 EXPECT_VALID(string_result); | 764 EXPECT_VALID(string_result); |
| 731 EXPECT(Dart_IsString(string_result)); | 765 EXPECT(Dart_IsString(string_result)); |
| 732 Dart_Handle list_result; | 766 |
| 733 list_result = Dart_InvokeStatic(lib, | |
| 734 Dart_NewString(""), | |
| 735 Dart_NewString("getList"), | |
| 736 0, | |
| 737 NULL); | |
| 738 EXPECT_VALID(list_result); | |
| 739 EXPECT(Dart_IsList(list_result)); | |
| 740 intptr_t result_len = 0; | |
| 741 EXPECT_VALID(Dart_ListLength(list_result, &result_len)); | |
| 742 EXPECT_EQ(kArrayLength, result_len); | |
| 743 { | 767 { |
| 744 DARTSCOPE_NOCHECKS(isolate); | 768 DARTSCOPE_NOCHECKS(isolate); |
| 745 | 769 |
| 746 { | 770 { |
| 747 uint8_t* buffer; | 771 uint8_t* buffer; |
| 748 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 772 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 749 Smi& smi = Smi::Handle(); | 773 Smi& smi = Smi::Handle(); |
| 750 smi ^= Api::UnwrapHandle(smi_result); | 774 smi ^= Api::UnwrapHandle(smi_result); |
| 751 writer.WriteObject(smi.raw()); | 775 writer.WriteObject(smi.raw()); |
| 752 writer.FinalizeBuffer(); | 776 writer.FinalizeBuffer(); |
| 753 | 777 |
| 754 // Read object back from the snapshot into a C structure. | 778 // Read object back from the snapshot into a C structure. |
| 755 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 779 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 756 writer.BytesWritten(), | 780 writer.BytesWritten(), |
| 757 &allocator); | 781 &allocator); |
| 758 Dart_CObject* value = mreader.ReadObject(); | 782 Dart_CObject* value = mreader.ReadObject(); |
| 783 EXPECT_NOTNULL(value); |
| 759 EXPECT_EQ(Dart_CObject::kInt32, value->type); | 784 EXPECT_EQ(Dart_CObject::kInt32, value->type); |
| 760 EXPECT_EQ(42, value->value.as_int32); | 785 EXPECT_EQ(42, value->value.as_int32); |
| 761 free(value); | 786 free(value); |
| 762 free(buffer); | 787 free(buffer); |
| 763 } | 788 } |
| 764 { | 789 { |
| 765 uint8_t* buffer; | 790 uint8_t* buffer; |
| 766 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 791 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 767 String& str = String::Handle(); | 792 String& str = String::Handle(); |
| 768 str ^= Api::UnwrapHandle(string_result); | 793 str ^= Api::UnwrapHandle(string_result); |
| 769 writer.WriteObject(str.raw()); | 794 writer.WriteObject(str.raw()); |
| 770 writer.FinalizeBuffer(); | 795 writer.FinalizeBuffer(); |
| 771 | 796 |
| 772 // Read object back from the snapshot into a C structure. | 797 // Read object back from the snapshot into a C structure. |
| 773 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 798 CMessageReader mreader(buffer + Snapshot::kHeaderSize, |
| 774 writer.BytesWritten(), | 799 writer.BytesWritten(), |
| 775 &allocator); | 800 &allocator); |
| 776 Dart_CObject* value = mreader.ReadObject(); | 801 Dart_CObject* value = mreader.ReadObject(); |
| 802 EXPECT_NOTNULL(value); |
| 777 EXPECT_EQ(Dart_CObject::kString, value->type); | 803 EXPECT_EQ(Dart_CObject::kString, value->type); |
| 778 EXPECT_STREQ("Hello, world!", value->value.as_string); | 804 EXPECT_STREQ("Hello, world!", value->value.as_string); |
| 779 free(value); | 805 free(value); |
| 780 free(buffer); | 806 free(buffer); |
| 781 } | 807 } |
| 782 { | |
| 783 uint8_t* buffer; | |
| 784 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | |
| 785 const Object& list = Object::Handle(Api::UnwrapHandle(list_result)); | |
| 786 writer.WriteObject(list.raw()); | |
| 787 writer.FinalizeBuffer(); | |
| 788 // TODO(sgjesse): Make this work! | |
| 789 free(buffer); | |
| 790 } | |
| 791 } | 808 } |
| 792 Dart_ExitScope(); | 809 Dart_ExitScope(); |
| 810 Dart_ShutdownIsolate(); |
| 811 } |
| 812 |
| 813 |
| 814 UNIT_TEST_CASE(DartGeneratedListMessages) { |
| 815 const int kArrayLength = 10; |
| 816 static const char* kScriptChars = |
| 817 "final int kArrayLength = 10;\n" |
| 818 "getList() {\n" |
| 819 " return new List(kArrayLength);\n" |
| 820 "}\n" |
| 821 "getIntList() {\n" |
| 822 " var list = new List<int>(kArrayLength);\n" |
| 823 " for (var i = 0; i < kArrayLength; i++) list[i] = i;\n" |
| 824 " return list;\n" |
| 825 "}\n" |
| 826 "getStringList() {\n" |
| 827 " var list = new List<String>(kArrayLength);\n" |
| 828 " for (var i = 0; i < kArrayLength; i++) list[i] = i.toString();\n" |
| 829 " return list;\n" |
| 830 "}\n" |
| 831 "getMixedList() {\n" |
| 832 " var list = new List(kArrayLength);\n" |
| 833 " list[0] = 0;\n" |
| 834 " list[1] = '1';\n" |
| 835 " list[2] = 2.2;\n" |
| 836 " list[3] = true;\n" |
| 837 " return list;\n" |
| 838 "}\n"; |
| 839 |
| 840 TestCase::CreateTestIsolate(); |
| 841 Isolate* isolate = Isolate::Current(); |
| 842 EXPECT(isolate != NULL); |
| 843 Dart_EnterScope(); |
| 844 |
| 845 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 846 EXPECT_VALID(lib); |
| 847 |
| 848 { |
| 849 DARTSCOPE_NOCHECKS(isolate); |
| 850 |
| 851 { |
| 852 // Generate a list of nulls from Dart code. |
| 853 Dart_CObject* value = GetDeserializedDartObject(lib, "getList"); |
| 854 EXPECT_NOTNULL(value); |
| 855 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 856 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 857 for (int i = 0; i < kArrayLength; i++) { |
| 858 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 859 free(value->value.as_array.values[i]); |
| 860 } |
| 861 free(value); |
| 862 } |
| 863 { |
| 864 // Generate a list of ints from Dart code. |
| 865 Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList"); |
| 866 EXPECT_NOTNULL(value); |
| 867 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 868 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 869 for (int i = 0; i < kArrayLength; i++) { |
| 870 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
| 871 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
| 872 free(value->value.as_array.values[i]); |
| 873 } |
| 874 free(value); |
| 875 } |
| 876 { |
| 877 // Generate a list of strings from Dart code. |
| 878 Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList"); |
| 879 EXPECT_NOTNULL(value); |
| 880 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 881 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 882 for (int i = 0; i < kArrayLength; i++) { |
| 883 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); |
| 884 char buffer[3]; |
| 885 snprintf(buffer, sizeof(buffer), "%d", i); |
| 886 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
| 887 free(value->value.as_array.values[i]); |
| 888 } |
| 889 free(value); |
| 890 } |
| 891 { |
| 892 // Generate a list of objects of different types from Dart code. |
| 893 Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList"); |
| 894 EXPECT_NOTNULL(value); |
| 895 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 896 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 897 |
| 898 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); |
| 899 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); |
| 900 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); |
| 901 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); |
| 902 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); |
| 903 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); |
| 904 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); |
| 905 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); |
| 906 |
| 907 for (int i = 0; i < kArrayLength; i++) { |
| 908 if (i > 3) { |
| 909 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 910 } |
| 911 free(value->value.as_array.values[i]); |
| 912 } |
| 913 free(value); |
| 914 } |
| 915 } |
| 916 Dart_ExitScope(); |
| 917 Dart_ShutdownIsolate(); |
| 918 } |
| 919 |
| 920 |
| 921 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| 922 const int kArrayLength = 10; |
| 923 static const char* kScriptChars = |
| 924 "final int kArrayLength = 10;\n" |
| 925 "getStringList() {\n" |
| 926 " var s = 'Hello, world!';\n" |
| 927 " var list = new List<String>(kArrayLength);\n" |
| 928 " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n" |
| 929 " return list;\n" |
| 930 "}\n" |
| 931 "getDoubleList() {\n" |
| 932 " var d = 3.14;\n" |
| 933 " var list = new List<double>(kArrayLength);\n" |
| 934 " for (var i = 0; i < kArrayLength; i++) list[i] = d;\n" |
| 935 " return list;\n" |
| 936 "}\n" |
| 937 "getMixedList() {\n" |
| 938 " var list = new List(kArrayLength);\n" |
| 939 " for (var i = 0; i < kArrayLength; i++) {\n" |
| 940 " list[i] = ((i % 2) == 0) ? 'A' : 2.72;\n" |
| 941 " }\n" |
| 942 " return list;\n" |
| 943 "}\n" |
| 944 "getSelfRefList() {\n" |
| 945 " var list = new List(kArrayLength);\n" |
| 946 " for (var i = 0; i < kArrayLength; i++) {\n" |
| 947 " list[i] = list;\n" |
| 948 " }\n" |
| 949 " return list;\n" |
| 950 "}\n"; |
| 951 |
| 952 TestCase::CreateTestIsolate(); |
| 953 Isolate* isolate = Isolate::Current(); |
| 954 EXPECT(isolate != NULL); |
| 955 Dart_EnterScope(); |
| 956 |
| 957 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 958 EXPECT_VALID(lib); |
| 959 |
| 960 { |
| 961 DARTSCOPE_NOCHECKS(isolate); |
| 962 |
| 963 { |
| 964 // Generate a list of strings from Dart code. |
| 965 Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList"); |
| 966 EXPECT_NOTNULL(object); |
| 967 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 968 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 969 for (int i = 0; i < kArrayLength; i++) { |
| 970 Dart_CObject* element = object->value.as_array.values[i]; |
| 971 EXPECT_EQ(object->value.as_array.values[0], element); |
| 972 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 973 EXPECT_STREQ("Hello, world!", element->value.as_string); |
| 974 } |
| 975 free(object->value.as_array.values[0]); |
| 976 free(object); |
| 977 } |
| 978 { |
| 979 // Generate a list of doubles from Dart code. |
| 980 Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList"); |
| 981 EXPECT_NOTNULL(object); |
| 982 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 983 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 984 for (int i = 0; i < kArrayLength; i++) { |
| 985 Dart_CObject* element = object->value.as_array.values[i]; |
| 986 EXPECT_EQ(object->value.as_array.values[0], element); |
| 987 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 988 EXPECT_EQ(3.14, element->value.as_double); |
| 989 } |
| 990 free(object->value.as_array.values[0]); |
| 991 free(object); |
| 992 } |
| 993 { |
| 994 // Generate a list of objects of different types from Dart code. |
| 995 Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList"); |
| 996 EXPECT_NOTNULL(object); |
| 997 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 998 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 999 for (int i = 0; i < kArrayLength; i++) { |
| 1000 Dart_CObject* element = object->value.as_array.values[i]; |
| 1001 if ((i % 2) == 0) { |
| 1002 EXPECT_EQ(object->value.as_array.values[0], element); |
| 1003 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 1004 EXPECT_STREQ("A", element->value.as_string); |
| 1005 } else { |
| 1006 EXPECT_EQ(object->value.as_array.values[1], element); |
| 1007 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 1008 EXPECT_STREQ(2.72, element->value.as_double); |
| 1009 } |
| 1010 } |
| 1011 free(object->value.as_array.values[0]); |
| 1012 free(object->value.as_array.values[1]); |
| 1013 free(object); |
| 1014 } |
| 1015 { |
| 1016 // Generate a list of objects of different types from Dart code. |
| 1017 Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList"); |
| 1018 EXPECT_NOTNULL(object); |
| 1019 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 1020 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 1021 for (int i = 0; i < kArrayLength; i++) { |
| 1022 Dart_CObject* element = object->value.as_array.values[i]; |
| 1023 EXPECT_EQ(Dart_CObject::kArray, element->type); |
| 1024 EXPECT_EQ(object, element); |
| 1025 } |
| 1026 free(object); |
| 1027 } |
| 1028 } |
| 1029 Dart_ExitScope(); |
| 793 Dart_ShutdownIsolate(); | 1030 Dart_ShutdownIsolate(); |
| 794 } | 1031 } |
| 795 | 1032 |
| 796 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1033 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 797 | 1034 |
| 798 } // namespace dart | 1035 } // namespace dart |
| OLD | NEW |