| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |