Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(529)

Side by Side Diff: runtime/vm/object_test.cc

Issue 14820028: Delay Class parsing until the class is actually used. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/assembler.h" 6 #include "vm/assembler.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/isolate.h" 9 #include "vm/isolate.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
11 #include "vm/object_store.h" 11 #include "vm/object_store.h"
12 #include "vm/simulator.h" 12 #include "vm/simulator.h"
13 #include "vm/symbols.h" 13 #include "vm/symbols.h"
14 #include "vm/unit_test.h" 14 #include "vm/unit_test.h"
15 15
16 namespace dart { 16 namespace dart {
17 17
18 static RawClass* CreateDummyClass(const String& class_name,
19 const Script& script) {
20 const Class& cls = Class::Handle(
21 Class::New(class_name, script, Scanner::kDummyTokenIndex));
22 cls.set_is_synthesized_class(); // Dummy class for testing.
23 return cls.raw();
24 }
25
26
18 TEST_CASE(Class) { 27 TEST_CASE(Class) {
19 // Allocate the class first. 28 // Allocate the class first.
20 const String& class_name = String::Handle(Symbols::New("MyClass")); 29 const String& class_name = String::Handle(Symbols::New("MyClass"));
21 const Script& script = Script::Handle(); 30 const Script& script = Script::Handle();
22 const Class& cls = Class::Handle( 31 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
23 Class::New(class_name, script, Scanner::kDummyTokenIndex));
24 32
25 // Class has no fields. 33 // Class has no fields.
26 cls.SetFields(Object::empty_array()); 34 cls.SetFields(Object::empty_array());
27 35
28 // Create and populate the function arrays. 36 // Create and populate the function arrays.
29 const Array& functions = Array::Handle(Array::New(6)); 37 const Array& functions = Array::Handle(Array::New(6));
30 Function& function = Function::Handle(); 38 Function& function = Function::Handle();
31 String& function_name = String::Handle(); 39 String& function_name = String::Handle();
32 function_name = Symbols::New("foo"); 40 function_name = Symbols::New("foo");
33 function = Function::New( 41 function = Function::New(
(...skipping 29 matching lines...) Expand all
63 function = Function::New( 71 function = Function::New(
64 function_name, RawFunction::kRegularFunction, 72 function_name, RawFunction::kRegularFunction,
65 true, false, false, false, cls, 0); 73 true, false, false, false, cls, 0);
66 functions.SetAt(4, function); 74 functions.SetAt(4, function);
67 function_name = Symbols::New("BaZ"); 75 function_name = Symbols::New("BaZ");
68 function = Function::New( 76 function = Function::New(
69 function_name, RawFunction::kRegularFunction, 77 function_name, RawFunction::kRegularFunction,
70 true, false, false, false, cls, 0); 78 true, false, false, false, cls, 0);
71 functions.SetAt(5, function); 79 functions.SetAt(5, function);
72 80
73 // Setup the functions in the class. 81 // Setup the functions and interfaces in the class.
74 cls.SetFunctions(functions); 82 cls.SetFunctions(functions);
83 const Array& interfaces = Array::Handle(Array::New(2));
84 Class& interface = Class::Handle();
85 String& interface_name = String::Handle();
86 interface_name = Symbols::New("Harley");
87 interface = CreateDummyClass(interface_name, script);
88 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface)));
89 interface_name = Symbols::New("Norton");
90 interface = CreateDummyClass(interface_name, script);
91 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface)));
92 cls.set_interfaces(interfaces);
93 ClassFinalizer::FinalizeTypesInClass(cls);
94 cls.Finalize();
75 95
76 function_name = String::New("Foo"); 96 function_name = String::New("Foo");
77 function = cls.LookupDynamicFunction(function_name); 97 function = cls.LookupDynamicFunction(function_name);
78 EXPECT(function.IsNull()); 98 EXPECT(function.IsNull());
79 function = cls.LookupStaticFunction(function_name); 99 function = cls.LookupStaticFunction(function_name);
80 EXPECT(!function.IsNull()); 100 EXPECT(!function.IsNull());
81 EXPECT(function_name.Equals(String::Handle(function.name()))); 101 EXPECT(function_name.Equals(String::Handle(function.name())));
82 EXPECT_EQ(cls.raw(), function.Owner()); 102 EXPECT_EQ(cls.raw(), function.Owner());
83 EXPECT(function.is_static()); 103 EXPECT(function.is_static());
84 function_name = String::New("baz"); 104 function_name = String::New("baz");
85 function = cls.LookupDynamicFunction(function_name); 105 function = cls.LookupDynamicFunction(function_name);
86 EXPECT(!function.IsNull()); 106 EXPECT(!function.IsNull());
87 EXPECT(function_name.Equals(String::Handle(function.name()))); 107 EXPECT(function_name.Equals(String::Handle(function.name())));
88 EXPECT_EQ(cls.raw(), function.Owner()); 108 EXPECT_EQ(cls.raw(), function.Owner());
89 EXPECT(!function.is_static()); 109 EXPECT(!function.is_static());
90 function = cls.LookupStaticFunction(function_name); 110 function = cls.LookupStaticFunction(function_name);
91 EXPECT(function.IsNull()); 111 EXPECT(function.IsNull());
92 112
93 function_name = String::New("foo"); 113 function_name = String::New("foo");
94 function = cls.LookupDynamicFunction(function_name); 114 function = cls.LookupDynamicFunction(function_name);
95 EXPECT(!function.IsNull()); 115 EXPECT(!function.IsNull());
96 EXPECT_EQ(0, function.num_fixed_parameters()); 116 EXPECT_EQ(0, function.num_fixed_parameters());
97 EXPECT(!function.HasOptionalParameters()); 117 EXPECT(!function.HasOptionalParameters());
98 118
99 function_name = String::New("bar"); 119 function_name = String::New("bar");
100 function = cls.LookupDynamicFunction(function_name); 120 function = cls.LookupDynamicFunction(function_name);
101 EXPECT(!function.IsNull()); 121 EXPECT(!function.IsNull());
102 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters()); 122 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters());
103 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters()); 123 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters());
104
105 const Array& interfaces = Array::Handle(Array::New(2));
106 Class& interface = Class::Handle();
107 String& interface_name = String::Handle();
108 interface_name = Symbols::New("Harley");
109 interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex);
110 interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface)));
111 interface_name = Symbols::New("Norton");
112 interface = Class::New(interface_name, script, Scanner::kDummyTokenIndex);
113 interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface)));
114 cls.set_interfaces(interfaces);
115 cls.Finalize();
116 } 124 }
117 125
118 126
119 TEST_CASE(TypeArguments) { 127 TEST_CASE(TypeArguments) {
120 const Type& type1 = Type::Handle(Type::Double()); 128 const Type& type1 = Type::Handle(Type::Double());
121 const Type& type2 = Type::Handle(Type::StringType()); 129 const Type& type2 = Type::Handle(Type::StringType());
122 const TypeArguments& type_arguments1 = TypeArguments::Handle( 130 const TypeArguments& type_arguments1 = TypeArguments::Handle(
123 TypeArguments::New(2)); 131 TypeArguments::New(2));
124 type_arguments1.SetTypeAt(0, type1); 132 type_arguments1.SetTypeAt(0, type1);
125 type_arguments1.SetTypeAt(1, type2); 133 type_arguments1.SetTypeAt(1, type2);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 iterator.Advance(); // Advance to end of stream. 166 iterator.Advance(); // Advance to end of stream.
159 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind()); 167 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind());
160 } 168 }
161 169
162 170
163 TEST_CASE(InstanceClass) { 171 TEST_CASE(InstanceClass) {
164 // Allocate the class first. 172 // Allocate the class first.
165 String& class_name = String::Handle(Symbols::New("EmptyClass")); 173 String& class_name = String::Handle(Symbols::New("EmptyClass"));
166 Script& script = Script::Handle(); 174 Script& script = Script::Handle();
167 const Class& empty_class = 175 const Class& empty_class =
168 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 176 Class::Handle(CreateDummyClass(class_name, script));
169 177
170 // No functions and no super class for the EmptyClass. 178 // No functions and no super class for the EmptyClass.
171 empty_class.SetFields(Object::empty_array()); 179 empty_class.SetFields(Object::empty_array());
180 ClassFinalizer::FinalizeTypesInClass(empty_class);
172 empty_class.Finalize(); 181 empty_class.Finalize();
173 EXPECT_EQ(kObjectAlignment, empty_class.instance_size()); 182 EXPECT_EQ(kObjectAlignment, empty_class.instance_size());
174 Instance& instance = Instance::Handle(Instance::New(empty_class)); 183 Instance& instance = Instance::Handle(Instance::New(empty_class));
175 EXPECT_EQ(empty_class.raw(), instance.clazz()); 184 EXPECT_EQ(empty_class.raw(), instance.clazz());
176 185
177 class_name = Symbols::New("OneFieldClass"); 186 class_name = Symbols::New("OneFieldClass");
178 const Class& one_field_class = 187 const Class& one_field_class =
179 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 188 Class::Handle(CreateDummyClass(class_name, script));
180 189
181 // No functions and no super class for the OneFieldClass. 190 // No functions and no super class for the OneFieldClass.
182 const Array& one_fields = Array::Handle(Array::New(1)); 191 const Array& one_fields = Array::Handle(Array::New(1));
183 const String& field_name = String::Handle(Symbols::New("the_field")); 192 const String& field_name = String::Handle(Symbols::New("the_field"));
184 const Field& field = Field::Handle( 193 const Field& field = Field::Handle(
185 Field::New(field_name, false, false, false, one_field_class, 0)); 194 Field::New(field_name, false, false, false, one_field_class, 0));
186 one_fields.SetAt(0, field); 195 one_fields.SetAt(0, field);
187 one_field_class.SetFields(one_fields); 196 one_field_class.SetFields(one_fields);
197 ClassFinalizer::FinalizeTypesInClass(one_field_class);
188 one_field_class.Finalize(); 198 one_field_class.Finalize();
189 intptr_t header_size = sizeof(RawObject); 199 intptr_t header_size = sizeof(RawObject);
190 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), 200 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
191 one_field_class.instance_size()); 201 one_field_class.instance_size());
192 EXPECT_EQ(header_size, field.Offset()); 202 EXPECT_EQ(header_size, field.Offset());
193 EXPECT(!one_field_class.is_implemented()); 203 EXPECT(!one_field_class.is_implemented());
194 one_field_class.set_is_implemented(); 204 one_field_class.set_is_implemented();
195 EXPECT(one_field_class.is_implemented()); 205 EXPECT(one_field_class.is_implemented());
196 } 206 }
197 207
(...skipping 1968 matching lines...) Expand 10 before | Expand all | Expand 10 after
2166 EXPECT_EQ(1, var_c->index()); 2176 EXPECT_EQ(1, var_c->index());
2167 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, 2177 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2168 var_c->owner()->context_level()); // Adjusted context level. 2178 var_c->owner()->context_level()); // Adjusted context level.
2169 } 2179 }
2170 2180
2171 2181
2172 TEST_CASE(Closure) { 2182 TEST_CASE(Closure) {
2173 // Allocate the class first. 2183 // Allocate the class first.
2174 const String& class_name = String::Handle(Symbols::New("MyClass")); 2184 const String& class_name = String::Handle(Symbols::New("MyClass"));
2175 const Script& script = Script::Handle(); 2185 const Script& script = Script::Handle();
2176 const Class& cls = 2186 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
2177 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
2178 const Array& functions = Array::Handle(Array::New(1)); 2187 const Array& functions = Array::Handle(Array::New(1));
2179 2188
2180 const Context& context = Context::Handle(Context::New(0)); 2189 const Context& context = Context::Handle(Context::New(0));
2181 Function& parent = Function::Handle(); 2190 Function& parent = Function::Handle();
2182 const String& parent_name = String::Handle(Symbols::New("foo_papa")); 2191 const String& parent_name = String::Handle(Symbols::New("foo_papa"));
2183 parent = Function::New(parent_name, RawFunction::kRegularFunction, 2192 parent = Function::New(parent_name, RawFunction::kRegularFunction,
2184 false, false, false, false, cls, 0); 2193 false, false, false, false, cls, 0);
2185 functions.SetAt(0, parent); 2194 functions.SetAt(0, parent);
2186 cls.SetFunctions(functions); 2195 cls.SetFunctions(functions);
2187 2196
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2241 str3 = OneByteString::null(); 2250 str3 = OneByteString::null();
2242 EXPECT(str3.IsString()); 2251 EXPECT(str3.IsString());
2243 EXPECT(!str3.IsOneByteString()); 2252 EXPECT(!str3.IsOneByteString());
2244 } 2253 }
2245 2254
2246 2255
2247 static Function* CreateFunction(const char* name) { 2256 static Function* CreateFunction(const char* name) {
2248 const String& class_name = String::Handle(Symbols::New("ownerClass")); 2257 const String& class_name = String::Handle(Symbols::New("ownerClass"));
2249 const Script& script = Script::Handle(); 2258 const Script& script = Script::Handle();
2250 const Class& owner_class = 2259 const Class& owner_class =
2251 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 2260 Class::Handle(CreateDummyClass(class_name, script));
2252 const String& function_name = String::ZoneHandle(Symbols::New(name)); 2261 const String& function_name = String::ZoneHandle(Symbols::New(name));
2253 Function& function = Function::ZoneHandle( 2262 Function& function = Function::ZoneHandle(
2254 Function::New(function_name, RawFunction::kRegularFunction, 2263 Function::New(function_name, RawFunction::kRegularFunction,
2255 true, false, false, false, owner_class, 0)); 2264 true, false, false, false, owner_class, 0));
2256 return &function; 2265 return &function;
2257 } 2266 }
2258 2267
2259 2268
2260 // Test for Code and Instruction object creation. 2269 // Test for Code and Instruction object creation.
2261 TEST_CASE(Code) { 2270 TEST_CASE(Code) {
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
2413 EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5)); 2422 EXPECT_EQ(static_cast<uword>(80), pc_descs.PC(5));
2414 EXPECT_EQ(150, pc_descs.TokenPos(5)); 2423 EXPECT_EQ(150, pc_descs.TokenPos(5));
2415 EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0)); 2424 EXPECT_EQ(PcDescriptors::kOther, pc_descs.DescriptorKind(0));
2416 EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1)); 2425 EXPECT_EQ(PcDescriptors::kDeopt, pc_descs.DescriptorKind(1));
2417 } 2426 }
2418 2427
2419 2428
2420 static RawClass* CreateTestClass(const char* name) { 2429 static RawClass* CreateTestClass(const char* name) {
2421 const String& class_name = String::Handle(Symbols::New(name)); 2430 const String& class_name = String::Handle(Symbols::New(name));
2422 const Class& cls = Class::Handle( 2431 const Class& cls = Class::Handle(
2423 Class::New(class_name, Script::Handle(), Scanner::kDummyTokenIndex)); 2432 CreateDummyClass(class_name, Script::Handle()));
2424 return cls.raw(); 2433 return cls.raw();
2425 } 2434 }
2426 2435
2427 2436
2428 static RawField* CreateTestField(const char* name) { 2437 static RawField* CreateTestField(const char* name) {
2429 const Class& cls = Class::Handle(CreateTestClass("global:")); 2438 const Class& cls = Class::Handle(CreateTestClass("global:"));
2430 const String& field_name = String::Handle(Symbols::New(name)); 2439 const String& field_name = String::Handle(Symbols::New(name));
2431 const Field& field = 2440 const Field& field =
2432 Field::Handle(Field::New(field_name, true, false, false, cls, 0)); 2441 Field::Handle(Field::New(field_name, true, false, false, cls, 0));
2433 return field.raw(); 2442 return field.raw();
(...skipping 19 matching lines...) Expand all
2453 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); 2462 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw()));
2454 count++; 2463 count++;
2455 } 2464 }
2456 ASSERT(count == 2); 2465 ASSERT(count == 2);
2457 } 2466 }
2458 2467
2459 2468
2460 static RawFunction* GetDummyTarget(const char* name) { 2469 static RawFunction* GetDummyTarget(const char* name) {
2461 const String& function_name = String::Handle(Symbols::New(name)); 2470 const String& function_name = String::Handle(Symbols::New(name));
2462 const Class& cls = Class::Handle( 2471 const Class& cls = Class::Handle(
2463 Class::New(function_name, Script::Handle(), Scanner::kDummyTokenIndex)); 2472 CreateDummyClass(function_name, Script::Handle()));
2464 const bool is_static = false; 2473 const bool is_static = false;
2465 const bool is_const = false; 2474 const bool is_const = false;
2466 const bool is_abstract = false; 2475 const bool is_abstract = false;
2467 const bool is_external = false; 2476 const bool is_external = false;
2468 return Function::New(function_name, 2477 return Function::New(function_name,
2469 RawFunction::kRegularFunction, 2478 RawFunction::kRegularFunction,
2470 is_static, 2479 is_static,
2471 is_const, 2480 is_const,
2472 is_abstract, 2481 is_abstract,
2473 is_external, 2482 is_external,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 EXPECT_EQ(kSmiCid, test_class_ids[0]); 2535 EXPECT_EQ(kSmiCid, test_class_ids[0]);
2527 EXPECT_EQ(kSmiCid, test_class_ids[1]); 2536 EXPECT_EQ(kSmiCid, test_class_ids[1]);
2528 EXPECT_EQ(target1.raw(), test_target.raw()); 2537 EXPECT_EQ(target1.raw(), test_target.raw());
2529 } 2538 }
2530 2539
2531 2540
2532 TEST_CASE(SubtypeTestCache) { 2541 TEST_CASE(SubtypeTestCache) {
2533 String& class_name = String::Handle(Symbols::New("EmptyClass")); 2542 String& class_name = String::Handle(Symbols::New("EmptyClass"));
2534 Script& script = Script::Handle(); 2543 Script& script = Script::Handle();
2535 const Class& empty_class = 2544 const Class& empty_class =
2536 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 2545 Class::Handle(CreateDummyClass(class_name, script));
2537 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New()); 2546 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New());
2538 ASSERT(!cache.IsNull()); 2547 ASSERT(!cache.IsNull());
2539 EXPECT_EQ(0, cache.NumberOfChecks()); 2548 EXPECT_EQ(0, cache.NumberOfChecks());
2540 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2)); 2549 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2));
2541 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3)); 2550 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3));
2542 cache.AddCheck(empty_class.id(), targ_0, targ_1, Bool::True()); 2551 cache.AddCheck(empty_class.id(), targ_0, targ_1, Bool::True());
2543 EXPECT_EQ(1, cache.NumberOfChecks()); 2552 EXPECT_EQ(1, cache.NumberOfChecks());
2544 intptr_t test_class_id = -1; 2553 intptr_t test_class_id = -1;
2545 AbstractTypeArguments& test_targ_0 = AbstractTypeArguments::Handle(); 2554 AbstractTypeArguments& test_targ_0 = AbstractTypeArguments::Handle();
2546 AbstractTypeArguments& test_targ_1 = AbstractTypeArguments::Handle(); 2555 AbstractTypeArguments& test_targ_1 = AbstractTypeArguments::Handle();
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
3205 const Function& test7 = Function::Handle(GetFunction(class_a, "test7")); 3214 const Function& test7 = Function::Handle(GetFunction(class_a, "test7"));
3206 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint()); 3215 EXPECT_EQ(test1.SourceFingerprint(), test2.SourceFingerprint());
3207 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint()); 3216 EXPECT_NE(test1.SourceFingerprint(), test3.SourceFingerprint());
3208 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint()); 3217 EXPECT_NE(test3.SourceFingerprint(), test4.SourceFingerprint());
3209 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint()); 3218 EXPECT_NE(test4.SourceFingerprint(), test5.SourceFingerprint());
3210 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint()); 3219 EXPECT_NE(test5.SourceFingerprint(), test6.SourceFingerprint());
3211 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint()); 3220 EXPECT_EQ(test6.SourceFingerprint(), test7.SourceFingerprint());
3212 } 3221 }
3213 3222
3214 } // namespace dart 3223 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698