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 "vm/assembler.h" | 5 #include "vm/assembler.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_entry.h" | 9 #include "vm/dart_entry.h" |
10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 return cls.raw(); | 24 return cls.raw(); |
25 } | 25 } |
26 | 26 |
27 | 27 |
28 TEST_CASE(Class) { | 28 TEST_CASE(Class) { |
29 // Allocate the class first. | 29 // Allocate the class first. |
30 const String& class_name = String::Handle(Symbols::New("MyClass")); | 30 const String& class_name = String::Handle(Symbols::New("MyClass")); |
31 const Script& script = Script::Handle(); | 31 const Script& script = Script::Handle(); |
32 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); | 32 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); |
33 | 33 |
34 // Class has no fields. | 34 // Class has no fields and no functions yet. |
35 cls.SetFields(Object::empty_array()); | 35 EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0); |
| 36 EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0); |
| 37 |
| 38 // Setup the interfaces in the class. |
| 39 const Array& interfaces = Array::Handle(Array::New(2)); |
| 40 Class& interface = Class::Handle(); |
| 41 String& interface_name = String::Handle(); |
| 42 interface_name = Symbols::New("Harley"); |
| 43 interface = CreateDummyClass(interface_name, script); |
| 44 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface))); |
| 45 interface_name = Symbols::New("Norton"); |
| 46 interface = CreateDummyClass(interface_name, script); |
| 47 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface))); |
| 48 cls.set_interfaces(interfaces); |
| 49 |
| 50 // Finalization of types happens before the fields and functions have been |
| 51 // parsed. |
| 52 ClassFinalizer::FinalizeTypesInClass(cls); |
36 | 53 |
37 // Create and populate the function arrays. | 54 // Create and populate the function arrays. |
38 const Array& functions = Array::Handle(Array::New(6)); | 55 const Array& functions = Array::Handle(Array::New(6)); |
39 Function& function = Function::Handle(); | 56 Function& function = Function::Handle(); |
40 String& function_name = String::Handle(); | 57 String& function_name = String::Handle(); |
41 function_name = Symbols::New("foo"); | 58 function_name = Symbols::New("foo"); |
42 function = Function::New( | 59 function = Function::New( |
43 function_name, RawFunction::kRegularFunction, | 60 function_name, RawFunction::kRegularFunction, |
44 false, false, false, false, cls, 0); | 61 false, false, false, false, cls, 0); |
45 functions.SetAt(0, function); | 62 functions.SetAt(0, function); |
(...skipping 26 matching lines...) Expand all Loading... |
72 function = Function::New( | 89 function = Function::New( |
73 function_name, RawFunction::kRegularFunction, | 90 function_name, RawFunction::kRegularFunction, |
74 true, false, false, false, cls, 0); | 91 true, false, false, false, cls, 0); |
75 functions.SetAt(4, function); | 92 functions.SetAt(4, function); |
76 function_name = Symbols::New("BaZ"); | 93 function_name = Symbols::New("BaZ"); |
77 function = Function::New( | 94 function = Function::New( |
78 function_name, RawFunction::kRegularFunction, | 95 function_name, RawFunction::kRegularFunction, |
79 true, false, false, false, cls, 0); | 96 true, false, false, false, cls, 0); |
80 functions.SetAt(5, function); | 97 functions.SetAt(5, function); |
81 | 98 |
82 // Setup the functions and interfaces in the class. | 99 // Setup the functions in the class. |
83 cls.SetFunctions(functions); | 100 cls.SetFunctions(functions); |
84 const Array& interfaces = Array::Handle(Array::New(2)); | 101 |
85 Class& interface = Class::Handle(); | 102 // The class can now be finalized. |
86 String& interface_name = String::Handle(); | |
87 interface_name = Symbols::New("Harley"); | |
88 interface = CreateDummyClass(interface_name, script); | |
89 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface))); | |
90 interface_name = Symbols::New("Norton"); | |
91 interface = CreateDummyClass(interface_name, script); | |
92 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface))); | |
93 cls.set_interfaces(interfaces); | |
94 ClassFinalizer::FinalizeTypesInClass(cls); | |
95 cls.Finalize(); | 103 cls.Finalize(); |
96 | 104 |
97 function_name = String::New("Foo"); | 105 function_name = String::New("Foo"); |
98 function = cls.LookupDynamicFunction(function_name); | 106 function = cls.LookupDynamicFunction(function_name); |
99 EXPECT(function.IsNull()); | 107 EXPECT(function.IsNull()); |
100 function = cls.LookupStaticFunction(function_name); | 108 function = cls.LookupStaticFunction(function_name); |
101 EXPECT(!function.IsNull()); | 109 EXPECT(!function.IsNull()); |
102 EXPECT(function_name.Equals(String::Handle(function.name()))); | 110 EXPECT(function_name.Equals(String::Handle(function.name()))); |
103 EXPECT_EQ(cls.raw(), function.Owner()); | 111 EXPECT_EQ(cls.raw(), function.Owner()); |
104 EXPECT(function.is_static()); | 112 EXPECT(function.is_static()); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 } | 177 } |
170 | 178 |
171 | 179 |
172 TEST_CASE(InstanceClass) { | 180 TEST_CASE(InstanceClass) { |
173 // Allocate the class first. | 181 // Allocate the class first. |
174 String& class_name = String::Handle(Symbols::New("EmptyClass")); | 182 String& class_name = String::Handle(Symbols::New("EmptyClass")); |
175 Script& script = Script::Handle(); | 183 Script& script = Script::Handle(); |
176 const Class& empty_class = | 184 const Class& empty_class = |
177 Class::Handle(CreateDummyClass(class_name, script)); | 185 Class::Handle(CreateDummyClass(class_name, script)); |
178 | 186 |
179 // No functions and no super class for the EmptyClass. | 187 // EmptyClass has no fields and no functions. |
180 empty_class.SetFields(Object::empty_array()); | 188 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); |
| 189 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); |
| 190 |
181 ClassFinalizer::FinalizeTypesInClass(empty_class); | 191 ClassFinalizer::FinalizeTypesInClass(empty_class); |
182 empty_class.Finalize(); | 192 empty_class.Finalize(); |
| 193 |
183 EXPECT_EQ(kObjectAlignment, empty_class.instance_size()); | 194 EXPECT_EQ(kObjectAlignment, empty_class.instance_size()); |
184 Instance& instance = Instance::Handle(Instance::New(empty_class)); | 195 Instance& instance = Instance::Handle(Instance::New(empty_class)); |
185 EXPECT_EQ(empty_class.raw(), instance.clazz()); | 196 EXPECT_EQ(empty_class.raw(), instance.clazz()); |
186 | 197 |
187 class_name = Symbols::New("OneFieldClass"); | 198 class_name = Symbols::New("OneFieldClass"); |
188 const Class& one_field_class = | 199 const Class& one_field_class = |
189 Class::Handle(CreateDummyClass(class_name, script)); | 200 Class::Handle(CreateDummyClass(class_name, script)); |
190 | 201 |
191 // No functions and no super class for the OneFieldClass. | 202 // No fields, functions, or super type for the OneFieldClass. |
| 203 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); |
| 204 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); |
| 205 EXPECT_EQ(empty_class.super_type(), AbstractType::null()); |
| 206 ClassFinalizer::FinalizeTypesInClass(one_field_class); |
| 207 |
192 const Array& one_fields = Array::Handle(Array::New(1)); | 208 const Array& one_fields = Array::Handle(Array::New(1)); |
193 const String& field_name = String::Handle(Symbols::New("the_field")); | 209 const String& field_name = String::Handle(Symbols::New("the_field")); |
194 const Field& field = Field::Handle( | 210 const Field& field = Field::Handle( |
195 Field::New(field_name, false, false, false, one_field_class, 0)); | 211 Field::New(field_name, false, false, false, one_field_class, 0)); |
196 one_fields.SetAt(0, field); | 212 one_fields.SetAt(0, field); |
197 one_field_class.SetFields(one_fields); | 213 one_field_class.SetFields(one_fields); |
198 ClassFinalizer::FinalizeTypesInClass(one_field_class); | |
199 one_field_class.Finalize(); | 214 one_field_class.Finalize(); |
200 intptr_t header_size = sizeof(RawObject); | 215 intptr_t header_size = sizeof(RawObject); |
201 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), | 216 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), |
202 one_field_class.instance_size()); | 217 one_field_class.instance_size()); |
203 EXPECT_EQ(header_size, field.Offset()); | 218 EXPECT_EQ(header_size, field.Offset()); |
204 EXPECT(!one_field_class.is_implemented()); | 219 EXPECT(!one_field_class.is_implemented()); |
205 one_field_class.set_is_implemented(); | 220 one_field_class.set_is_implemented(); |
206 EXPECT(one_field_class.is_implemented()); | 221 EXPECT(one_field_class.is_implemented()); |
207 } | 222 } |
208 | 223 |
(...skipping 3156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3365 const Function& test7 = Function::Handle(GetFunction(class_a, "test7")); | 3380 const Function& test7 = Function::Handle(GetFunction(class_a, "test7")); |
3366 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint()); | 3381 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint()); |
3367 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint()); | 3382 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint()); |
3368 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint()); | 3383 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint()); |
3369 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint()); | 3384 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint()); |
3370 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint()); | 3385 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint()); |
3371 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint()); | 3386 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint()); |
3372 } | 3387 } |
3373 | 3388 |
3374 } // namespace dart | 3389 } // namespace dart |
OLD | NEW |