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

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

Issue 10831142: Associate the correct type to method receivers (instead of Dynamic type). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/object.h" 9 #include "vm/object.h"
10 #include "vm/object_store.h" 10 #include "vm/object_store.h"
(...skipping 13 matching lines...) Expand all
24 const Array& no_fields = Array::Handle(Array::Empty()); 24 const Array& no_fields = Array::Handle(Array::Empty());
25 cls.SetFields(no_fields); 25 cls.SetFields(no_fields);
26 26
27 // Create and populate the function arrays. 27 // Create and populate the function arrays.
28 const Array& functions = Array::Handle(Array::New(6)); 28 const Array& functions = Array::Handle(Array::New(6));
29 Function& function = Function::Handle(); 29 Function& function = Function::Handle();
30 String& function_name = String::Handle(); 30 String& function_name = String::Handle();
31 function_name = Symbols::New("foo"); 31 function_name = Symbols::New("foo");
32 function = Function::New( 32 function = Function::New(
33 function_name, RawFunction::kRegularFunction, 33 function_name, RawFunction::kRegularFunction,
34 false, false, false, false, 0); 34 false, false, false, false, cls, 0);
35 functions.SetAt(0, function); 35 functions.SetAt(0, function);
36 function_name = Symbols::New("bar"); 36 function_name = Symbols::New("bar");
37 function = Function::New( 37 function = Function::New(
38 function_name, RawFunction::kRegularFunction, 38 function_name, RawFunction::kRegularFunction,
39 false, false, false, false, 0); 39 false, false, false, false, cls, 0);
40 40
41 const int kNumFixedParameters = 2; 41 const int kNumFixedParameters = 2;
42 const int kNumOptionalParameters = 3; 42 const int kNumOptionalParameters = 3;
43 function.set_num_fixed_parameters(kNumFixedParameters); 43 function.set_num_fixed_parameters(kNumFixedParameters);
44 function.set_num_optional_parameters(kNumOptionalParameters); 44 function.set_num_optional_parameters(kNumOptionalParameters);
45 functions.SetAt(1, function); 45 functions.SetAt(1, function);
46 46
47 function_name = Symbols::New("baz"); 47 function_name = Symbols::New("baz");
48 function = Function::New( 48 function = Function::New(
49 function_name, RawFunction::kRegularFunction, 49 function_name, RawFunction::kRegularFunction,
50 false, false, false, false, 0); 50 false, false, false, false, cls, 0);
51 functions.SetAt(2, function); 51 functions.SetAt(2, function);
52 52
53 function_name = Symbols::New("Foo"); 53 function_name = Symbols::New("Foo");
54 function = Function::New( 54 function = Function::New(
55 function_name, RawFunction::kRegularFunction, 55 function_name, RawFunction::kRegularFunction,
56 true, false, false, false, 0); 56 true, false, false, false, cls, 0);
57 57
58 functions.SetAt(3, function); 58 functions.SetAt(3, function);
59 function_name = Symbols::New("Bar"); 59 function_name = Symbols::New("Bar");
60 function = Function::New( 60 function = Function::New(
61 function_name, RawFunction::kRegularFunction, 61 function_name, RawFunction::kRegularFunction,
62 true, false, false, false, 0); 62 true, false, false, false, cls, 0);
63 functions.SetAt(4, function); 63 functions.SetAt(4, function);
64 function_name = Symbols::New("BaZ"); 64 function_name = Symbols::New("BaZ");
65 function = Function::New( 65 function = Function::New(
66 function_name, RawFunction::kRegularFunction, 66 function_name, RawFunction::kRegularFunction,
67 true, false, false, false, 0); 67 true, false, false, false, cls, 0);
68 functions.SetAt(5, function); 68 functions.SetAt(5, function);
69 69
70 // Setup the functions in the class. 70 // Setup the functions in the class.
71 cls.SetFunctions(functions); 71 cls.SetFunctions(functions);
72 72
73 function_name = String::New("Foo"); 73 function_name = String::New("Foo");
74 function = cls.LookupDynamicFunction(function_name); 74 function = cls.LookupDynamicFunction(function_name);
75 EXPECT(function.IsNull()); 75 EXPECT(function.IsNull());
76 function = cls.LookupStaticFunction(function_name); 76 function = cls.LookupStaticFunction(function_name);
77 EXPECT(!function.IsNull()); 77 EXPECT(!function.IsNull());
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 Instance& instance = Instance::Handle(Instance::New(empty_class)); 178 Instance& instance = Instance::Handle(Instance::New(empty_class));
179 EXPECT_EQ(empty_class.raw(), instance.clazz()); 179 EXPECT_EQ(empty_class.raw(), instance.clazz());
180 180
181 class_name = Symbols::New("OneFieldClass"); 181 class_name = Symbols::New("OneFieldClass");
182 const Class& one_field_class = 182 const Class& one_field_class =
183 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 183 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
184 184
185 // No functions and no super class for the OneFieldClass. 185 // No functions and no super class for the OneFieldClass.
186 const Array& one_fields = Array::Handle(Array::New(1)); 186 const Array& one_fields = Array::Handle(Array::New(1));
187 const String& field_name = String::Handle(Symbols::New("the_field")); 187 const String& field_name = String::Handle(Symbols::New("the_field"));
188 const Field& field = 188 const Field& field = Field::Handle(
189 Field::Handle(Field::New(field_name, false, false, false, 0)); 189 Field::New(field_name, false, false, false, one_field_class, 0));
190 one_fields.SetAt(0, field); 190 one_fields.SetAt(0, field);
191 one_field_class.SetFields(one_fields); 191 one_field_class.SetFields(one_fields);
192 one_field_class.Finalize(); 192 one_field_class.Finalize();
193 intptr_t header_size = sizeof(RawObject); 193 intptr_t header_size = sizeof(RawObject);
194 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), 194 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
195 one_field_class.instance_size()); 195 one_field_class.instance_size());
196 EXPECT_EQ(header_size, field.Offset()); 196 EXPECT_EQ(header_size, field.Offset());
197 } 197 }
198 198
199 199
(...skipping 2126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 const String& class_name = String::Handle(Symbols::New("MyClass")); 2326 const String& class_name = String::Handle(Symbols::New("MyClass"));
2327 const Script& script = Script::Handle(); 2327 const Script& script = Script::Handle();
2328 const Class& cls = 2328 const Class& cls =
2329 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex)); 2329 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
2330 const Array& functions = Array::Handle(Array::New(1)); 2330 const Array& functions = Array::Handle(Array::New(1));
2331 2331
2332 const Context& context = Context::Handle(Context::New(0)); 2332 const Context& context = Context::Handle(Context::New(0));
2333 Function& parent = Function::Handle(); 2333 Function& parent = Function::Handle();
2334 const String& parent_name = String::Handle(Symbols::New("foo_papa")); 2334 const String& parent_name = String::Handle(Symbols::New("foo_papa"));
2335 parent = Function::New(parent_name, RawFunction::kRegularFunction, 2335 parent = Function::New(parent_name, RawFunction::kRegularFunction,
2336 false, false, false, false, 0); 2336 false, false, false, false, cls, 0);
2337 functions.SetAt(0, parent); 2337 functions.SetAt(0, parent);
2338 cls.SetFunctions(functions); 2338 cls.SetFunctions(functions);
2339 2339
2340 Function& function = Function::Handle(); 2340 Function& function = Function::Handle();
2341 const String& function_name = String::Handle(Symbols::New("foo")); 2341 const String& function_name = String::Handle(Symbols::New("foo"));
2342 function = Function::NewClosureFunction(function_name, parent, 0); 2342 function = Function::NewClosureFunction(function_name, parent, 0);
2343 const Class& signature_class = Class::Handle( 2343 const Class& signature_class = Class::Handle(
2344 Class::NewSignatureClass(function_name, function, script)); 2344 Class::NewSignatureClass(function_name, function, script));
2345 const Closure& closure = Closure::Handle(Closure::New(function, context)); 2345 const Closure& closure = Closure::Handle(Closure::New(function, context));
2346 const Class& closure_class = Class::Handle(closure.clazz()); 2346 const Class& closure_class = Class::Handle(closure.clazz());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 str3 = OneByteString::null(); 2393 str3 = OneByteString::null();
2394 EXPECT(str3.IsString()); 2394 EXPECT(str3.IsString());
2395 EXPECT(!str3.IsOneByteString()); 2395 EXPECT(!str3.IsOneByteString());
2396 } 2396 }
2397 2397
2398 2398
2399 // only ia32 and x64 can run execution tests. 2399 // only ia32 and x64 can run execution tests.
2400 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) 2400 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
2401 2401
2402 static Function* CreateFunction(const char* name) { 2402 static Function* CreateFunction(const char* name) {
2403 const String& class_name = String::Handle(Symbols::New("ownerClass"));
2404 const Script& script = Script::Handle();
2405 const Class& owner_class =
2406 Class::Handle(Class::New(class_name, script, Scanner::kDummyTokenIndex));
2403 const String& function_name = String::ZoneHandle(Symbols::New(name)); 2407 const String& function_name = String::ZoneHandle(Symbols::New(name));
2404 Function& function = Function::ZoneHandle( 2408 Function& function = Function::ZoneHandle(
2405 Function::New(function_name, RawFunction::kRegularFunction, 2409 Function::New(function_name, RawFunction::kRegularFunction,
2406 true, false, false, false, 0)); 2410 true, false, false, false, owner_class, 0));
2407 return &function; 2411 return &function;
2408 } 2412 }
2409 2413
2410 // Test for Code and Instruction object creation. 2414 // Test for Code and Instruction object creation.
2411 TEST_CASE(Code) { 2415 TEST_CASE(Code) {
2412 extern void GenerateIncrement(Assembler* assembler); 2416 extern void GenerateIncrement(Assembler* assembler);
2413 Assembler _assembler_; 2417 Assembler _assembler_;
2414 GenerateIncrement(&_assembler_); 2418 GenerateIncrement(&_assembler_);
2415 Code& code = Code::Handle(Code::FinalizeCode( 2419 Code& code = Code::Handle(Code::FinalizeCode(
2416 *CreateFunction("Test_Code"), &_assembler_)); 2420 *CreateFunction("Test_Code"), &_assembler_));
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2547 const Class& cls = Class::Handle( 2551 const Class& cls = Class::Handle(
2548 Class::New(class_name, Script::Handle(), Scanner::kDummyTokenIndex)); 2552 Class::New(class_name, Script::Handle(), Scanner::kDummyTokenIndex));
2549 return cls.raw(); 2553 return cls.raw();
2550 } 2554 }
2551 2555
2552 2556
2553 static RawField* CreateTestField(const char* name) { 2557 static RawField* CreateTestField(const char* name) {
2554 const Class& cls = Class::Handle(CreateTestClass("global:")); 2558 const Class& cls = Class::Handle(CreateTestClass("global:"));
2555 const String& field_name = String::Handle(Symbols::New(name)); 2559 const String& field_name = String::Handle(Symbols::New(name));
2556 const Field& field = 2560 const Field& field =
2557 Field::Handle(Field::New(field_name, true, false, false, 0)); 2561 Field::Handle(Field::New(field_name, true, false, false, cls, 0));
2558 field.set_owner(cls);
2559 return field.raw(); 2562 return field.raw();
2560 } 2563 }
2561 2564
2562 2565
2563 TEST_CASE(ClassDictionaryIterator) { 2566 TEST_CASE(ClassDictionaryIterator) {
2564 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6")); 2567 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6"));
2565 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4")); 2568 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4"));
2566 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8")); 2569 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8"));
2567 Field& tee = Field::ZoneHandle(CreateTestField("TEE")); 2570 Field& tee = Field::ZoneHandle(CreateTestField("TEE"));
2568 String& url = String::ZoneHandle(String::New("SBB")); 2571 String& url = String::ZoneHandle(String::New("SBB"));
2569 Library& lib = Library::Handle(Library::New(url)); 2572 Library& lib = Library::Handle(Library::New(url));
2570 lib.AddClass(ae66); 2573 lib.AddClass(ae66);
2571 lib.AddObject(ce68, String::ZoneHandle(ce68.name())); 2574 lib.AddObject(ce68, String::ZoneHandle(ce68.name()));
2572 lib.AddClass(re44); 2575 lib.AddClass(re44);
2573 lib.AddObject(tee, String::ZoneHandle(tee.name())); 2576 lib.AddObject(tee, String::ZoneHandle(tee.name()));
2574 ClassDictionaryIterator iterator(lib); 2577 ClassDictionaryIterator iterator(lib);
2575 int count = 0; 2578 int count = 0;
2576 Class& cls = Class::Handle(); 2579 Class& cls = Class::Handle();
2577 while (iterator.HasNext()) { 2580 while (iterator.HasNext()) {
2578 cls = iterator.GetNextClass(); 2581 cls = iterator.GetNextClass();
2579 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); 2582 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw()));
2580 count++; 2583 count++;
2581 } 2584 }
2582 ASSERT(count == 2); 2585 ASSERT(count == 2);
2583 } 2586 }
2584 2587
2585 2588
2586 static RawFunction* GetDummyTarget(const char* name) { 2589 static RawFunction* GetDummyTarget(const char* name) {
2587 const String& function_name = String::Handle(Symbols::New(name)); 2590 const String& function_name = String::Handle(Symbols::New(name));
2591 const Class& cls = Class::Handle(
2592 Class::New(function_name, Script::Handle(), Scanner::kDummyTokenIndex));
2588 const bool is_static = false; 2593 const bool is_static = false;
2589 const bool is_const = false; 2594 const bool is_const = false;
2590 const bool is_abstract = false; 2595 const bool is_abstract = false;
2591 const bool is_external = false; 2596 const bool is_external = false;
2592 return Function::New(function_name, 2597 return Function::New(function_name,
2593 RawFunction::kRegularFunction, 2598 RawFunction::kRegularFunction,
2594 is_static, 2599 is_static,
2595 is_const, 2600 is_const,
2596 is_abstract, 2601 is_abstract,
2597 is_external, 2602 is_external,
2603 cls,
2598 0); 2604 0);
2599 } 2605 }
2600 2606
2601 2607
2602 TEST_CASE(ICData) { 2608 TEST_CASE(ICData) {
2603 Function& function = Function::Handle(GetDummyTarget("Bern")); 2609 Function& function = Function::Handle(GetDummyTarget("Bern"));
2604 const intptr_t id = 12; 2610 const intptr_t id = 12;
2605 const intptr_t num_args_tested = 1; 2611 const intptr_t num_args_tested = 1;
2606 const String& target_name = String::Handle(String::New("Thun")); 2612 const String& target_name = String::Handle(String::New("Thun"));
2607 ICData& o1 = ICData::Handle(); 2613 ICData& o1 = ICData::Handle();
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2798 2804
2799 2805
2800 TEST_CASE(ArrayNew_Overflow_Crash) { 2806 TEST_CASE(ArrayNew_Overflow_Crash) {
2801 Array::Handle(Array::New(Array::kMaxElements + 1)); 2807 Array::Handle(Array::New(Array::kMaxElements + 1));
2802 } 2808 }
2803 2809
2804 2810
2805 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 2811 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
2806 2812
2807 } // namespace dart 2813 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698