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/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 // These are initialized to a value that will force a illegal memory access if | 82 // These are initialized to a value that will force a illegal memory access if |
83 // they are being used. | 83 // they are being used. |
84 #if defined(RAW_NULL) | 84 #if defined(RAW_NULL) |
85 #error RAW_NULL should not be defined. | 85 #error RAW_NULL should not be defined. |
86 #endif | 86 #endif |
87 #define RAW_NULL kHeapObjectTag | 87 #define RAW_NULL kHeapObjectTag |
88 Object* Object::null_object_ = NULL; | 88 Object* Object::null_object_ = NULL; |
89 Array* Object::null_array_ = NULL; | 89 Array* Object::null_array_ = NULL; |
90 String* Object::null_string_ = NULL; | 90 String* Object::null_string_ = NULL; |
91 Instance* Object::null_instance_ = NULL; | 91 Instance* Object::null_instance_ = NULL; |
92 AbstractTypeArguments* Object::null_abstract_type_arguments_ = NULL; | 92 TypeArguments* Object::null_type_arguments_ = NULL; |
93 Array* Object::empty_array_ = NULL; | 93 Array* Object::empty_array_ = NULL; |
94 PcDescriptors* Object::empty_descriptors_ = NULL; | 94 PcDescriptors* Object::empty_descriptors_ = NULL; |
95 Instance* Object::sentinel_ = NULL; | 95 Instance* Object::sentinel_ = NULL; |
96 Instance* Object::transition_sentinel_ = NULL; | 96 Instance* Object::transition_sentinel_ = NULL; |
97 Instance* Object::unknown_constant_ = NULL; | 97 Instance* Object::unknown_constant_ = NULL; |
98 Instance* Object::non_constant_ = NULL; | 98 Instance* Object::non_constant_ = NULL; |
99 Bool* Object::bool_true_ = NULL; | 99 Bool* Object::bool_true_ = NULL; |
100 Bool* Object::bool_false_ = NULL; | 100 Bool* Object::bool_false_ = NULL; |
101 Smi* Object::smi_illegal_cid_ = NULL; | 101 Smi* Object::smi_illegal_cid_ = NULL; |
102 LanguageError* Object::snapshot_writer_error_ = NULL; | 102 LanguageError* Object::snapshot_writer_error_ = NULL; |
103 LanguageError* Object::branch_offset_error_ = NULL; | 103 LanguageError* Object::branch_offset_error_ = NULL; |
104 | 104 |
105 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL); | 105 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL); |
106 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 106 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
107 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 107 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
108 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 108 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
109 RawType* Object::dynamic_type_ = reinterpret_cast<RawType*>(RAW_NULL); | 109 RawType* Object::dynamic_type_ = reinterpret_cast<RawType*>(RAW_NULL); |
110 RawType* Object::void_type_ = reinterpret_cast<RawType*>(RAW_NULL); | 110 RawType* Object::void_type_ = reinterpret_cast<RawType*>(RAW_NULL); |
111 RawClass* Object::unresolved_class_class_ = | 111 RawClass* Object::unresolved_class_class_ = |
112 reinterpret_cast<RawClass*>(RAW_NULL); | 112 reinterpret_cast<RawClass*>(RAW_NULL); |
113 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 113 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
114 RawClass* Object::instantiated_type_arguments_class_ = | |
115 reinterpret_cast<RawClass*>(RAW_NULL); | |
116 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 114 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
117 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 115 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
118 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 116 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
119 RawClass* Object::redirection_data_class_ = | 117 RawClass* Object::redirection_data_class_ = |
120 reinterpret_cast<RawClass*>(RAW_NULL); | 118 reinterpret_cast<RawClass*>(RAW_NULL); |
121 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 119 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
122 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 120 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
123 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 121 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
124 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 122 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
125 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 123 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
440 } | 438 } |
441 | 439 |
442 Isolate* isolate = Isolate::Current(); | 440 Isolate* isolate = Isolate::Current(); |
443 Heap* heap = isolate->heap(); | 441 Heap* heap = isolate->heap(); |
444 | 442 |
445 // Allocate the read only object handles here. | 443 // Allocate the read only object handles here. |
446 null_object_ = Object::ReadOnlyHandle(); | 444 null_object_ = Object::ReadOnlyHandle(); |
447 null_array_ = Array::ReadOnlyHandle(); | 445 null_array_ = Array::ReadOnlyHandle(); |
448 null_string_ = String::ReadOnlyHandle(); | 446 null_string_ = String::ReadOnlyHandle(); |
449 null_instance_ = Instance::ReadOnlyHandle(); | 447 null_instance_ = Instance::ReadOnlyHandle(); |
450 null_abstract_type_arguments_ = AbstractTypeArguments::ReadOnlyHandle(); | 448 null_type_arguments_ = TypeArguments::ReadOnlyHandle(); |
451 empty_array_ = Array::ReadOnlyHandle(); | 449 empty_array_ = Array::ReadOnlyHandle(); |
452 empty_descriptors_ = PcDescriptors::ReadOnlyHandle(); | 450 empty_descriptors_ = PcDescriptors::ReadOnlyHandle(); |
453 sentinel_ = Instance::ReadOnlyHandle(); | 451 sentinel_ = Instance::ReadOnlyHandle(); |
454 transition_sentinel_ = Instance::ReadOnlyHandle(); | 452 transition_sentinel_ = Instance::ReadOnlyHandle(); |
455 unknown_constant_ = Instance::ReadOnlyHandle(); | 453 unknown_constant_ = Instance::ReadOnlyHandle(); |
456 non_constant_ = Instance::ReadOnlyHandle(); | 454 non_constant_ = Instance::ReadOnlyHandle(); |
457 bool_true_ = Bool::ReadOnlyHandle(); | 455 bool_true_ = Bool::ReadOnlyHandle(); |
458 bool_false_ = Bool::ReadOnlyHandle(); | 456 bool_false_ = Bool::ReadOnlyHandle(); |
459 smi_illegal_cid_ = Smi::ReadOnlyHandle(); | 457 smi_illegal_cid_ = Smi::ReadOnlyHandle(); |
460 snapshot_writer_error_ = LanguageError::ReadOnlyHandle(); | 458 snapshot_writer_error_ = LanguageError::ReadOnlyHandle(); |
461 branch_offset_error_ = LanguageError::ReadOnlyHandle(); | 459 branch_offset_error_ = LanguageError::ReadOnlyHandle(); |
462 | 460 |
463 | 461 |
464 // Allocate and initialize the null instance. | 462 // Allocate and initialize the null instance. |
465 // 'null_' must be the first object allocated as it is used in allocation to | 463 // 'null_' must be the first object allocated as it is used in allocation to |
466 // clear the object. | 464 // clear the object. |
467 { | 465 { |
468 uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld); | 466 uword address = heap->Allocate(Instance::InstanceSize(), Heap::kOld); |
469 null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag); | 467 null_ = reinterpret_cast<RawInstance*>(address + kHeapObjectTag); |
470 // The call below is using 'null_' to initialize itself. | 468 // The call below is using 'null_' to initialize itself. |
471 InitializeObject(address, kNullCid, Instance::InstanceSize()); | 469 InitializeObject(address, kNullCid, Instance::InstanceSize()); |
472 } | 470 } |
473 | 471 |
474 *null_object_ = Object::null(); | 472 *null_object_ = Object::null(); |
475 *null_array_ = Array::null(); | 473 *null_array_ = Array::null(); |
476 *null_string_ = String::null(); | 474 *null_string_ = String::null(); |
477 *null_instance_ = Instance::null(); | 475 *null_instance_ = Instance::null(); |
478 *null_abstract_type_arguments_ = AbstractTypeArguments::null(); | 476 *null_type_arguments_ = TypeArguments::null(); |
479 | 477 |
480 // Initialize the empty array handle to null_ in order to be able to check | 478 // Initialize the empty array handle to null_ in order to be able to check |
481 // if the empty array was allocated (RAW_NULL is not available). | 479 // if the empty array was allocated (RAW_NULL is not available). |
482 *empty_array_ = Array::null(); | 480 *empty_array_ = Array::null(); |
483 | 481 |
484 Class& cls = Class::Handle(); | 482 Class& cls = Class::Handle(); |
485 | 483 |
486 // Allocate and initialize the class class. | 484 // Allocate and initialize the class class. |
487 { | 485 { |
488 intptr_t size = Class::InstanceSize(); | 486 intptr_t size = Class::InstanceSize(); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
540 Object::Allocate(kNullCid, Instance::InstanceSize(), Heap::kOld); | 538 Object::Allocate(kNullCid, Instance::InstanceSize(), Heap::kOld); |
541 } | 539 } |
542 | 540 |
543 // Allocate the remaining VM internal classes. | 541 // Allocate the remaining VM internal classes. |
544 cls = Class::New<UnresolvedClass>(); | 542 cls = Class::New<UnresolvedClass>(); |
545 unresolved_class_class_ = cls.raw(); | 543 unresolved_class_class_ = cls.raw(); |
546 | 544 |
547 cls = Class::New<TypeArguments>(); | 545 cls = Class::New<TypeArguments>(); |
548 type_arguments_class_ = cls.raw(); | 546 type_arguments_class_ = cls.raw(); |
549 | 547 |
550 cls = Class::New<InstantiatedTypeArguments>(); | |
551 instantiated_type_arguments_class_ = cls.raw(); | |
552 | |
553 cls = Class::New<PatchClass>(); | 548 cls = Class::New<PatchClass>(); |
554 patch_class_class_ = cls.raw(); | 549 patch_class_class_ = cls.raw(); |
555 | 550 |
556 cls = Class::New<Function>(); | 551 cls = Class::New<Function>(); |
557 function_class_ = cls.raw(); | 552 function_class_ = cls.raw(); |
558 | 553 |
559 cls = Class::New<ClosureData>(); | 554 cls = Class::New<ClosureData>(); |
560 closure_data_class_ = cls.raw(); | 555 closure_data_class_ = cls.raw(); |
561 | 556 |
562 cls = Class::New<RedirectionData>(); | 557 cls = Class::New<RedirectionData>(); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
712 error_str = String::New("Branch offset overflow"); | 707 error_str = String::New("Branch offset overflow"); |
713 *branch_offset_error_ = LanguageError::New(error_str); | 708 *branch_offset_error_ = LanguageError::New(error_str); |
714 | 709 |
715 ASSERT(!null_object_->IsSmi()); | 710 ASSERT(!null_object_->IsSmi()); |
716 ASSERT(!null_array_->IsSmi()); | 711 ASSERT(!null_array_->IsSmi()); |
717 ASSERT(null_array_->IsArray()); | 712 ASSERT(null_array_->IsArray()); |
718 ASSERT(!null_string_->IsSmi()); | 713 ASSERT(!null_string_->IsSmi()); |
719 ASSERT(null_string_->IsString()); | 714 ASSERT(null_string_->IsString()); |
720 ASSERT(!null_instance_->IsSmi()); | 715 ASSERT(!null_instance_->IsSmi()); |
721 ASSERT(null_instance_->IsInstance()); | 716 ASSERT(null_instance_->IsInstance()); |
722 ASSERT(!null_abstract_type_arguments_->IsSmi()); | 717 ASSERT(!null_type_arguments_->IsSmi()); |
723 ASSERT(null_abstract_type_arguments_->IsAbstractTypeArguments()); | 718 ASSERT(null_type_arguments_->IsTypeArguments()); |
724 ASSERT(!empty_array_->IsSmi()); | 719 ASSERT(!empty_array_->IsSmi()); |
725 ASSERT(empty_array_->IsArray()); | 720 ASSERT(empty_array_->IsArray()); |
726 ASSERT(!sentinel_->IsSmi()); | 721 ASSERT(!sentinel_->IsSmi()); |
727 ASSERT(sentinel_->IsInstance()); | 722 ASSERT(sentinel_->IsInstance()); |
728 ASSERT(!transition_sentinel_->IsSmi()); | 723 ASSERT(!transition_sentinel_->IsSmi()); |
729 ASSERT(transition_sentinel_->IsInstance()); | 724 ASSERT(transition_sentinel_->IsInstance()); |
730 ASSERT(!unknown_constant_->IsSmi()); | 725 ASSERT(!unknown_constant_->IsSmi()); |
731 ASSERT(unknown_constant_->IsInstance()); | 726 ASSERT(unknown_constant_->IsInstance()); |
732 ASSERT(!non_constant_->IsSmi()); | 727 ASSERT(!non_constant_->IsSmi()); |
733 ASSERT(non_constant_->IsInstance()); | 728 ASSERT(non_constant_->IsInstance()); |
(...skipping 15 matching lines...) Expand all Loading... | |
749 | 744 |
750 void Object::RegisterSingletonClassNames() { | 745 void Object::RegisterSingletonClassNames() { |
751 Class& cls = Class::Handle(); | 746 Class& cls = Class::Handle(); |
752 | 747 |
753 // Set up names for all VM singleton classes. | 748 // Set up names for all VM singleton classes. |
754 SET_CLASS_NAME(class, Class); | 749 SET_CLASS_NAME(class, Class); |
755 SET_CLASS_NAME(dynamic, Dynamic); | 750 SET_CLASS_NAME(dynamic, Dynamic); |
756 SET_CLASS_NAME(void, Void); | 751 SET_CLASS_NAME(void, Void); |
757 SET_CLASS_NAME(unresolved_class, UnresolvedClass); | 752 SET_CLASS_NAME(unresolved_class, UnresolvedClass); |
758 SET_CLASS_NAME(type_arguments, TypeArguments); | 753 SET_CLASS_NAME(type_arguments, TypeArguments); |
759 SET_CLASS_NAME(instantiated_type_arguments, InstantiatedTypeArguments); | |
760 SET_CLASS_NAME(patch_class, PatchClass); | 754 SET_CLASS_NAME(patch_class, PatchClass); |
761 SET_CLASS_NAME(function, Function); | 755 SET_CLASS_NAME(function, Function); |
762 SET_CLASS_NAME(closure_data, ClosureData); | 756 SET_CLASS_NAME(closure_data, ClosureData); |
763 SET_CLASS_NAME(redirection_data, RedirectionData); | 757 SET_CLASS_NAME(redirection_data, RedirectionData); |
764 SET_CLASS_NAME(field, Field); | 758 SET_CLASS_NAME(field, Field); |
765 SET_CLASS_NAME(literal_token, LiteralToken); | 759 SET_CLASS_NAME(literal_token, LiteralToken); |
766 SET_CLASS_NAME(token_stream, TokenStream); | 760 SET_CLASS_NAME(token_stream, TokenStream); |
767 SET_CLASS_NAME(script, Script); | 761 SET_CLASS_NAME(script, Script); |
768 SET_CLASS_NAME(library, LibraryClass); | 762 SET_CLASS_NAME(library, LibraryClass); |
769 SET_CLASS_NAME(library_prefix, LibraryPrefix); | 763 SET_CLASS_NAME(library_prefix, LibraryPrefix); |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1620 | 1614 |
1621 // Return the still unfinalized signature type. | 1615 // Return the still unfinalized signature type. |
1622 ASSERT(!signature_type.IsFinalized()); | 1616 ASSERT(!signature_type.IsFinalized()); |
1623 return signature_type.raw(); | 1617 return signature_type.raw(); |
1624 } | 1618 } |
1625 | 1619 |
1626 | 1620 |
1627 RawAbstractType* Class::RareType() const { | 1621 RawAbstractType* Class::RareType() const { |
1628 const Type& type = Type::Handle(Type::New( | 1622 const Type& type = Type::Handle(Type::New( |
1629 *this, | 1623 *this, |
1630 Object::null_abstract_type_arguments(), | 1624 Object::null_type_arguments(), |
1631 Scanner::kNoSourcePos)); | 1625 Scanner::kNoSourcePos)); |
1632 return ClassFinalizer::FinalizeType(*this, | 1626 return ClassFinalizer::FinalizeType(*this, |
1633 type, | 1627 type, |
1634 ClassFinalizer::kCanonicalize); | 1628 ClassFinalizer::kCanonicalize); |
1635 } | 1629 } |
1636 | 1630 |
1637 | 1631 |
1638 RawAbstractType* Class::DeclarationType() const { | 1632 RawAbstractType* Class::DeclarationType() const { |
1639 const TypeArguments& args = TypeArguments::Handle(type_parameters()); | 1633 const TypeArguments& args = TypeArguments::Handle(type_parameters()); |
1640 const Type& type = Type::Handle(Type::New( | 1634 const Type& type = Type::Handle(Type::New( |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2027 if (!FLAG_overlap_type_arguments || | 2021 if (!FLAG_overlap_type_arguments || |
2028 (num_type_params == 0) || | 2022 (num_type_params == 0) || |
2029 (super_type() == AbstractType::null()) || | 2023 (super_type() == AbstractType::null()) || |
2030 (super_type() == isolate->object_store()->object_type())) { | 2024 (super_type() == isolate->object_store()->object_type())) { |
2031 set_num_own_type_arguments(num_type_params); | 2025 set_num_own_type_arguments(num_type_params); |
2032 return num_type_params; | 2026 return num_type_params; |
2033 } | 2027 } |
2034 ASSERT(!IsMixinApplication() || is_mixin_type_applied()); | 2028 ASSERT(!IsMixinApplication() || is_mixin_type_applied()); |
2035 const AbstractType& sup_type = AbstractType::Handle(isolate, super_type()); | 2029 const AbstractType& sup_type = AbstractType::Handle(isolate, super_type()); |
2036 ASSERT(sup_type.IsResolved()); | 2030 ASSERT(sup_type.IsResolved()); |
2037 const AbstractTypeArguments& sup_type_args = | 2031 const TypeArguments& sup_type_args = |
2038 AbstractTypeArguments::Handle(isolate, sup_type.arguments()); | 2032 TypeArguments::Handle(isolate, sup_type.arguments()); |
2039 if (sup_type_args.IsNull()) { | 2033 if (sup_type_args.IsNull()) { |
2040 // The super type is raw or the super class is non generic. | 2034 // The super type is raw or the super class is non generic. |
2041 // In either case, overlapping is not possible. | 2035 // In either case, overlapping is not possible. |
2042 set_num_own_type_arguments(num_type_params); | 2036 set_num_own_type_arguments(num_type_params); |
2043 return num_type_params; | 2037 return num_type_params; |
2044 } | 2038 } |
2045 const intptr_t num_sup_type_args = sup_type_args.Length(); | 2039 const intptr_t num_sup_type_args = sup_type_args.Length(); |
2046 // At this point, the super type may or may not be finalized. In either case, | 2040 // At this point, the super type may or may not be finalized. In either case, |
2047 // the result of this function must remain the same. | 2041 // the result of this function must remain the same. |
2048 // The value of num_sup_type_args may increase when the super type is | 2042 // The value of num_sup_type_args may increase when the super type is |
2049 // finalized, but the last num_sup_type_args type arguments will not be | 2043 // finalized, but the last num_sup_type_args type arguments will not be |
2050 // modified by finalization, only shifted to higher indices in the vector. | 2044 // modified by finalization, only shifted to higher indices in the vector. |
2051 // They may however get wrapped in a BoundedType, which we skip. | 2045 // They may however get wrapped in a BoundedType, which we skip. |
2052 const AbstractTypeArguments& type_params = | 2046 const TypeArguments& type_params = |
2053 AbstractTypeArguments::Handle(isolate, type_parameters()); | 2047 TypeArguments::Handle(isolate, type_parameters()); |
2054 // Determine the maximum overlap of a prefix of the vector consisting of the | 2048 // Determine the maximum overlap of a prefix of the vector consisting of the |
2055 // type parameters of this class with a suffix of the vector consisting of the | 2049 // type parameters of this class with a suffix of the vector consisting of the |
2056 // type arguments of the super type of this class. | 2050 // type arguments of the super type of this class. |
2057 // The number of own type arguments of this class is the number of its type | 2051 // The number of own type arguments of this class is the number of its type |
2058 // parameters minus the number of type arguments in the overlap. | 2052 // parameters minus the number of type arguments in the overlap. |
2059 // Attempt to overlap the whole vector of type parameters; reduce the size | 2053 // Attempt to overlap the whole vector of type parameters; reduce the size |
2060 // of the vector (keeping the first type parameter) until it fits or until | 2054 // of the vector (keeping the first type parameter) until it fits or until |
2061 // its size is zero. | 2055 // its size is zero. |
2062 TypeParameter& type_param = TypeParameter::Handle(isolate); | 2056 TypeParameter& type_param = TypeParameter::Handle(isolate); |
2063 AbstractType& sup_type_arg = AbstractType::Handle(isolate); | 2057 AbstractType& sup_type_arg = AbstractType::Handle(isolate); |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2934 case kDynamicCid: | 2928 case kDynamicCid: |
2935 return Symbols::Dynamic().raw(); | 2929 return Symbols::Dynamic().raw(); |
2936 case kVoidCid: | 2930 case kVoidCid: |
2937 return Symbols::Void().raw(); | 2931 return Symbols::Void().raw(); |
2938 case kClassCid: | 2932 case kClassCid: |
2939 return Symbols::Class().raw(); | 2933 return Symbols::Class().raw(); |
2940 case kUnresolvedClassCid: | 2934 case kUnresolvedClassCid: |
2941 return Symbols::UnresolvedClass().raw(); | 2935 return Symbols::UnresolvedClass().raw(); |
2942 case kTypeArgumentsCid: | 2936 case kTypeArgumentsCid: |
2943 return Symbols::TypeArguments().raw(); | 2937 return Symbols::TypeArguments().raw(); |
2944 case kInstantiatedTypeArgumentsCid: | |
2945 return Symbols::InstantiatedTypeArguments().raw(); | |
2946 case kPatchClassCid: | 2938 case kPatchClassCid: |
2947 return Symbols::PatchClass().raw(); | 2939 return Symbols::PatchClass().raw(); |
2948 case kFunctionCid: | 2940 case kFunctionCid: |
2949 return Symbols::Function().raw(); | 2941 return Symbols::Function().raw(); |
2950 case kClosureDataCid: | 2942 case kClosureDataCid: |
2951 return Symbols::ClosureData().raw(); | 2943 return Symbols::ClosureData().raw(); |
2952 case kRedirectionDataCid: | 2944 case kRedirectionDataCid: |
2953 return Symbols::RedirectionData().raw(); | 2945 return Symbols::RedirectionData().raw(); |
2954 case kFieldCid: | 2946 case kFieldCid: |
2955 return Symbols::Field().raw(); | 2947 return Symbols::Field().raw(); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3230 return (!function.IsNull() && (function.signature_class() == raw())); | 3222 return (!function.IsNull() && (function.signature_class() == raw())); |
3231 } | 3223 } |
3232 | 3224 |
3233 | 3225 |
3234 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. | 3226 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. |
3235 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. | 3227 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. |
3236 // Type S is specified by this class parameterized with 'type_arguments', and | 3228 // Type S is specified by this class parameterized with 'type_arguments', and |
3237 // type T by class 'other' parameterized with 'other_type_arguments'. | 3229 // type T by class 'other' parameterized with 'other_type_arguments'. |
3238 // This class and class 'other' do not need to be finalized, however, they must | 3230 // This class and class 'other' do not need to be finalized, however, they must |
3239 // be resolved as well as their interfaces. | 3231 // be resolved as well as their interfaces. |
3240 bool Class::TypeTestNonRecursive( | 3232 bool Class::TypeTestNonRecursive(const Class& cls, |
3241 const Class& cls, | 3233 Class::TypeTestKind test_kind, |
3242 Class::TypeTestKind test_kind, | 3234 const TypeArguments& type_arguments, |
3243 const AbstractTypeArguments& type_arguments, | 3235 const Class& other, |
3244 const Class& other, | 3236 const TypeArguments& other_type_arguments, |
3245 const AbstractTypeArguments& other_type_arguments, | 3237 Error* bound_error) { |
3246 Error* bound_error) { | |
3247 // Use the thsi object as if it was the receiver of this method, but instead | 3238 // Use the thsi object as if it was the receiver of this method, but instead |
3248 // of recursing reset it to the super class and loop. | 3239 // of recursing reset it to the super class and loop. |
3249 Class& thsi = Class::Handle(cls.raw()); | 3240 Class& thsi = Class::Handle(cls.raw()); |
3250 while (true) { | 3241 while (true) { |
3251 ASSERT(!thsi.IsVoidClass()); | 3242 ASSERT(!thsi.IsVoidClass()); |
3252 // Check for DynamicType. | 3243 // Check for DynamicType. |
3253 // Each occurrence of DynamicType in type T is interpreted as the dynamic | 3244 // Each occurrence of DynamicType in type T is interpreted as the dynamic |
3254 // type, a supertype of all types. | 3245 // type, a supertype of all types. |
3255 if (other.IsDynamicClass()) { | 3246 if (other.IsDynamicClass()) { |
3256 return true; | 3247 return true; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3336 bound_error)) { | 3327 bound_error)) { |
3337 return true; | 3328 return true; |
3338 } | 3329 } |
3339 } | 3330 } |
3340 } | 3331 } |
3341 // Check for 'direct super type' specified in the implements clause | 3332 // Check for 'direct super type' specified in the implements clause |
3342 // and check for transitivity at the same time. | 3333 // and check for transitivity at the same time. |
3343 Array& interfaces = Array::Handle(thsi.interfaces()); | 3334 Array& interfaces = Array::Handle(thsi.interfaces()); |
3344 AbstractType& interface = AbstractType::Handle(); | 3335 AbstractType& interface = AbstractType::Handle(); |
3345 Class& interface_class = Class::Handle(); | 3336 Class& interface_class = Class::Handle(); |
3346 AbstractTypeArguments& interface_args = AbstractTypeArguments::Handle(); | 3337 TypeArguments& interface_args = TypeArguments::Handle(); |
3347 Error& error = Error::Handle(); | 3338 Error& error = Error::Handle(); |
3348 for (intptr_t i = 0; i < interfaces.Length(); i++) { | 3339 for (intptr_t i = 0; i < interfaces.Length(); i++) { |
3349 interface ^= interfaces.At(i); | 3340 interface ^= interfaces.At(i); |
3350 if (!interface.IsFinalized()) { | 3341 if (!interface.IsFinalized()) { |
3351 // We may be checking bounds at finalization time and can encounter | 3342 // We may be checking bounds at finalization time and can encounter |
3352 // a still unfinalized interface. | 3343 // a still unfinalized interface. |
3353 ClassFinalizer::FinalizeType( | 3344 ClassFinalizer::FinalizeType( |
3354 thsi, interface, ClassFinalizer::kCanonicalize); | 3345 thsi, interface, ClassFinalizer::kCanonicalize); |
3355 interfaces.SetAt(i, interface); | 3346 interfaces.SetAt(i, interface); |
3356 } | 3347 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3400 return false; | 3391 return false; |
3401 } | 3392 } |
3402 | 3393 |
3403 | 3394 |
3404 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. | 3395 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. |
3405 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. | 3396 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. |
3406 // Type S is specified by this class parameterized with 'type_arguments', and | 3397 // Type S is specified by this class parameterized with 'type_arguments', and |
3407 // type T by class 'other' parameterized with 'other_type_arguments'. | 3398 // type T by class 'other' parameterized with 'other_type_arguments'. |
3408 // This class and class 'other' do not need to be finalized, however, they must | 3399 // This class and class 'other' do not need to be finalized, however, they must |
3409 // be resolved as well as their interfaces. | 3400 // be resolved as well as their interfaces. |
3410 bool Class::TypeTest( | 3401 bool Class::TypeTest(TypeTestKind test_kind, |
3411 TypeTestKind test_kind, | 3402 const TypeArguments& type_arguments, |
3412 const AbstractTypeArguments& type_arguments, | |
3413 const Class& other, | 3403 const Class& other, |
3414 const AbstractTypeArguments& other_type_arguments, | 3404 const TypeArguments& other_type_arguments, |
3415 Error* bound_error) const { | 3405 Error* bound_error) const { |
3416 return TypeTestNonRecursive(*this, | 3406 return TypeTestNonRecursive(*this, |
3417 test_kind, | 3407 test_kind, |
3418 type_arguments, | 3408 type_arguments, |
3419 other, | 3409 other, |
3420 other_type_arguments, | 3410 other_type_arguments, |
3421 bound_error); | 3411 bound_error); |
3422 } | 3412 } |
3423 | 3413 |
3424 | 3414 |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3847 OS::SNPrint(chars, len, format, cname); | 3837 OS::SNPrint(chars, len, format, cname); |
3848 return chars; | 3838 return chars; |
3849 } | 3839 } |
3850 | 3840 |
3851 | 3841 |
3852 void UnresolvedClass::PrintToJSONStream(JSONStream* stream, bool ref) const { | 3842 void UnresolvedClass::PrintToJSONStream(JSONStream* stream, bool ref) const { |
3853 JSONObject jsobj(stream); | 3843 JSONObject jsobj(stream); |
3854 } | 3844 } |
3855 | 3845 |
3856 | 3846 |
3857 intptr_t AbstractTypeArguments::Length() const { | |
3858 // AbstractTypeArguments is an abstract class. | |
3859 UNREACHABLE(); | |
3860 return -1; | |
3861 } | |
3862 | |
3863 | |
3864 RawAbstractType* AbstractTypeArguments::TypeAt(intptr_t index) const { | |
3865 // AbstractTypeArguments is an abstract class. | |
3866 UNREACHABLE(); | |
3867 return NULL; | |
3868 } | |
3869 | |
3870 | |
3871 void AbstractTypeArguments::SetTypeAt(intptr_t index, | |
3872 const AbstractType& value) const { | |
3873 // AbstractTypeArguments is an abstract class. | |
3874 UNREACHABLE(); | |
3875 } | |
3876 | |
3877 | |
3878 bool AbstractTypeArguments::IsResolved() const { | |
3879 // AbstractTypeArguments is an abstract class. | |
3880 UNREACHABLE(); | |
3881 return false; | |
3882 } | |
3883 | |
3884 | |
3885 bool AbstractTypeArguments::IsInstantiated(GrowableObjectArray* trail) const { | |
3886 // AbstractTypeArguments is an abstract class. | |
3887 UNREACHABLE(); | |
3888 return false; | |
3889 } | |
3890 | |
3891 | |
3892 bool AbstractTypeArguments::IsUninstantiatedIdentity() const { | |
3893 // AbstractTypeArguments is an abstract class. | |
3894 UNREACHABLE(); | |
3895 return false; | |
3896 } | |
3897 | |
3898 | |
3899 bool AbstractTypeArguments::CanShareInstantiatorTypeArguments( | |
3900 const Class& instantiator_class) const { | |
3901 // AbstractTypeArguments is an abstract class. | |
3902 UNREACHABLE(); | |
3903 return false; | |
3904 } | |
3905 | |
3906 | |
3907 bool AbstractTypeArguments::IsBounded() const { | |
3908 // AbstractTypeArguments is an abstract class. | |
3909 UNREACHABLE(); | |
3910 return false; | |
3911 } | |
3912 | |
3913 | |
3914 static intptr_t FinalizeHash(uword hash) { | 3847 static intptr_t FinalizeHash(uword hash) { |
3915 hash += hash << 3; | 3848 hash += hash << 3; |
3916 hash ^= hash >> 11; | 3849 hash ^= hash >> 11; |
3917 hash += hash << 15; | 3850 hash += hash << 15; |
3918 return hash; | 3851 return hash; |
3919 } | 3852 } |
3920 | 3853 |
3921 | 3854 |
3922 intptr_t AbstractTypeArguments::Hash() const { | 3855 intptr_t TypeArguments::Hash() const { |
3923 if (IsNull()) return 0; | 3856 if (IsNull()) return 0; |
3924 uword result = 0; | 3857 uword result = 0; |
3925 const intptr_t num_types = Length(); | 3858 const intptr_t num_types = Length(); |
3926 AbstractType& type = AbstractType::Handle(); | 3859 AbstractType& type = AbstractType::Handle(); |
3927 for (intptr_t i = 0; i < num_types; i++) { | 3860 for (intptr_t i = 0; i < num_types; i++) { |
3928 type = TypeAt(i); | 3861 type = TypeAt(i); |
3929 result += type.Hash(); | 3862 result += type.Hash(); |
3930 result += result << 10; | 3863 result += result << 10; |
3931 result ^= result >> 6; | 3864 result ^= result >> 6; |
3932 } | 3865 } |
3933 return FinalizeHash(result); | 3866 return FinalizeHash(result); |
3934 } | 3867 } |
3935 | 3868 |
3936 | 3869 |
3937 RawString* AbstractTypeArguments::SubvectorName( | 3870 RawString* TypeArguments::SubvectorName(intptr_t from_index, |
3938 intptr_t from_index, | 3871 intptr_t len, |
3939 intptr_t len, | 3872 NameVisibility name_visibility) const { |
3940 NameVisibility name_visibility) const { | |
3941 ASSERT(from_index + len <= Length()); | 3873 ASSERT(from_index + len <= Length()); |
3942 String& name = String::Handle(); | 3874 String& name = String::Handle(); |
3943 const intptr_t num_strings = 2*len + 1; // "<""T"", ""T"">". | 3875 const intptr_t num_strings = 2*len + 1; // "<""T"", ""T"">". |
3944 const Array& strings = Array::Handle(Array::New(num_strings)); | 3876 const Array& strings = Array::Handle(Array::New(num_strings)); |
3945 intptr_t s = 0; | 3877 intptr_t s = 0; |
3946 strings.SetAt(s++, Symbols::LAngleBracket()); | 3878 strings.SetAt(s++, Symbols::LAngleBracket()); |
3947 AbstractType& type = AbstractType::Handle(); | 3879 AbstractType& type = AbstractType::Handle(); |
3948 for (intptr_t i = 0; i < len; i++) { | 3880 for (intptr_t i = 0; i < len; i++) { |
3949 type = TypeAt(from_index + i); | 3881 type = TypeAt(from_index + i); |
3950 name = type.BuildName(name_visibility); | 3882 name = type.BuildName(name_visibility); |
3951 strings.SetAt(s++, name); | 3883 strings.SetAt(s++, name); |
3952 if (i < len - 1) { | 3884 if (i < len - 1) { |
3953 strings.SetAt(s++, Symbols::CommaSpace()); | 3885 strings.SetAt(s++, Symbols::CommaSpace()); |
3954 } | 3886 } |
3955 } | 3887 } |
3956 strings.SetAt(s++, Symbols::RAngleBracket()); | 3888 strings.SetAt(s++, Symbols::RAngleBracket()); |
3957 ASSERT(s == num_strings); | 3889 ASSERT(s == num_strings); |
3958 name = String::ConcatAll(strings); | 3890 name = String::ConcatAll(strings); |
3959 return Symbols::New(name); | 3891 return Symbols::New(name); |
3960 } | 3892 } |
3961 | 3893 |
3962 | 3894 |
3963 bool AbstractTypeArguments::IsEquivalent(const AbstractTypeArguments& other, | 3895 bool TypeArguments::IsEquivalent(const TypeArguments& other, |
3964 GrowableObjectArray* trail) const { | 3896 GrowableObjectArray* trail) const { |
3965 if (this->raw() == other.raw()) { | 3897 if (this->raw() == other.raw()) { |
3966 return true; | 3898 return true; |
3967 } | 3899 } |
3968 if (IsNull() || other.IsNull()) { | 3900 if (IsNull() || other.IsNull()) { |
3969 return false; | 3901 return false; |
3970 } | 3902 } |
3971 const intptr_t num_types = Length(); | 3903 const intptr_t num_types = Length(); |
3972 if (num_types != other.Length()) { | 3904 if (num_types != other.Length()) { |
3973 return false; | 3905 return false; |
3974 } | 3906 } |
3975 AbstractType& type = AbstractType::Handle(); | 3907 AbstractType& type = AbstractType::Handle(); |
3976 AbstractType& other_type = AbstractType::Handle(); | 3908 AbstractType& other_type = AbstractType::Handle(); |
3977 for (intptr_t i = 0; i < num_types; i++) { | 3909 for (intptr_t i = 0; i < num_types; i++) { |
3978 type = TypeAt(i); | 3910 type = TypeAt(i); |
3979 other_type = other.TypeAt(i); | 3911 other_type = other.TypeAt(i); |
3980 if (!type.IsEquivalent(other_type, trail)) { | 3912 if (!type.IsEquivalent(other_type, trail)) { |
3981 return false; | 3913 return false; |
3982 } | 3914 } |
3983 } | 3915 } |
3984 return true; | 3916 return true; |
3985 } | 3917 } |
3986 | 3918 |
3987 | 3919 |
3988 RawAbstractTypeArguments* AbstractTypeArguments::InstantiateFrom( | 3920 bool TypeArguments::IsDynamicTypes(bool raw_instantiated, |
3989 const AbstractTypeArguments& instantiator_type_arguments, | 3921 intptr_t from_index, |
3990 Error* bound_error, | 3922 intptr_t len) const { |
3991 GrowableObjectArray* trail) const { | |
3992 // AbstractTypeArguments is an abstract class. | |
3993 UNREACHABLE(); | |
3994 return NULL; | |
3995 } | |
3996 | |
3997 | |
3998 bool AbstractTypeArguments::IsDynamicTypes(bool raw_instantiated, | |
3999 intptr_t from_index, | |
4000 intptr_t len) const { | |
4001 ASSERT(Length() >= (from_index + len)); | 3923 ASSERT(Length() >= (from_index + len)); |
4002 AbstractType& type = AbstractType::Handle(); | 3924 AbstractType& type = AbstractType::Handle(); |
4003 Class& type_class = Class::Handle(); | 3925 Class& type_class = Class::Handle(); |
4004 for (intptr_t i = 0; i < len; i++) { | 3926 for (intptr_t i = 0; i < len; i++) { |
4005 type = TypeAt(from_index + i); | 3927 type = TypeAt(from_index + i); |
4006 ASSERT(!type.IsNull()); | 3928 ASSERT(!type.IsNull()); |
4007 if (!type.HasResolvedTypeClass()) { | 3929 if (!type.HasResolvedTypeClass()) { |
4008 if (raw_instantiated && type.IsTypeParameter()) { | 3930 if (raw_instantiated && type.IsTypeParameter()) { |
4009 // An uninstantiated type parameter is equivalent to dynamic (even in | 3931 // An uninstantiated type parameter is equivalent to dynamic (even in |
4010 // the presence of a malformed bound in checked mode). | 3932 // the presence of a malformed bound in checked mode). |
4011 continue; | 3933 continue; |
4012 } | 3934 } |
4013 return false; | 3935 return false; |
4014 } | 3936 } |
4015 type_class = type.type_class(); | 3937 type_class = type.type_class(); |
4016 if (!type_class.IsDynamicClass()) { | 3938 if (!type_class.IsDynamicClass()) { |
4017 return false; | 3939 return false; |
4018 } | 3940 } |
4019 } | 3941 } |
4020 return true; | 3942 return true; |
4021 } | 3943 } |
4022 | 3944 |
4023 | 3945 |
4024 bool AbstractTypeArguments::TypeTest(TypeTestKind test_kind, | 3946 bool TypeArguments::TypeTest(TypeTestKind test_kind, |
4025 const AbstractTypeArguments& other, | 3947 const TypeArguments& other, |
4026 intptr_t from_index, | 3948 intptr_t from_index, |
4027 intptr_t len, | 3949 intptr_t len, |
4028 Error* bound_error) const { | 3950 Error* bound_error) const { |
4029 ASSERT(Length() >= (from_index + len)); | 3951 ASSERT(Length() >= (from_index + len)); |
4030 ASSERT(!other.IsNull()); | 3952 ASSERT(!other.IsNull()); |
4031 ASSERT(other.Length() >= (from_index + len)); | 3953 ASSERT(other.Length() >= (from_index + len)); |
4032 AbstractType& type = AbstractType::Handle(); | 3954 AbstractType& type = AbstractType::Handle(); |
4033 AbstractType& other_type = AbstractType::Handle(); | 3955 AbstractType& other_type = AbstractType::Handle(); |
4034 for (intptr_t i = 0; i < len; i++) { | 3956 for (intptr_t i = 0; i < len; i++) { |
4035 type = TypeAt(from_index + i); | 3957 type = TypeAt(from_index + i); |
4036 ASSERT(!type.IsNull()); | 3958 ASSERT(!type.IsNull()); |
4037 other_type = other.TypeAt(from_index + i); | 3959 other_type = other.TypeAt(from_index + i); |
4038 ASSERT(!other_type.IsNull()); | 3960 ASSERT(!other_type.IsNull()); |
4039 if (!type.TypeTest(test_kind, other_type, bound_error)) { | 3961 if (!type.TypeTest(test_kind, other_type, bound_error)) { |
4040 return false; | 3962 return false; |
4041 } | 3963 } |
4042 } | 3964 } |
4043 return true; | 3965 return true; |
4044 } | 3966 } |
4045 | 3967 |
4046 | 3968 |
4047 const char* AbstractTypeArguments::ToCString() const { | 3969 void TypeArguments::PrintToJSONStream(JSONStream* stream, bool ref) const { |
4048 // AbstractTypeArguments is an abstract class, valid only for representing | 3970 JSONObject jsobj(stream); |
4049 // null. | |
4050 if (IsNull()) { | |
4051 return "NULL AbstractTypeArguments"; | |
4052 } | |
4053 UNREACHABLE(); | |
4054 return "AbstractTypeArguments"; | |
4055 } | 3971 } |
4056 | 3972 |
4057 | 3973 |
4058 void AbstractTypeArguments::PrintToJSONStream(JSONStream* stream, | 3974 RawArray* TypeArguments::instantiations() const { |
4059 bool ref) const { | 3975 return raw_ptr()->instantiations_; |
4060 JSONObject jsobj(stream); | 3976 } |
3977 | |
3978 void TypeArguments::set_instantiations(const Array& value) const { | |
3979 ASSERT(!value.IsNull()); | |
3980 StorePointer(&raw_ptr()->instantiations_, value.raw()); | |
4061 } | 3981 } |
4062 | 3982 |
4063 | 3983 |
4064 intptr_t TypeArguments::Length() const { | 3984 intptr_t TypeArguments::Length() const { |
4065 ASSERT(!IsNull()); | 3985 ASSERT(!IsNull()); |
4066 return Smi::Value(raw_ptr()->length_); | 3986 return Smi::Value(raw_ptr()->length_); |
4067 } | 3987 } |
4068 | 3988 |
4069 | 3989 |
4070 RawAbstractType* TypeArguments::TypeAt(intptr_t index) const { | 3990 RawAbstractType* TypeArguments::TypeAt(intptr_t index) const { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4185 } | 4105 } |
4186 } | 4106 } |
4187 // As a second requirement, the type arguments corresponding to the super type | 4107 // As a second requirement, the type arguments corresponding to the super type |
4188 // must be identical. Overlapping ones have already been checked starting at | 4108 // must be identical. Overlapping ones have already been checked starting at |
4189 // first_type_param_offset. | 4109 // first_type_param_offset. |
4190 if (first_type_param_offset == 0) { | 4110 if (first_type_param_offset == 0) { |
4191 return true; | 4111 return true; |
4192 } | 4112 } |
4193 AbstractType& super_type = AbstractType::Handle( | 4113 AbstractType& super_type = AbstractType::Handle( |
4194 instantiator_class.super_type()); | 4114 instantiator_class.super_type()); |
4195 const AbstractTypeArguments& super_type_args = AbstractTypeArguments::Handle( | 4115 const TypeArguments& super_type_args = TypeArguments::Handle( |
4196 super_type.arguments()); | 4116 super_type.arguments()); |
4197 if (super_type_args.IsNull()) { | 4117 if (super_type_args.IsNull()) { |
4198 return false; | 4118 return false; |
4199 } | 4119 } |
4200 AbstractType& super_type_arg = AbstractType::Handle(); | 4120 AbstractType& super_type_arg = AbstractType::Handle(); |
4201 for (intptr_t i = 0; | 4121 for (intptr_t i = 0; |
4202 (i < first_type_param_offset) && (i < num_type_args); i++) { | 4122 (i < first_type_param_offset) && (i < num_type_args); i++) { |
4203 type_arg = TypeAt(i); | 4123 type_arg = TypeAt(i); |
4204 super_type_arg = super_type_args.TypeAt(i); | 4124 super_type_arg = super_type_args.TypeAt(i); |
4205 if (!type_arg.Equals(super_type_arg)) { | 4125 if (!type_arg.Equals(super_type_arg)) { |
(...skipping 27 matching lines...) Expand all Loading... | |
4233 return true; | 4153 return true; |
4234 } | 4154 } |
4235 if (type.IsTypeParameter()) { | 4155 if (type.IsTypeParameter()) { |
4236 const AbstractType& bound = AbstractType::Handle( | 4156 const AbstractType& bound = AbstractType::Handle( |
4237 TypeParameter::Cast(type).bound()); | 4157 TypeParameter::Cast(type).bound()); |
4238 if (!bound.IsObjectType() && !bound.IsDynamicType()) { | 4158 if (!bound.IsObjectType() && !bound.IsDynamicType()) { |
4239 return true; | 4159 return true; |
4240 } | 4160 } |
4241 continue; | 4161 continue; |
4242 } | 4162 } |
4243 const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle( | 4163 const TypeArguments& type_args = TypeArguments::Handle( |
4244 Type::Cast(type).arguments()); | 4164 Type::Cast(type).arguments()); |
4245 if (!type_args.IsNull() && type_args.IsBounded()) { | 4165 if (!type_args.IsNull() && type_args.IsBounded()) { |
4246 return true; | 4166 return true; |
4247 } | 4167 } |
4248 } | 4168 } |
4249 return false; | 4169 return false; |
4250 } | 4170 } |
4251 | 4171 |
4252 | 4172 |
4253 RawAbstractTypeArguments* TypeArguments::InstantiateFrom( | 4173 RawTypeArguments* TypeArguments::InstantiateFrom( |
4254 const AbstractTypeArguments& instantiator_type_arguments, | 4174 const TypeArguments& instantiator_type_arguments, |
4255 Error* bound_error, | 4175 Error* bound_error, |
4256 GrowableObjectArray* trail) const { | 4176 GrowableObjectArray* trail) const { |
4257 ASSERT(!IsInstantiated()); | 4177 ASSERT(!IsInstantiated()); |
4258 if (!instantiator_type_arguments.IsNull() && | 4178 if (!instantiator_type_arguments.IsNull() && |
4259 IsUninstantiatedIdentity() && | 4179 IsUninstantiatedIdentity() && |
4260 (instantiator_type_arguments.Length() == Length())) { | 4180 (instantiator_type_arguments.Length() == Length())) { |
4261 return instantiator_type_arguments.raw(); | 4181 return instantiator_type_arguments.raw(); |
4262 } | 4182 } |
4263 const intptr_t num_types = Length(); | 4183 const intptr_t num_types = Length(); |
4264 TypeArguments& instantiated_array = | 4184 TypeArguments& instantiated_array = |
4265 TypeArguments::Handle(TypeArguments::New(num_types, Heap::kNew)); | 4185 TypeArguments::Handle(TypeArguments::New(num_types, Heap::kNew)); |
4266 AbstractType& type = AbstractType::Handle(); | 4186 AbstractType& type = AbstractType::Handle(); |
4267 for (intptr_t i = 0; i < num_types; i++) { | 4187 for (intptr_t i = 0; i < num_types; i++) { |
4268 type = TypeAt(i); | 4188 type = TypeAt(i); |
4269 if (!type.IsBeingFinalized() && !type.IsInstantiated()) { | 4189 if (!type.IsBeingFinalized() && !type.IsInstantiated()) { |
4270 type = type.InstantiateFrom(instantiator_type_arguments, | 4190 type = type.InstantiateFrom(instantiator_type_arguments, |
4271 bound_error, | 4191 bound_error, |
4272 trail); | 4192 trail); |
4273 } | 4193 } |
4274 instantiated_array.SetTypeAt(i, type); | 4194 instantiated_array.SetTypeAt(i, type); |
4275 } | 4195 } |
4276 return instantiated_array.raw(); | 4196 return instantiated_array.raw(); |
4277 } | 4197 } |
4278 | 4198 |
4279 | 4199 |
4200 RawTypeArguments* TypeArguments::InstantiateAndCanonicalizeFrom( | |
4201 const TypeArguments& instantiator_type_arguments, | |
4202 Error* bound_error) const { | |
4203 ASSERT(!IsInstantiated()); | |
4204 ASSERT(instantiator_type_arguments.IsNull() || | |
4205 instantiator_type_arguments.IsCanonical()); | |
4206 // Lookup instantiator and, if found, return paired instantiated result. | |
4207 Array& prior_instantiations = Array::Handle(instantiations()); | |
4208 ASSERT(!prior_instantiations.IsNull()); | |
4209 intptr_t length = prior_instantiations.Length(); | |
4210 intptr_t index = 0; | |
4211 while (index < length) { | |
4212 if (prior_instantiations.At(index) == instantiator_type_arguments.raw()) { | |
4213 return TypeArguments::RawCast(prior_instantiations.At(index + 1)); | |
4214 } | |
4215 if (prior_instantiations.At(index) == Smi::New(StubCode::kNoInstantiator)) { | |
4216 break; | |
4217 } | |
4218 index += 2; | |
4219 } | |
4220 TypeArguments& result = TypeArguments::Handle(); | |
4221 result ^= InstantiateFrom(instantiator_type_arguments, bound_error); | |
4222 if ((bound_error != NULL) && !bound_error->IsNull()) { | |
4223 return result.raw(); | |
4224 } | |
Ivan Posva
2014/02/07 18:48:43
Please add a comment explaining that everything be
regis
2014/02/07 19:42:00
Done.
| |
4225 result ^= result.Canonicalize(); | |
4226 // Add instantiator and result to instantiations array. | |
4227 if ((index + 2) > length) { | |
4228 // Grow the instantiations array. | |
4229 length = (length == 0) ? 2 : length * 2; | |
srdjan
2014/02/07 17:32:17
The growth seems to aggressive. I would never grow
regis
2014/02/07 19:42:00
Done:
length = (length == 0) ? 2 : length + 4;
| |
4230 prior_instantiations = | |
4231 Array::Grow(prior_instantiations, length, Heap::kOld); | |
4232 set_instantiations(prior_instantiations); | |
4233 } | |
4234 prior_instantiations.SetAt(index, instantiator_type_arguments); | |
4235 prior_instantiations.SetAt(index + 1, result); | |
4236 if ((index + 2) < length) { | |
4237 prior_instantiations.SetAt(index + 2, | |
4238 Smi::Handle(Smi::New(StubCode::kNoInstantiator))); | |
4239 } | |
4240 return result.raw(); | |
4241 } | |
4242 | |
4243 | |
4280 RawTypeArguments* TypeArguments::New(intptr_t len, Heap::Space space) { | 4244 RawTypeArguments* TypeArguments::New(intptr_t len, Heap::Space space) { |
4281 if (len < 0 || len > kMaxElements) { | 4245 if (len < 0 || len > kMaxElements) { |
4282 // This should be caught before we reach here. | 4246 // This should be caught before we reach here. |
4283 FATAL1("Fatal error in TypeArguments::New: invalid len %" Pd "\n", len); | 4247 FATAL1("Fatal error in TypeArguments::New: invalid len %" Pd "\n", len); |
4284 } | 4248 } |
4285 TypeArguments& result = TypeArguments::Handle(); | 4249 TypeArguments& result = TypeArguments::Handle(); |
4286 { | 4250 { |
4287 RawObject* raw = Object::Allocate(TypeArguments::kClassId, | 4251 RawObject* raw = Object::Allocate(TypeArguments::kClassId, |
4288 TypeArguments::InstanceSize(len), | 4252 TypeArguments::InstanceSize(len), |
4289 space); | 4253 space); |
4290 NoGCScope no_gc; | 4254 NoGCScope no_gc; |
4291 result ^= raw; | 4255 result ^= raw; |
4292 // Length must be set before we start storing into the array. | 4256 // Length must be set before we start storing into the array. |
4293 result.SetLength(len); | 4257 result.SetLength(len); |
4294 } | 4258 } |
4259 result.set_instantiations(Object::empty_array()); | |
4295 return result.raw(); | 4260 return result.raw(); |
4296 } | 4261 } |
4297 | 4262 |
4298 | 4263 |
4299 | 4264 |
4300 RawAbstractType** TypeArguments::TypeAddr(intptr_t index) const { | 4265 RawAbstractType** TypeArguments::TypeAddr(intptr_t index) const { |
4301 // TODO(iposva): Determine if we should throw an exception here. | 4266 // TODO(iposva): Determine if we should throw an exception here. |
4302 ASSERT((index >= 0) && (index < Length())); | 4267 ASSERT((index >= 0) && (index < Length())); |
4303 return &raw_ptr()->types_[index]; | 4268 return &raw_ptr()->types_[index]; |
4304 } | 4269 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4376 TypeArguments& current = TypeArguments::Handle(isolate); | 4341 TypeArguments& current = TypeArguments::Handle(isolate); |
4377 current ^= table.At(index); | 4342 current ^= table.At(index); |
4378 while (!current.IsNull() && !current.Equals(arguments)) { | 4343 while (!current.IsNull() && !current.Equals(arguments)) { |
4379 index = (index + 1) & (table_size - 1); // Move to next element. | 4344 index = (index + 1) & (table_size - 1); // Move to next element. |
4380 current ^= table.At(index); | 4345 current ^= table.At(index); |
4381 } | 4346 } |
4382 return index; // Index of element if found or slot into which to add it. | 4347 return index; // Index of element if found or slot into which to add it. |
4383 } | 4348 } |
4384 | 4349 |
4385 | 4350 |
4386 RawAbstractTypeArguments* TypeArguments::CloneUnfinalized() const { | 4351 RawTypeArguments* TypeArguments::CloneUnfinalized() const { |
4387 if (IsFinalized()) { | 4352 if (IsNull() || IsFinalized()) { |
4388 return raw(); | 4353 return raw(); |
4389 } | 4354 } |
4390 AbstractType& type = AbstractType::Handle(); | 4355 AbstractType& type = AbstractType::Handle(); |
4391 const intptr_t num_types = Length(); | 4356 const intptr_t num_types = Length(); |
4392 const TypeArguments& clone = TypeArguments::Handle( | 4357 const TypeArguments& clone = TypeArguments::Handle( |
4393 TypeArguments::New(num_types)); | 4358 TypeArguments::New(num_types)); |
4394 for (intptr_t i = 0; i < num_types; i++) { | 4359 for (intptr_t i = 0; i < num_types; i++) { |
4395 type = TypeAt(i); | 4360 type = TypeAt(i); |
4396 type = type.CloneUnfinalized(); | 4361 type = type.CloneUnfinalized(); |
4397 clone.SetTypeAt(i, type); | 4362 clone.SetTypeAt(i, type); |
4398 } | 4363 } |
4399 return clone.raw(); | 4364 return clone.raw(); |
4400 } | 4365 } |
4401 | 4366 |
4402 | 4367 |
4403 RawAbstractTypeArguments* TypeArguments::Canonicalize( | 4368 RawTypeArguments* TypeArguments::Canonicalize( |
4404 GrowableObjectArray* trail) const { | 4369 GrowableObjectArray* trail) const { |
4405 if (IsNull() || IsCanonical()) { | 4370 if (IsNull() || IsCanonical()) { |
4406 ASSERT(IsOld()); | 4371 ASSERT(IsOld()); |
4407 return this->raw(); | 4372 return this->raw(); |
4408 } | 4373 } |
4409 Isolate* isolate = Isolate::Current(); | 4374 Isolate* isolate = Isolate::Current(); |
4410 ObjectStore* object_store = isolate->object_store(); | 4375 ObjectStore* object_store = isolate->object_store(); |
4411 const Array& table = Array::Handle(isolate, | 4376 const Array& table = Array::Handle(isolate, |
4412 object_store->canonical_type_arguments()); | 4377 object_store->canonical_type_arguments()); |
4413 ASSERT(table.Length() > 0); | 4378 ASSERT(table.Length() > 0); |
(...skipping 17 matching lines...) Expand all Loading... | |
4431 result ^= Object::Clone(*this, Heap::kOld); | 4396 result ^= Object::Clone(*this, Heap::kOld); |
4432 } else { | 4397 } else { |
4433 result ^= this->raw(); | 4398 result ^= this->raw(); |
4434 } | 4399 } |
4435 ASSERT(result.IsOld()); | 4400 ASSERT(result.IsOld()); |
4436 InsertIntoCanonicalTypeArguments(isolate, table, result, index); | 4401 InsertIntoCanonicalTypeArguments(isolate, table, result, index); |
4437 } | 4402 } |
4438 ASSERT(result.Equals(*this)); | 4403 ASSERT(result.Equals(*this)); |
4439 ASSERT(!result.IsNull()); | 4404 ASSERT(!result.IsNull()); |
4440 ASSERT(result.IsTypeArguments()); | 4405 ASSERT(result.IsTypeArguments()); |
4406 ASSERT(result.IsCanonical()); | |
4441 return result.raw(); | 4407 return result.raw(); |
4442 } | 4408 } |
4443 | 4409 |
4444 | 4410 |
4445 const char* TypeArguments::ToCString() const { | 4411 const char* TypeArguments::ToCString() const { |
4446 if (IsNull()) { | 4412 if (IsNull()) { |
4447 return "NULL TypeArguments"; | 4413 return "NULL TypeArguments"; |
4448 } | 4414 } |
4449 const char* format = "%s [%s]"; | 4415 const char* format = "%s [%s]"; |
4450 const char* prev_cstr = "TypeArguments:"; | 4416 const char* prev_cstr = "TypeArguments:"; |
4451 for (int i = 0; i < Length(); i++) { | 4417 for (int i = 0; i < Length(); i++) { |
4452 const AbstractType& type_at = AbstractType::Handle(TypeAt(i)); | 4418 const AbstractType& type_at = AbstractType::Handle(TypeAt(i)); |
4453 const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString(); | 4419 const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString(); |
4454 intptr_t len = OS::SNPrint(NULL, 0, format, prev_cstr, type_cstr) + 1; | 4420 intptr_t len = OS::SNPrint(NULL, 0, format, prev_cstr, type_cstr) + 1; |
4455 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 4421 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
4456 OS::SNPrint(chars, len, format, prev_cstr, type_cstr); | 4422 OS::SNPrint(chars, len, format, prev_cstr, type_cstr); |
4457 prev_cstr = chars; | 4423 prev_cstr = chars; |
4458 } | 4424 } |
4459 return prev_cstr; | 4425 return prev_cstr; |
4460 } | 4426 } |
4461 | 4427 |
4462 | 4428 |
4463 void TypeArguments::PrintToJSONStream(JSONStream* stream, bool ref) const { | |
4464 JSONObject jsobj(stream); | |
4465 } | |
4466 | |
4467 | |
4468 intptr_t InstantiatedTypeArguments::Length() const { | |
4469 return AbstractTypeArguments::Handle( | |
4470 uninstantiated_type_arguments()).Length(); | |
4471 } | |
4472 | |
4473 | |
4474 RawAbstractType* InstantiatedTypeArguments::TypeAt(intptr_t index) const { | |
4475 AbstractType& type = AbstractType::Handle(AbstractTypeArguments::Handle( | |
4476 uninstantiated_type_arguments()).TypeAt(index)); | |
4477 if (!type.IsInstantiated()) { | |
4478 const AbstractTypeArguments& instantiator_type_args = | |
4479 AbstractTypeArguments::Handle(instantiator_type_arguments()); | |
4480 Error& bound_error = Error::Handle(); | |
4481 type = type.InstantiateFrom(instantiator_type_args, &bound_error); | |
4482 // InstantiatedTypeArguments cannot include unchecked bounds. | |
4483 // In the presence of unchecked bounds, no InstantiatedTypeArguments are | |
4484 // allocated, but the type arguments are instantiated individually and their | |
4485 // bounds are checked. | |
4486 ASSERT(bound_error.IsNull()); | |
4487 } | |
4488 return type.raw(); | |
4489 } | |
4490 | |
4491 | |
4492 void InstantiatedTypeArguments::SetTypeAt(intptr_t index, | |
4493 const AbstractType& value) const { | |
4494 // We only replace individual argument types during resolution at compile | |
4495 // time, when no type parameters are instantiated yet. | |
4496 UNREACHABLE(); | |
4497 } | |
4498 | |
4499 | |
4500 RawAbstractTypeArguments* InstantiatedTypeArguments::Canonicalize( | |
4501 GrowableObjectArray* trail) const { | |
4502 const intptr_t num_types = Length(); | |
4503 const TypeArguments& type_args = TypeArguments::Handle( | |
4504 TypeArguments::New(num_types, Heap::kOld)); | |
4505 AbstractType& type = AbstractType::Handle(); | |
4506 for (intptr_t i = 0; i < num_types; i++) { | |
4507 type = TypeAt(i); | |
4508 type_args.SetTypeAt(i, type); | |
4509 } | |
4510 return type_args.Canonicalize(trail); | |
4511 } | |
4512 | |
4513 | |
4514 void InstantiatedTypeArguments::set_uninstantiated_type_arguments( | |
4515 const AbstractTypeArguments& value) const { | |
4516 StorePointer(&raw_ptr()->uninstantiated_type_arguments_, value.raw()); | |
4517 } | |
4518 | |
4519 | |
4520 void InstantiatedTypeArguments::set_instantiator_type_arguments( | |
4521 const AbstractTypeArguments& value) const { | |
4522 StorePointer(&raw_ptr()->instantiator_type_arguments_, value.raw()); | |
4523 } | |
4524 | |
4525 | |
4526 RawInstantiatedTypeArguments* InstantiatedTypeArguments::New() { | |
4527 ASSERT(Object::instantiated_type_arguments_class() != Class::null()); | |
4528 RawObject* raw = Object::Allocate(InstantiatedTypeArguments::kClassId, | |
4529 InstantiatedTypeArguments::InstanceSize(), | |
4530 Heap::kNew); | |
4531 return reinterpret_cast<RawInstantiatedTypeArguments*>(raw); | |
4532 } | |
4533 | |
4534 | |
4535 RawInstantiatedTypeArguments* InstantiatedTypeArguments::New( | |
4536 const AbstractTypeArguments& uninstantiated_type_arguments, | |
4537 const AbstractTypeArguments& instantiator_type_arguments) { | |
4538 const InstantiatedTypeArguments& result = | |
4539 InstantiatedTypeArguments::Handle(InstantiatedTypeArguments::New()); | |
4540 result.set_uninstantiated_type_arguments(uninstantiated_type_arguments); | |
4541 result.set_instantiator_type_arguments(instantiator_type_arguments); | |
4542 return result.raw(); | |
4543 } | |
4544 | |
4545 | |
4546 const char* InstantiatedTypeArguments::ToCString() const { | |
4547 if (IsNull()) { | |
4548 return "NULL InstantiatedTypeArguments"; | |
4549 } | |
4550 const char* format = "InstantiatedTypeArguments: [%s] instantiator: [%s]"; | |
4551 const char* arg_cstr = | |
4552 AbstractTypeArguments::Handle( | |
4553 uninstantiated_type_arguments()).ToCString(); | |
4554 const char* instantiator_cstr = | |
4555 AbstractTypeArguments::Handle(instantiator_type_arguments()).ToCString(); | |
4556 intptr_t len = | |
4557 OS::SNPrint(NULL, 0, format, arg_cstr, instantiator_cstr) + 1; | |
4558 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | |
4559 OS::SNPrint(chars, len, format, arg_cstr, instantiator_cstr); | |
4560 return chars; | |
4561 } | |
4562 | |
4563 | |
4564 void InstantiatedTypeArguments::PrintToJSONStream(JSONStream* stream, | |
4565 bool ref) const { | |
4566 JSONObject jsobj(stream); | |
4567 } | |
4568 | |
4569 | |
4570 const char* PatchClass::ToCString() const { | 4429 const char* PatchClass::ToCString() const { |
4571 const char* kFormat = "PatchClass for %s"; | 4430 const char* kFormat = "PatchClass for %s"; |
4572 const Class& cls = Class::Handle(patched_class()); | 4431 const Class& cls = Class::Handle(patched_class()); |
4573 const char* cls_name = cls.ToCString(); | 4432 const char* cls_name = cls.ToCString(); |
4574 intptr_t len = OS::SNPrint(NULL, 0, kFormat, cls_name) + 1; | 4433 intptr_t len = OS::SNPrint(NULL, 0, kFormat, cls_name) + 1; |
4575 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 4434 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
4576 OS::SNPrint(chars, len, kFormat, cls_name); | 4435 OS::SNPrint(chars, len, kFormat, cls_name); |
4577 return chars; | 4436 return chars; |
4578 } | 4437 } |
4579 | 4438 |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5410 return chars; | 5269 return chars; |
5411 } | 5270 } |
5412 | 5271 |
5413 | 5272 |
5414 bool Function::HasCompatibleParametersWith(const Function& other, | 5273 bool Function::HasCompatibleParametersWith(const Function& other, |
5415 Error* bound_error) const { | 5274 Error* bound_error) const { |
5416 ASSERT(FLAG_error_on_bad_override); | 5275 ASSERT(FLAG_error_on_bad_override); |
5417 ASSERT((bound_error != NULL) && bound_error->IsNull()); | 5276 ASSERT((bound_error != NULL) && bound_error->IsNull()); |
5418 // Check that this function's signature type is a subtype of the other | 5277 // Check that this function's signature type is a subtype of the other |
5419 // function's signature type. | 5278 // function's signature type. |
5420 if (!TypeTest(kIsSubtypeOf, Object::null_abstract_type_arguments(), | 5279 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), |
5421 other, Object::null_abstract_type_arguments(), bound_error)) { | 5280 other, Object::null_type_arguments(), bound_error)) { |
5422 // For more informative error reporting, use the location of the other | 5281 // For more informative error reporting, use the location of the other |
5423 // function here, since the caller will use the location of this function. | 5282 // function here, since the caller will use the location of this function. |
5424 *bound_error = LanguageError::NewFormatted( | 5283 *bound_error = LanguageError::NewFormatted( |
5425 *bound_error, // A bound error if non null. | 5284 *bound_error, // A bound error if non null. |
5426 Script::Handle(other.script()), | 5285 Script::Handle(other.script()), |
5427 other.token_pos(), | 5286 other.token_pos(), |
5428 LanguageError::kError, | 5287 LanguageError::kError, |
5429 Heap::kNew, | 5288 Heap::kNew, |
5430 "signature type '%s' of function '%s' is not a subtype of signature " | 5289 "signature type '%s' of function '%s' is not a subtype of signature " |
5431 "type '%s' of function '%s'", | 5290 "type '%s' of function '%s'", |
(...skipping 18 matching lines...) Expand all Loading... | |
5450 // parameter of the other function. | 5309 // parameter of the other function. |
5451 // If test_kind == kIsMoreSpecificThan, checks if the type of the specified | 5310 // If test_kind == kIsMoreSpecificThan, checks if the type of the specified |
5452 // parameter of this function is more specific than the type of the specified | 5311 // parameter of this function is more specific than the type of the specified |
5453 // parameter of the other function. | 5312 // parameter of the other function. |
5454 // Note that we do not apply contravariance of parameter types, but covariance | 5313 // Note that we do not apply contravariance of parameter types, but covariance |
5455 // of both parameter types and result type. | 5314 // of both parameter types and result type. |
5456 bool Function::TestParameterType( | 5315 bool Function::TestParameterType( |
5457 TypeTestKind test_kind, | 5316 TypeTestKind test_kind, |
5458 intptr_t parameter_position, | 5317 intptr_t parameter_position, |
5459 intptr_t other_parameter_position, | 5318 intptr_t other_parameter_position, |
5460 const AbstractTypeArguments& type_arguments, | 5319 const TypeArguments& type_arguments, |
5461 const Function& other, | 5320 const Function& other, |
5462 const AbstractTypeArguments& other_type_arguments, | 5321 const TypeArguments& other_type_arguments, |
5463 Error* bound_error) const { | 5322 Error* bound_error) const { |
5464 AbstractType& other_param_type = | 5323 AbstractType& other_param_type = |
5465 AbstractType::Handle(other.ParameterTypeAt(other_parameter_position)); | 5324 AbstractType::Handle(other.ParameterTypeAt(other_parameter_position)); |
5466 if (!other_param_type.IsInstantiated()) { | 5325 if (!other_param_type.IsInstantiated()) { |
5467 other_param_type = other_param_type.InstantiateFrom(other_type_arguments, | 5326 other_param_type = other_param_type.InstantiateFrom(other_type_arguments, |
5468 bound_error); | 5327 bound_error); |
5469 ASSERT((bound_error == NULL) || bound_error->IsNull()); | 5328 ASSERT((bound_error == NULL) || bound_error->IsNull()); |
5470 } | 5329 } |
5471 if (other_param_type.IsDynamicType()) { | 5330 if (other_param_type.IsDynamicType()) { |
5472 return true; | 5331 return true; |
(...skipping 16 matching lines...) Expand all Loading... | |
5489 ASSERT(test_kind == kIsMoreSpecificThan); | 5348 ASSERT(test_kind == kIsMoreSpecificThan); |
5490 if (!param_type.IsMoreSpecificThan(other_param_type, bound_error)) { | 5349 if (!param_type.IsMoreSpecificThan(other_param_type, bound_error)) { |
5491 return false; | 5350 return false; |
5492 } | 5351 } |
5493 } | 5352 } |
5494 return true; | 5353 return true; |
5495 } | 5354 } |
5496 | 5355 |
5497 | 5356 |
5498 bool Function::TypeTest(TypeTestKind test_kind, | 5357 bool Function::TypeTest(TypeTestKind test_kind, |
5499 const AbstractTypeArguments& type_arguments, | 5358 const TypeArguments& type_arguments, |
5500 const Function& other, | 5359 const Function& other, |
5501 const AbstractTypeArguments& other_type_arguments, | 5360 const TypeArguments& other_type_arguments, |
5502 Error* bound_error) const { | 5361 Error* bound_error) const { |
5503 const intptr_t num_fixed_params = num_fixed_parameters(); | 5362 const intptr_t num_fixed_params = num_fixed_parameters(); |
5504 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); | 5363 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); |
5505 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); | 5364 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); |
5506 const intptr_t other_num_fixed_params = other.num_fixed_parameters(); | 5365 const intptr_t other_num_fixed_params = other.num_fixed_parameters(); |
5507 const intptr_t other_num_opt_pos_params = | 5366 const intptr_t other_num_opt_pos_params = |
5508 other.NumOptionalPositionalParameters(); | 5367 other.NumOptionalPositionalParameters(); |
5509 const intptr_t other_num_opt_named_params = | 5368 const intptr_t other_num_opt_named_params = |
5510 other.NumOptionalNamedParameters(); | 5369 other.NumOptionalNamedParameters(); |
5511 // This function requires the same arguments or less and accepts the same | 5370 // This function requires the same arguments or less and accepts the same |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5802 const TypeArguments& instantiator = TypeArguments::Handle(); | 5661 const TypeArguments& instantiator = TypeArguments::Handle(); |
5803 BuildSignatureParameters(false, kUserVisibleName, instantiator, pieces); | 5662 BuildSignatureParameters(false, kUserVisibleName, instantiator, pieces); |
5804 const Array& strings = Array::Handle(Array::MakeArray(pieces)); | 5663 const Array& strings = Array::Handle(Array::MakeArray(pieces)); |
5805 return String::ConcatAll(strings); | 5664 return String::ConcatAll(strings); |
5806 } | 5665 } |
5807 | 5666 |
5808 | 5667 |
5809 void Function::BuildSignatureParameters( | 5668 void Function::BuildSignatureParameters( |
5810 bool instantiate, | 5669 bool instantiate, |
5811 NameVisibility name_visibility, | 5670 NameVisibility name_visibility, |
5812 const AbstractTypeArguments& instantiator, | 5671 const TypeArguments& instantiator, |
5813 const GrowableObjectArray& pieces) const { | 5672 const GrowableObjectArray& pieces) const { |
5814 AbstractType& param_type = AbstractType::Handle(); | 5673 AbstractType& param_type = AbstractType::Handle(); |
5815 const intptr_t num_params = NumParameters(); | 5674 const intptr_t num_params = NumParameters(); |
5816 const intptr_t num_fixed_params = num_fixed_parameters(); | 5675 const intptr_t num_fixed_params = num_fixed_parameters(); |
5817 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); | 5676 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); |
5818 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); | 5677 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); |
5819 const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params; | 5678 const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params; |
5820 ASSERT((num_fixed_params + num_opt_params) == num_params); | 5679 ASSERT((num_fixed_params + num_opt_params) == num_params); |
5821 String& name = String::Handle(); | 5680 String& name = String::Handle(); |
5822 intptr_t i = 0; | 5681 intptr_t i = 0; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5876 ObjectStore* object_store = Isolate::Current()->object_store(); | 5735 ObjectStore* object_store = Isolate::Current()->object_store(); |
5877 const Context& context = Context::Handle(object_store->empty_context()); | 5736 const Context& context = Context::Handle(object_store->empty_context()); |
5878 const Instance& closure = | 5737 const Instance& closure = |
5879 Instance::Handle(Closure::New(*this, context, Heap::kOld)); | 5738 Instance::Handle(Closure::New(*this, context, Heap::kOld)); |
5880 set_implicit_static_closure(closure); | 5739 set_implicit_static_closure(closure); |
5881 } | 5740 } |
5882 return implicit_static_closure(); | 5741 return implicit_static_closure(); |
5883 } | 5742 } |
5884 | 5743 |
5885 | 5744 |
5886 RawString* Function::BuildSignature( | 5745 RawString* Function::BuildSignature(bool instantiate, |
5887 bool instantiate, | 5746 NameVisibility name_visibility, |
5888 NameVisibility name_visibility, | 5747 const TypeArguments& instantiator) const { |
5889 const AbstractTypeArguments& instantiator) const { | |
5890 const GrowableObjectArray& pieces = | 5748 const GrowableObjectArray& pieces = |
5891 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 5749 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
5892 String& name = String::Handle(); | 5750 String& name = String::Handle(); |
5893 if (!instantiate && !is_static() && (name_visibility == kInternalName)) { | 5751 if (!instantiate && !is_static() && (name_visibility == kInternalName)) { |
5894 // Prefix the signature with its signature class and type parameters, if any | 5752 // Prefix the signature with its signature class and type parameters, if any |
5895 // (e.g. "Map<K, V>(K) => bool"). In case of a function type alias, the | 5753 // (e.g. "Map<K, V>(K) => bool"). In case of a function type alias, the |
5896 // signature class name is the alias name. | 5754 // signature class name is the alias name. |
5897 // The signature of static functions cannot be type parameterized. | 5755 // The signature of static functions cannot be type parameterized. |
5898 const Class& function_class = Class::Handle(Owner()); | 5756 const Class& function_class = Class::Handle(Owner()); |
5899 ASSERT(!function_class.IsNull()); | 5757 ASSERT(!function_class.IsNull()); |
(...skipping 5430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11330 | 11188 |
11331 | 11189 |
11332 intptr_t SubtypeTestCache::NumberOfChecks() const { | 11190 intptr_t SubtypeTestCache::NumberOfChecks() const { |
11333 // Do not count the sentinel; | 11191 // Do not count the sentinel; |
11334 return (Array::Handle(cache()).Length() / kTestEntryLength) - 1; | 11192 return (Array::Handle(cache()).Length() / kTestEntryLength) - 1; |
11335 } | 11193 } |
11336 | 11194 |
11337 | 11195 |
11338 void SubtypeTestCache::AddCheck( | 11196 void SubtypeTestCache::AddCheck( |
11339 intptr_t instance_class_id, | 11197 intptr_t instance_class_id, |
11340 const AbstractTypeArguments& instance_type_arguments, | 11198 const TypeArguments& instance_type_arguments, |
11341 const AbstractTypeArguments& instantiator_type_arguments, | 11199 const TypeArguments& instantiator_type_arguments, |
11342 const Bool& test_result) const { | 11200 const Bool& test_result) const { |
11343 intptr_t old_num = NumberOfChecks(); | 11201 intptr_t old_num = NumberOfChecks(); |
11344 Array& data = Array::Handle(cache()); | 11202 Array& data = Array::Handle(cache()); |
11345 intptr_t new_len = data.Length() + kTestEntryLength; | 11203 intptr_t new_len = data.Length() + kTestEntryLength; |
11346 data = Array::Grow(data, new_len); | 11204 data = Array::Grow(data, new_len); |
11347 set_cache(data); | 11205 set_cache(data); |
11348 intptr_t data_pos = old_num * kTestEntryLength; | 11206 intptr_t data_pos = old_num * kTestEntryLength; |
11349 data.SetAt(data_pos + kInstanceClassId, | 11207 data.SetAt(data_pos + kInstanceClassId, |
11350 Smi::Handle(Smi::New(instance_class_id))); | 11208 Smi::Handle(Smi::New(instance_class_id))); |
11351 data.SetAt(data_pos + kInstanceTypeArguments, instance_type_arguments); | 11209 data.SetAt(data_pos + kInstanceTypeArguments, instance_type_arguments); |
11352 data.SetAt(data_pos + kInstantiatorTypeArguments, | 11210 data.SetAt(data_pos + kInstantiatorTypeArguments, |
11353 instantiator_type_arguments); | 11211 instantiator_type_arguments); |
11354 data.SetAt(data_pos + kTestResult, test_result); | 11212 data.SetAt(data_pos + kTestResult, test_result); |
11355 } | 11213 } |
11356 | 11214 |
11357 | 11215 |
11358 void SubtypeTestCache::GetCheck( | 11216 void SubtypeTestCache::GetCheck(intptr_t ix, |
11359 intptr_t ix, | 11217 intptr_t* instance_class_id, |
11360 intptr_t* instance_class_id, | 11218 TypeArguments* instance_type_arguments, |
11361 AbstractTypeArguments* instance_type_arguments, | 11219 TypeArguments* instantiator_type_arguments, |
11362 AbstractTypeArguments* instantiator_type_arguments, | 11220 Bool* test_result) const { |
11363 Bool* test_result) const { | |
11364 Array& data = Array::Handle(cache()); | 11221 Array& data = Array::Handle(cache()); |
11365 intptr_t data_pos = ix * kTestEntryLength; | 11222 intptr_t data_pos = ix * kTestEntryLength; |
11366 *instance_class_id = | 11223 *instance_class_id = |
11367 Smi::Value(Smi::RawCast(data.At(data_pos + kInstanceClassId))); | 11224 Smi::Value(Smi::RawCast(data.At(data_pos + kInstanceClassId))); |
11368 *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments); | 11225 *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments); |
11369 *instantiator_type_arguments ^= | 11226 *instantiator_type_arguments ^= |
11370 data.At(data_pos + kInstantiatorTypeArguments); | 11227 data.At(data_pos + kInstantiatorTypeArguments); |
11371 *test_result ^= data.At(data_pos + kTestResult); | 11228 *test_result ^= data.At(data_pos + kTestResult); |
11372 } | 11229 } |
11373 | 11230 |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11908 } | 11765 } |
11909 | 11766 |
11910 | 11767 |
11911 RawType* Instance::GetType() const { | 11768 RawType* Instance::GetType() const { |
11912 if (IsNull()) { | 11769 if (IsNull()) { |
11913 return Type::NullType(); | 11770 return Type::NullType(); |
11914 } | 11771 } |
11915 const Class& cls = Class::Handle(clazz()); | 11772 const Class& cls = Class::Handle(clazz()); |
11916 Type& type = Type::Handle(cls.CanonicalType()); | 11773 Type& type = Type::Handle(cls.CanonicalType()); |
11917 if (type.IsNull()) { | 11774 if (type.IsNull()) { |
11918 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); | 11775 TypeArguments& type_arguments = TypeArguments::Handle(); |
11919 if (cls.NumTypeArguments() > 0) { | 11776 if (cls.NumTypeArguments() > 0) { |
11920 type_arguments = GetTypeArguments(); | 11777 type_arguments = GetTypeArguments(); |
11921 } | 11778 } |
11922 type = Type::New(cls, type_arguments, Scanner::kNoSourcePos); | 11779 type = Type::New(cls, type_arguments, Scanner::kNoSourcePos); |
11923 type.SetIsFinalized(); | 11780 type.SetIsFinalized(); |
11924 type ^= type.Canonicalize(); | 11781 type ^= type.Canonicalize(); |
11925 } | 11782 } |
11926 return type.raw(); | 11783 return type.raw(); |
11927 } | 11784 } |
11928 | 11785 |
11929 | 11786 |
11930 RawAbstractTypeArguments* Instance::GetTypeArguments() const { | 11787 RawTypeArguments* Instance::GetTypeArguments() const { |
11931 const Class& cls = Class::Handle(clazz()); | 11788 const Class& cls = Class::Handle(clazz()); |
11932 intptr_t field_offset = cls.type_arguments_field_offset(); | 11789 intptr_t field_offset = cls.type_arguments_field_offset(); |
11933 ASSERT(field_offset != Class::kNoTypeArguments); | 11790 ASSERT(field_offset != Class::kNoTypeArguments); |
11934 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); | 11791 TypeArguments& type_arguments = TypeArguments::Handle(); |
11935 type_arguments ^= *FieldAddrAtOffset(field_offset); | 11792 type_arguments ^= *FieldAddrAtOffset(field_offset); |
11936 return type_arguments.raw(); | 11793 return type_arguments.raw(); |
11937 } | 11794 } |
11938 | 11795 |
11939 | 11796 |
11940 void Instance::SetTypeArguments(const AbstractTypeArguments& value) const { | 11797 void Instance::SetTypeArguments(const TypeArguments& value) const { |
11798 ASSERT(value.IsNull() || value.IsCanonical()); | |
11941 const Class& cls = Class::Handle(clazz()); | 11799 const Class& cls = Class::Handle(clazz()); |
11942 intptr_t field_offset = cls.type_arguments_field_offset(); | 11800 intptr_t field_offset = cls.type_arguments_field_offset(); |
11943 ASSERT(field_offset != Class::kNoTypeArguments); | 11801 ASSERT(field_offset != Class::kNoTypeArguments); |
11944 SetFieldAtOffset(field_offset, value); | 11802 SetFieldAtOffset(field_offset, value); |
11945 } | 11803 } |
11946 | 11804 |
11947 | 11805 |
11948 bool Instance::IsInstanceOf(const AbstractType& other, | 11806 bool Instance::IsInstanceOf(const AbstractType& other, |
11949 const AbstractTypeArguments& other_instantiator, | 11807 const TypeArguments& other_instantiator, |
11950 Error* bound_error) const { | 11808 Error* bound_error) const { |
11951 ASSERT(other.IsFinalized()); | 11809 ASSERT(other.IsFinalized()); |
11952 ASSERT(!other.IsDynamicType()); | 11810 ASSERT(!other.IsDynamicType()); |
11953 ASSERT(!other.IsMalformed()); | 11811 ASSERT(!other.IsMalformed()); |
11954 ASSERT(!other.IsMalbounded()); | 11812 ASSERT(!other.IsMalbounded()); |
11955 if (other.IsVoidType()) { | 11813 if (other.IsVoidType()) { |
11956 return false; | 11814 return false; |
11957 } | 11815 } |
11958 Isolate* isolate = Isolate::Current(); | 11816 Isolate* isolate = Isolate::Current(); |
11959 const Class& cls = Class::Handle(isolate, clazz()); | 11817 const Class& cls = Class::Handle(isolate, clazz()); |
11960 AbstractTypeArguments& type_arguments = | 11818 TypeArguments& type_arguments = |
11961 AbstractTypeArguments::Handle(isolate); | 11819 TypeArguments::Handle(isolate); |
11962 if (cls.NumTypeArguments() > 0) { | 11820 if (cls.NumTypeArguments() > 0) { |
11963 type_arguments = GetTypeArguments(); | 11821 type_arguments = GetTypeArguments(); |
11964 if (!type_arguments.IsNull() && !type_arguments.IsCanonical()) { | 11822 ASSERT(type_arguments.IsNull() || type_arguments.IsCanonical()); |
11965 type_arguments = type_arguments.Canonicalize(); | |
11966 SetTypeArguments(type_arguments); | |
11967 } | |
11968 // The number of type arguments in the instance must be greater or equal to | 11823 // The number of type arguments in the instance must be greater or equal to |
11969 // the number of type arguments expected by the instance class. | 11824 // the number of type arguments expected by the instance class. |
11970 // A discrepancy is allowed for closures, which borrow the type argument | 11825 // A discrepancy is allowed for closures, which borrow the type argument |
11971 // vector of their instantiator, which may be of a subclass of the class | 11826 // vector of their instantiator, which may be of a subclass of the class |
11972 // defining the closure. Truncating the vector to the correct length on | 11827 // defining the closure. Truncating the vector to the correct length on |
11973 // instantiation is unnecessary. The vector may therefore be longer. | 11828 // instantiation is unnecessary. The vector may therefore be longer. |
11974 // Also, an optimization reuses the type argument vector of the instantiator | 11829 // Also, an optimization reuses the type argument vector of the instantiator |
11975 // of generic instances when its layout is compatible. | 11830 // of generic instances when its layout is compatible. |
11976 ASSERT(type_arguments.IsNull() || | 11831 ASSERT(type_arguments.IsNull() || |
11977 (type_arguments.Length() >= cls.NumTypeArguments())); | 11832 (type_arguments.Length() >= cls.NumTypeArguments())); |
11978 } | 11833 } |
11979 Class& other_class = Class::Handle(isolate); | 11834 Class& other_class = Class::Handle(isolate); |
11980 AbstractTypeArguments& other_type_arguments = | 11835 TypeArguments& other_type_arguments = TypeArguments::Handle(isolate); |
11981 AbstractTypeArguments::Handle(isolate); | |
11982 // Note that we may encounter a bound error in checked mode. | 11836 // Note that we may encounter a bound error in checked mode. |
11983 if (!other.IsInstantiated()) { | 11837 if (!other.IsInstantiated()) { |
11984 const AbstractType& instantiated_other = AbstractType::Handle( | 11838 const AbstractType& instantiated_other = AbstractType::Handle( |
11985 isolate, other.InstantiateFrom(other_instantiator, bound_error)); | 11839 isolate, other.InstantiateFrom(other_instantiator, bound_error)); |
11986 if ((bound_error != NULL) && !bound_error->IsNull()) { | 11840 if ((bound_error != NULL) && !bound_error->IsNull()) { |
11987 ASSERT(FLAG_enable_type_checks); | 11841 ASSERT(FLAG_enable_type_checks); |
11988 return false; | 11842 return false; |
11989 } | 11843 } |
11990 other_class = instantiated_other.type_class(); | 11844 other_class = instantiated_other.type_class(); |
11991 other_type_arguments = instantiated_other.arguments(); | 11845 other_type_arguments = instantiated_other.arguments(); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12098 return "non_constant"; | 11952 return "non_constant"; |
12099 } else if (Isolate::Current()->no_gc_scope_depth() > 0) { | 11953 } else if (Isolate::Current()->no_gc_scope_depth() > 0) { |
12100 // Can occur when running disassembler. | 11954 // Can occur when running disassembler. |
12101 return "Instance"; | 11955 return "Instance"; |
12102 } else { | 11956 } else { |
12103 if (IsClosure()) { | 11957 if (IsClosure()) { |
12104 return Closure::ToCString(*this); | 11958 return Closure::ToCString(*this); |
12105 } | 11959 } |
12106 const char* kFormat = "Instance of '%s'"; | 11960 const char* kFormat = "Instance of '%s'"; |
12107 const Class& cls = Class::Handle(clazz()); | 11961 const Class& cls = Class::Handle(clazz()); |
12108 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); | 11962 TypeArguments& type_arguments = TypeArguments::Handle(); |
12109 const intptr_t num_type_arguments = cls.NumTypeArguments(); | 11963 const intptr_t num_type_arguments = cls.NumTypeArguments(); |
12110 if (num_type_arguments > 0) { | 11964 if (num_type_arguments > 0) { |
12111 type_arguments = GetTypeArguments(); | 11965 type_arguments = GetTypeArguments(); |
12112 } | 11966 } |
12113 const Type& type = | 11967 const Type& type = |
12114 Type::Handle(Type::New(cls, type_arguments, Scanner::kNoSourcePos)); | 11968 Type::Handle(Type::New(cls, type_arguments, Scanner::kNoSourcePos)); |
12115 const String& type_name = String::Handle(type.UserVisibleName()); | 11969 const String& type_name = String::Handle(type.UserVisibleName()); |
12116 // Calculate the size of the string. | 11970 // Calculate the size of the string. |
12117 intptr_t len = OS::SNPrint(NULL, 0, kFormat, type_name.ToCString()) + 1; | 11971 intptr_t len = OS::SNPrint(NULL, 0, kFormat, type_name.ToCString()) + 1; |
12118 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 11972 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12206 } | 12060 } |
12207 | 12061 |
12208 | 12062 |
12209 RawUnresolvedClass* AbstractType::unresolved_class() const { | 12063 RawUnresolvedClass* AbstractType::unresolved_class() const { |
12210 // AbstractType is an abstract class. | 12064 // AbstractType is an abstract class. |
12211 UNREACHABLE(); | 12065 UNREACHABLE(); |
12212 return UnresolvedClass::null(); | 12066 return UnresolvedClass::null(); |
12213 } | 12067 } |
12214 | 12068 |
12215 | 12069 |
12216 RawAbstractTypeArguments* AbstractType::arguments() const { | 12070 RawTypeArguments* AbstractType::arguments() const { |
12217 // AbstractType is an abstract class. | 12071 // AbstractType is an abstract class. |
12218 UNREACHABLE(); | 12072 UNREACHABLE(); |
12219 return NULL; | 12073 return NULL; |
12220 } | 12074 } |
12221 | 12075 |
12222 | 12076 |
12223 intptr_t AbstractType::token_pos() const { | 12077 intptr_t AbstractType::token_pos() const { |
12224 // AbstractType is an abstract class. | 12078 // AbstractType is an abstract class. |
12225 UNREACHABLE(); | 12079 UNREACHABLE(); |
12226 return -1; | 12080 return -1; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12284 | 12138 |
12285 bool AbstractType::IsEquivalent(const Instance& other, | 12139 bool AbstractType::IsEquivalent(const Instance& other, |
12286 GrowableObjectArray* trail) const { | 12140 GrowableObjectArray* trail) const { |
12287 // AbstractType is an abstract class. | 12141 // AbstractType is an abstract class. |
12288 UNREACHABLE(); | 12142 UNREACHABLE(); |
12289 return false; | 12143 return false; |
12290 } | 12144 } |
12291 | 12145 |
12292 | 12146 |
12293 RawAbstractType* AbstractType::InstantiateFrom( | 12147 RawAbstractType* AbstractType::InstantiateFrom( |
12294 const AbstractTypeArguments& instantiator_type_arguments, | 12148 const TypeArguments& instantiator_type_arguments, |
12295 Error* bound_error, | 12149 Error* bound_error, |
12296 GrowableObjectArray* trail) const { | 12150 GrowableObjectArray* trail) const { |
12297 // AbstractType is an abstract class. | 12151 // AbstractType is an abstract class. |
12298 UNREACHABLE(); | 12152 UNREACHABLE(); |
12299 return NULL; | 12153 return NULL; |
12300 } | 12154 } |
12301 | 12155 |
12302 | 12156 |
12303 RawAbstractType* AbstractType::CloneUnfinalized() const { | 12157 RawAbstractType* AbstractType::CloneUnfinalized() const { |
12304 // AbstractType is an abstract class. | 12158 // AbstractType is an abstract class. |
(...skipping 20 matching lines...) Expand all Loading... | |
12325 type_name = String::Concat(type_name, Symbols::SpaceExtendsSpace()); | 12179 type_name = String::Concat(type_name, Symbols::SpaceExtendsSpace()); |
12326 // Build the bound name without causing divergence. | 12180 // Build the bound name without causing divergence. |
12327 const AbstractType& bound = AbstractType::Handle( | 12181 const AbstractType& bound = AbstractType::Handle( |
12328 BoundedType::Cast(*this).bound()); | 12182 BoundedType::Cast(*this).bound()); |
12329 String& bound_name = String::Handle(); | 12183 String& bound_name = String::Handle(); |
12330 if (bound.IsTypeParameter()) { | 12184 if (bound.IsTypeParameter()) { |
12331 bound_name = TypeParameter::Cast(bound).name(); | 12185 bound_name = TypeParameter::Cast(bound).name(); |
12332 } else if (bound.IsType()) { | 12186 } else if (bound.IsType()) { |
12333 const Class& cls = Class::Handle(Type::Cast(bound).type_class()); | 12187 const Class& cls = Class::Handle(Type::Cast(bound).type_class()); |
12334 bound_name = cls.Name(); | 12188 bound_name = cls.Name(); |
12335 if (Type::Cast(bound).arguments() != AbstractTypeArguments::null()) { | 12189 if (Type::Cast(bound).arguments() != TypeArguments::null()) { |
12336 bound_name = String::Concat(bound_name, Symbols::OptimizedOut()); | 12190 bound_name = String::Concat(bound_name, Symbols::OptimizedOut()); |
12337 } | 12191 } |
12338 } else { | 12192 } else { |
12339 bound_name = String::New(Symbols::OptimizedOut()); | 12193 bound_name = String::New(Symbols::OptimizedOut()); |
12340 } | 12194 } |
12341 type_name = String::Concat(type_name, bound_name); | 12195 type_name = String::Concat(type_name, bound_name); |
12342 return Symbols::New(type_name); | 12196 return Symbols::New(type_name); |
12343 } | 12197 } |
12344 if (IsTypeParameter()) { | 12198 if (IsTypeParameter()) { |
12345 return TypeParameter::Cast(*this).name(); | 12199 return TypeParameter::Cast(*this).name(); |
12346 } | 12200 } |
12347 // If the type is still being finalized, we may be reporting an error about | 12201 // If the type is still being finalized, we may be reporting an error about |
12348 // a malformed type, so proceed with caution. | 12202 // a malformed type, so proceed with caution. |
12349 const AbstractTypeArguments& args = | 12203 const TypeArguments& args = TypeArguments::Handle(arguments()); |
12350 AbstractTypeArguments::Handle(arguments()); | |
12351 const intptr_t num_args = args.IsNull() ? 0 : args.Length(); | 12204 const intptr_t num_args = args.IsNull() ? 0 : args.Length(); |
12352 String& class_name = String::Handle(); | 12205 String& class_name = String::Handle(); |
12353 intptr_t first_type_param_index; | 12206 intptr_t first_type_param_index; |
12354 intptr_t num_type_params; // Number of type parameters to print. | 12207 intptr_t num_type_params; // Number of type parameters to print. |
12355 if (HasResolvedTypeClass()) { | 12208 if (HasResolvedTypeClass()) { |
12356 const Class& cls = Class::Handle(type_class()); | 12209 const Class& cls = Class::Handle(type_class()); |
12357 num_type_params = cls.NumTypeParameters(); // Do not print the full vector. | 12210 num_type_params = cls.NumTypeParameters(); // Do not print the full vector. |
12358 if (name_visibility == kInternalName) { | 12211 if (name_visibility == kInternalName) { |
12359 class_name = cls.Name(); | 12212 class_name = cls.Name(); |
12360 } else { | 12213 } else { |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12549 if (bound.IsMoreSpecificThan(other, bound_error)) { | 12402 if (bound.IsMoreSpecificThan(other, bound_error)) { |
12550 return true; | 12403 return true; |
12551 } | 12404 } |
12552 return false; // TODO(regis): We should return "maybe after instantiation". | 12405 return false; // TODO(regis): We should return "maybe after instantiation". |
12553 } | 12406 } |
12554 if (other.IsTypeParameter()) { | 12407 if (other.IsTypeParameter()) { |
12555 return false; // TODO(regis): We should return "maybe after instantiation". | 12408 return false; // TODO(regis): We should return "maybe after instantiation". |
12556 } | 12409 } |
12557 const Class& cls = Class::Handle(type_class()); | 12410 const Class& cls = Class::Handle(type_class()); |
12558 return cls.TypeTest(test_kind, | 12411 return cls.TypeTest(test_kind, |
12559 AbstractTypeArguments::Handle(arguments()), | 12412 TypeArguments::Handle(arguments()), |
12560 Class::Handle(other.type_class()), | 12413 Class::Handle(other.type_class()), |
12561 AbstractTypeArguments::Handle(other.arguments()), | 12414 TypeArguments::Handle(other.arguments()), |
12562 bound_error); | 12415 bound_error); |
12563 } | 12416 } |
12564 | 12417 |
12565 | 12418 |
12566 intptr_t AbstractType::Hash() const { | 12419 intptr_t AbstractType::Hash() const { |
12567 // AbstractType is an abstract class. | 12420 // AbstractType is an abstract class. |
12568 UNREACHABLE(); | 12421 UNREACHABLE(); |
12569 return 0; | 12422 return 0; |
12570 } | 12423 } |
12571 | 12424 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12742 } | 12595 } |
12743 | 12596 |
12744 | 12597 |
12745 bool Type::IsResolved() const { | 12598 bool Type::IsResolved() const { |
12746 if (IsFinalized()) { | 12599 if (IsFinalized()) { |
12747 return true; | 12600 return true; |
12748 } | 12601 } |
12749 if (!HasResolvedTypeClass()) { | 12602 if (!HasResolvedTypeClass()) { |
12750 return false; | 12603 return false; |
12751 } | 12604 } |
12752 const AbstractTypeArguments& args = | 12605 const TypeArguments& args = TypeArguments::Handle(arguments()); |
12753 AbstractTypeArguments::Handle(arguments()); | |
12754 return args.IsNull() || args.IsResolved(); | 12606 return args.IsNull() || args.IsResolved(); |
12755 } | 12607 } |
12756 | 12608 |
12757 | 12609 |
12758 bool Type::HasResolvedTypeClass() const { | 12610 bool Type::HasResolvedTypeClass() const { |
12759 const Object& type_class = Object::Handle(raw_ptr()->type_class_); | 12611 const Object& type_class = Object::Handle(raw_ptr()->type_class_); |
12760 return !type_class.IsNull() && type_class.IsClass(); | 12612 return !type_class.IsNull() && type_class.IsClass(); |
12761 } | 12613 } |
12762 | 12614 |
12763 | 12615 |
(...skipping 17 matching lines...) Expand all Loading... | |
12781 ASSERT(!unresolved_class.IsNull()); | 12633 ASSERT(!unresolved_class.IsNull()); |
12782 return unresolved_class.raw(); | 12634 return unresolved_class.raw(); |
12783 #else | 12635 #else |
12784 ASSERT(!Object::Handle(raw_ptr()->type_class_).IsNull()); | 12636 ASSERT(!Object::Handle(raw_ptr()->type_class_).IsNull()); |
12785 ASSERT(Object::Handle(raw_ptr()->type_class_).IsUnresolvedClass()); | 12637 ASSERT(Object::Handle(raw_ptr()->type_class_).IsUnresolvedClass()); |
12786 return reinterpret_cast<RawUnresolvedClass*>(raw_ptr()->type_class_); | 12638 return reinterpret_cast<RawUnresolvedClass*>(raw_ptr()->type_class_); |
12787 #endif | 12639 #endif |
12788 } | 12640 } |
12789 | 12641 |
12790 | 12642 |
12791 RawAbstractTypeArguments* Type::arguments() const { | 12643 RawTypeArguments* Type::arguments() const { |
12792 return raw_ptr()->arguments_; | 12644 return raw_ptr()->arguments_; |
12793 } | 12645 } |
12794 | 12646 |
12795 | 12647 |
12796 bool Type::IsInstantiated(GrowableObjectArray* trail) const { | 12648 bool Type::IsInstantiated(GrowableObjectArray* trail) const { |
12797 if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) { | 12649 if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) { |
12798 return true; | 12650 return true; |
12799 } | 12651 } |
12800 if (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated) { | 12652 if (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated) { |
12801 return false; | 12653 return false; |
12802 } | 12654 } |
12803 const AbstractTypeArguments& args = | 12655 const TypeArguments& args = TypeArguments::Handle(arguments()); |
12804 AbstractTypeArguments::Handle(arguments()); | |
12805 return args.IsNull() || args.IsInstantiated(trail); | 12656 return args.IsNull() || args.IsInstantiated(trail); |
12806 } | 12657 } |
12807 | 12658 |
12808 | 12659 |
12809 RawAbstractType* Type::InstantiateFrom( | 12660 RawAbstractType* Type::InstantiateFrom( |
12810 const AbstractTypeArguments& instantiator_type_arguments, | 12661 const TypeArguments& instantiator_type_arguments, |
12811 Error* bound_error, | 12662 Error* bound_error, |
12812 GrowableObjectArray* trail) const { | 12663 GrowableObjectArray* trail) const { |
12813 ASSERT(IsFinalized() || IsBeingFinalized()); | 12664 ASSERT(IsFinalized() || IsBeingFinalized()); |
12814 ASSERT(!IsInstantiated()); | 12665 ASSERT(!IsInstantiated()); |
12815 // Return the uninstantiated type unchanged if malformed. No copy needed. | 12666 // Return the uninstantiated type unchanged if malformed. No copy needed. |
12816 if (IsMalformed()) { | 12667 if (IsMalformed()) { |
12817 return raw(); | 12668 return raw(); |
12818 } | 12669 } |
12819 AbstractTypeArguments& type_arguments = | 12670 TypeArguments& type_arguments = TypeArguments::Handle(arguments()); |
12820 AbstractTypeArguments::Handle(arguments()); | |
12821 type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments, | 12671 type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments, |
12822 bound_error, | 12672 bound_error, |
12823 trail); | 12673 trail); |
12824 // Note that the type class has to be resolved at this time, but not | 12674 // Note that the type class has to be resolved at this time, but not |
12825 // necessarily finalized yet. We may be checking bounds at compile time. | 12675 // necessarily finalized yet. We may be checking bounds at compile time. |
12826 const Class& cls = Class::Handle(type_class()); | 12676 const Class& cls = Class::Handle(type_class()); |
12827 // This uninstantiated type is not modified, as it can be instantiated | 12677 // This uninstantiated type is not modified, as it can be instantiated |
12828 // with different instantiators. | 12678 // with different instantiators. |
12829 Type& instantiated_type = Type::Handle( | 12679 Type& instantiated_type = Type::Handle( |
12830 Type::New(cls, type_arguments, token_pos())); | 12680 Type::New(cls, type_arguments, token_pos())); |
12831 ASSERT(type_arguments.IsNull() || | 12681 ASSERT(type_arguments.IsNull() || |
12832 (type_arguments.Length() == cls.NumTypeArguments())); | 12682 (type_arguments.Length() == cls.NumTypeArguments())); |
12833 instantiated_type.SetIsFinalized(); | 12683 instantiated_type.SetIsFinalized(); |
12684 // Canonicalization is not part of instantiation. | |
12834 return instantiated_type.raw(); | 12685 return instantiated_type.raw(); |
12835 } | 12686 } |
12836 | 12687 |
12837 | 12688 |
12838 bool Type::IsEquivalent(const Instance& other, | 12689 bool Type::IsEquivalent(const Instance& other, |
12839 GrowableObjectArray* trail) const { | 12690 GrowableObjectArray* trail) const { |
12840 ASSERT(!IsNull()); | 12691 ASSERT(!IsNull()); |
12841 if (raw() == other.raw()) { | 12692 if (raw() == other.raw()) { |
12842 return true; | 12693 return true; |
12843 } | 12694 } |
(...skipping 22 matching lines...) Expand all Loading... | |
12866 return true; | 12717 return true; |
12867 } | 12718 } |
12868 const Class& cls = Class::Handle(type_class()); | 12719 const Class& cls = Class::Handle(type_class()); |
12869 const intptr_t num_type_params = cls.NumTypeParameters(); | 12720 const intptr_t num_type_params = cls.NumTypeParameters(); |
12870 if (num_type_params == 0) { | 12721 if (num_type_params == 0) { |
12871 // Shortcut unnecessary handle allocation below. | 12722 // Shortcut unnecessary handle allocation below. |
12872 return true; | 12723 return true; |
12873 } | 12724 } |
12874 const intptr_t num_type_args = cls.NumTypeArguments(); | 12725 const intptr_t num_type_args = cls.NumTypeArguments(); |
12875 const intptr_t from_index = num_type_args - num_type_params; | 12726 const intptr_t from_index = num_type_args - num_type_params; |
12876 const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle( | 12727 const TypeArguments& type_args = TypeArguments::Handle(arguments()); |
12877 arguments()); | 12728 const TypeArguments& other_type_args = TypeArguments::Handle( |
12878 const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle( | |
12879 other_type.arguments()); | 12729 other_type.arguments()); |
12880 if (type_args.IsNull()) { | 12730 if (type_args.IsNull()) { |
12881 return other_type_args.IsRaw(from_index, num_type_params); | 12731 return other_type_args.IsRaw(from_index, num_type_params); |
12882 } | 12732 } |
12883 if (other_type_args.IsNull()) { | 12733 if (other_type_args.IsNull()) { |
12884 return type_args.IsRaw(from_index, num_type_params); | 12734 return type_args.IsRaw(from_index, num_type_params); |
12885 } | 12735 } |
12886 ASSERT(type_args.Length() >= (from_index + num_type_params)); | 12736 ASSERT(type_args.Length() >= (from_index + num_type_params)); |
12887 ASSERT(other_type_args.Length() >= (from_index + num_type_params)); | 12737 ASSERT(other_type_args.Length() >= (from_index + num_type_params)); |
12888 AbstractType& type_arg = AbstractType::Handle(); | 12738 AbstractType& type_arg = AbstractType::Handle(); |
12889 AbstractType& other_type_arg = AbstractType::Handle(); | 12739 AbstractType& other_type_arg = AbstractType::Handle(); |
12890 for (intptr_t i = 0; i < num_type_params; i++) { | 12740 for (intptr_t i = 0; i < num_type_params; i++) { |
12891 type_arg = type_args.TypeAt(from_index + i); | 12741 type_arg = type_args.TypeAt(from_index + i); |
12892 other_type_arg = other_type_args.TypeAt(from_index + i); | 12742 other_type_arg = other_type_args.TypeAt(from_index + i); |
12893 if (!type_arg.IsEquivalent(other_type_arg, trail)) { | 12743 if (!type_arg.IsEquivalent(other_type_arg, trail)) { |
12894 return false; | 12744 return false; |
12895 } | 12745 } |
12896 } | 12746 } |
12897 return true; | 12747 return true; |
12898 } | 12748 } |
12899 | 12749 |
12900 | 12750 |
12901 RawAbstractType* Type::CloneUnfinalized() const { | 12751 RawAbstractType* Type::CloneUnfinalized() const { |
12902 ASSERT(IsResolved()); | 12752 ASSERT(IsResolved()); |
12903 if (IsFinalized()) { | 12753 if (IsFinalized()) { |
12904 return raw(); | 12754 return raw(); |
12905 } | 12755 } |
12906 ASSERT(!IsMalformed()); // Malformed types are finalized. | 12756 ASSERT(!IsMalformed()); // Malformed types are finalized. |
12907 ASSERT(!IsBeingFinalized()); // Cloning must occur prior to finalization. | 12757 ASSERT(!IsBeingFinalized()); // Cloning must occur prior to finalization. |
12908 AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(arguments()); | 12758 TypeArguments& type_args = TypeArguments::Handle(arguments()); |
12909 type_args = type_args.CloneUnfinalized(); | 12759 type_args = type_args.CloneUnfinalized(); |
12910 const Class& type_cls = Class::Handle(type_class()); | 12760 const Class& type_cls = Class::Handle(type_class()); |
12911 return Type::New(type_cls, type_args, token_pos()); | 12761 return Type::New(type_cls, type_args, token_pos()); |
12912 } | 12762 } |
12913 | 12763 |
12914 | 12764 |
12915 RawAbstractType* Type::Canonicalize(GrowableObjectArray* trail) const { | 12765 RawAbstractType* Type::Canonicalize(GrowableObjectArray* trail) const { |
12916 ASSERT(IsFinalized()); | 12766 ASSERT(IsFinalized()); |
12917 if (IsCanonical() || IsMalformed()) { | 12767 if (IsCanonical() || IsMalformed()) { |
12918 ASSERT(IsMalformed() || AbstractTypeArguments::Handle(arguments()).IsOld()); | 12768 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); |
12919 return this->raw(); | 12769 return this->raw(); |
12920 } | 12770 } |
12921 Isolate* isolate = Isolate::Current(); | 12771 Isolate* isolate = Isolate::Current(); |
12922 Type& type = Type::Handle(isolate); | 12772 Type& type = Type::Handle(isolate); |
12923 const Class& cls = Class::Handle(isolate, type_class()); | 12773 const Class& cls = Class::Handle(isolate, type_class()); |
12924 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { | 12774 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { |
12925 return Object::dynamic_type(); | 12775 return Object::dynamic_type(); |
12926 } | 12776 } |
12927 // Fast canonical lookup/registry for simple types. | 12777 // Fast canonical lookup/registry for simple types. |
12928 if ((cls.NumTypeArguments() == 0) && !cls.IsSignatureClass()) { | 12778 if ((cls.NumTypeArguments() == 0) && !cls.IsSignatureClass()) { |
(...skipping 24 matching lines...) Expand all Loading... | |
12953 if (type.IsNull()) { | 12803 if (type.IsNull()) { |
12954 break; | 12804 break; |
12955 } | 12805 } |
12956 ASSERT(type.IsFinalized()); | 12806 ASSERT(type.IsFinalized()); |
12957 if (this->Equals(type)) { | 12807 if (this->Equals(type)) { |
12958 return type.raw(); | 12808 return type.raw(); |
12959 } | 12809 } |
12960 index++; | 12810 index++; |
12961 } | 12811 } |
12962 // Canonicalize the type arguments. | 12812 // Canonicalize the type arguments. |
12963 AbstractTypeArguments& type_args = | 12813 TypeArguments& type_args = TypeArguments::Handle(isolate, arguments()); |
12964 AbstractTypeArguments::Handle(isolate, arguments()); | |
12965 // In case the type is first canonicalized at runtime, its type argument | 12814 // In case the type is first canonicalized at runtime, its type argument |
12966 // vector may be longer than necessary. This is not an issue. | 12815 // vector may be longer than necessary. This is not an issue. |
12967 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); | 12816 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); |
12968 type_args = type_args.Canonicalize(trail); | 12817 type_args = type_args.Canonicalize(trail); |
12969 set_arguments(type_args); | 12818 set_arguments(type_args); |
12970 // The type needs to be added to the list. Grow the list if it is full. | 12819 // The type needs to be added to the list. Grow the list if it is full. |
12971 if (index == canonical_types_len) { | 12820 if (index == canonical_types_len) { |
12972 const intptr_t kLengthIncrement = 2; // Raw and parameterized. | 12821 const intptr_t kLengthIncrement = 2; // Raw and parameterized. |
12973 const intptr_t new_length = canonical_types.Length() + kLengthIncrement; | 12822 const intptr_t new_length = canonical_types.Length() + kLengthIncrement; |
12974 const Array& new_canonical_types = Array::Handle( | 12823 const Array& new_canonical_types = Array::Handle( |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13007 SetCanonical(); | 12856 SetCanonical(); |
13008 return this->raw(); | 12857 return this->raw(); |
13009 } | 12858 } |
13010 | 12859 |
13011 | 12860 |
13012 intptr_t Type::Hash() const { | 12861 intptr_t Type::Hash() const { |
13013 ASSERT(IsFinalized()); | 12862 ASSERT(IsFinalized()); |
13014 uword result = 1; | 12863 uword result = 1; |
13015 if (IsMalformed()) return result; | 12864 if (IsMalformed()) return result; |
13016 result += Class::Handle(type_class()).id(); | 12865 result += Class::Handle(type_class()).id(); |
13017 result += AbstractTypeArguments::Handle(arguments()).Hash(); | 12866 result += TypeArguments::Handle(arguments()).Hash(); |
13018 return FinalizeHash(result); | 12867 return FinalizeHash(result); |
13019 } | 12868 } |
13020 | 12869 |
13021 | 12870 |
13022 void Type::set_type_class(const Object& value) const { | 12871 void Type::set_type_class(const Object& value) const { |
13023 ASSERT(!value.IsNull() && (value.IsClass() || value.IsUnresolvedClass())); | 12872 ASSERT(!value.IsNull() && (value.IsClass() || value.IsUnresolvedClass())); |
13024 StorePointer(&raw_ptr()->type_class_, value.raw()); | 12873 StorePointer(&raw_ptr()->type_class_, value.raw()); |
13025 } | 12874 } |
13026 | 12875 |
13027 | 12876 |
13028 void Type::set_arguments(const AbstractTypeArguments& value) const { | 12877 void Type::set_arguments(const TypeArguments& value) const { |
13029 StorePointer(&raw_ptr()->arguments_, value.raw()); | 12878 StorePointer(&raw_ptr()->arguments_, value.raw()); |
13030 } | 12879 } |
13031 | 12880 |
13032 | 12881 |
13033 RawType* Type::New(Heap::Space space) { | 12882 RawType* Type::New(Heap::Space space) { |
13034 ASSERT(Isolate::Current()->object_store()->type_class() != Class::null()); | 12883 ASSERT(Isolate::Current()->object_store()->type_class() != Class::null()); |
13035 RawObject* raw = Object::Allocate(Type::kClassId, | 12884 RawObject* raw = Object::Allocate(Type::kClassId, |
13036 Type::InstanceSize(), | 12885 Type::InstanceSize(), |
13037 space); | 12886 space); |
13038 return reinterpret_cast<RawType*>(raw); | 12887 return reinterpret_cast<RawType*>(raw); |
13039 } | 12888 } |
13040 | 12889 |
13041 | 12890 |
13042 RawType* Type::New(const Object& clazz, | 12891 RawType* Type::New(const Object& clazz, |
13043 const AbstractTypeArguments& arguments, | 12892 const TypeArguments& arguments, |
13044 intptr_t token_pos, | 12893 intptr_t token_pos, |
13045 Heap::Space space) { | 12894 Heap::Space space) { |
13046 const Type& result = Type::Handle(Type::New(space)); | 12895 const Type& result = Type::Handle(Type::New(space)); |
13047 result.set_type_class(clazz); | 12896 result.set_type_class(clazz); |
13048 result.set_arguments(arguments); | 12897 result.set_arguments(arguments); |
13049 result.set_token_pos(token_pos); | 12898 result.set_token_pos(token_pos); |
13050 result.raw_ptr()->type_state_ = RawType::kAllocated; | 12899 result.raw_ptr()->type_state_ = RawType::kAllocated; |
13051 return result.raw(); | 12900 return result.raw(); |
13052 } | 12901 } |
13053 | 12902 |
13054 | 12903 |
13055 void Type::set_token_pos(intptr_t token_pos) const { | 12904 void Type::set_token_pos(intptr_t token_pos) const { |
13056 ASSERT(token_pos >= 0); | 12905 ASSERT(token_pos >= 0); |
13057 raw_ptr()->token_pos_ = token_pos; | 12906 raw_ptr()->token_pos_ = token_pos; |
13058 } | 12907 } |
13059 | 12908 |
13060 | 12909 |
13061 void Type::set_type_state(int8_t state) const { | 12910 void Type::set_type_state(int8_t state) const { |
13062 ASSERT((state == RawType::kAllocated) || | 12911 ASSERT((state == RawType::kAllocated) || |
13063 (state == RawType::kBeingFinalized) || | 12912 (state == RawType::kBeingFinalized) || |
13064 (state == RawType::kFinalizedInstantiated) || | 12913 (state == RawType::kFinalizedInstantiated) || |
13065 (state == RawType::kFinalizedUninstantiated)); | 12914 (state == RawType::kFinalizedUninstantiated)); |
13066 raw_ptr()->type_state_ = state; | 12915 raw_ptr()->type_state_ = state; |
13067 } | 12916 } |
13068 | 12917 |
13069 | 12918 |
13070 const char* Type::ToCString() const { | 12919 const char* Type::ToCString() const { |
13071 if (IsResolved()) { | 12920 if (IsResolved()) { |
13072 const AbstractTypeArguments& type_arguments = | 12921 const TypeArguments& type_arguments = TypeArguments::Handle(arguments()); |
13073 AbstractTypeArguments::Handle(arguments()); | |
13074 const char* class_name; | 12922 const char* class_name; |
13075 if (HasResolvedTypeClass()) { | 12923 if (HasResolvedTypeClass()) { |
13076 class_name = String::Handle( | 12924 class_name = String::Handle( |
13077 Class::Handle(type_class()).Name()).ToCString(); | 12925 Class::Handle(type_class()).Name()).ToCString(); |
13078 } else { | 12926 } else { |
13079 class_name = UnresolvedClass::Handle(unresolved_class()).ToCString(); | 12927 class_name = UnresolvedClass::Handle(unresolved_class()).ToCString(); |
13080 } | 12928 } |
13081 if (type_arguments.IsNull()) { | 12929 if (type_arguments.IsNull()) { |
13082 const char* format = "Type: class '%s'"; | 12930 const char* format = "Type: class '%s'"; |
13083 intptr_t len = OS::SNPrint(NULL, 0, format, class_name) + 1; | 12931 intptr_t len = OS::SNPrint(NULL, 0, format, class_name) + 1; |
13084 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 12932 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13085 OS::SNPrint(chars, len, format, class_name); | 12933 OS::SNPrint(chars, len, format, class_name); |
13086 return chars; | 12934 return chars; |
13087 } else { | 12935 } else { |
13088 const char* format = "Type: class '%s', args:[%s]"; | 12936 const char* format = "Type: class '%s', args:[%s]"; |
13089 const char* args_cstr = | 12937 const char* args_cstr = TypeArguments::Handle(arguments()).ToCString(); |
13090 AbstractTypeArguments::Handle(arguments()).ToCString(); | |
13091 intptr_t len = OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1; | 12938 intptr_t len = OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1; |
13092 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 12939 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13093 OS::SNPrint(chars, len, format, class_name, args_cstr); | 12940 OS::SNPrint(chars, len, format, class_name, args_cstr); |
13094 return chars; | 12941 return chars; |
13095 } | 12942 } |
13096 } else { | 12943 } else { |
13097 return "Unresolved Type"; | 12944 return "Unresolved Type"; |
13098 } | 12945 } |
13099 } | 12946 } |
13100 | 12947 |
(...skipping 17 matching lines...) Expand all Loading... | |
13118 return true; | 12965 return true; |
13119 } | 12966 } |
13120 if (TestAndAddBuddyToTrail(&trail, other)) { | 12967 if (TestAndAddBuddyToTrail(&trail, other)) { |
13121 return true; | 12968 return true; |
13122 } | 12969 } |
13123 return AbstractType::Handle(type()).IsEquivalent(other, trail); | 12970 return AbstractType::Handle(type()).IsEquivalent(other, trail); |
13124 } | 12971 } |
13125 | 12972 |
13126 | 12973 |
13127 RawAbstractType* TypeRef::InstantiateFrom( | 12974 RawAbstractType* TypeRef::InstantiateFrom( |
13128 const AbstractTypeArguments& instantiator_type_arguments, | 12975 const TypeArguments& instantiator_type_arguments, |
13129 Error* bound_error, | 12976 Error* bound_error, |
13130 GrowableObjectArray* trail) const { | 12977 GrowableObjectArray* trail) const { |
13131 TypeRef& instantiated_type_ref = TypeRef::Handle(); | 12978 TypeRef& instantiated_type_ref = TypeRef::Handle(); |
13132 instantiated_type_ref ^= OnlyBuddyInTrail(trail); | 12979 instantiated_type_ref ^= OnlyBuddyInTrail(trail); |
13133 if (!instantiated_type_ref.IsNull()) { | 12980 if (!instantiated_type_ref.IsNull()) { |
13134 return instantiated_type_ref.raw(); | 12981 return instantiated_type_ref.raw(); |
13135 } | 12982 } |
13136 instantiated_type_ref = TypeRef::New(Type::Handle(Type::DynamicType())); | 12983 instantiated_type_ref = TypeRef::New(Type::Handle(Type::DynamicType())); |
13137 AddOnlyBuddyToTrail(&trail, instantiated_type_ref); | 12984 AddOnlyBuddyToTrail(&trail, instantiated_type_ref); |
13138 const AbstractType& ref_type = AbstractType::Handle(type()); | 12985 const AbstractType& ref_type = AbstractType::Handle(type()); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13252 result.set_type(type); | 13099 result.set_type(type); |
13253 return result.raw(); | 13100 return result.raw(); |
13254 } | 13101 } |
13255 | 13102 |
13256 | 13103 |
13257 const char* TypeRef::ToCString() const { | 13104 const char* TypeRef::ToCString() const { |
13258 const char* format = "TypeRef: %s%s"; | 13105 const char* format = "TypeRef: %s%s"; |
13259 const char* type_cstr = String::Handle(Class::Handle(AbstractType::Handle( | 13106 const char* type_cstr = String::Handle(Class::Handle(AbstractType::Handle( |
13260 type()).type_class()).Name()).ToCString(); | 13107 type()).type_class()).Name()).ToCString(); |
13261 const char* args_cstr = (AbstractType::Handle( | 13108 const char* args_cstr = (AbstractType::Handle( |
13262 type()).arguments() == AbstractTypeArguments::null()) ? "" : "<...>"; | 13109 type()).arguments() == TypeArguments::null()) ? "" : "<...>"; |
13263 intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, args_cstr) + 1; | 13110 intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, args_cstr) + 1; |
13264 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 13111 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13265 OS::SNPrint(chars, len, format, type_cstr, args_cstr); | 13112 OS::SNPrint(chars, len, format, type_cstr, args_cstr); |
13266 return chars; | 13113 return chars; |
13267 } | 13114 } |
13268 | 13115 |
13269 | 13116 |
13270 void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const { | 13117 void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const { |
13271 JSONObject jsobj(stream); | 13118 JSONObject jsobj(stream); |
13272 } | 13119 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13321 StorePointer(&raw_ptr()->name_, value.raw()); | 13168 StorePointer(&raw_ptr()->name_, value.raw()); |
13322 } | 13169 } |
13323 | 13170 |
13324 | 13171 |
13325 void TypeParameter::set_bound(const AbstractType& value) const { | 13172 void TypeParameter::set_bound(const AbstractType& value) const { |
13326 StorePointer(&raw_ptr()->bound_, value.raw()); | 13173 StorePointer(&raw_ptr()->bound_, value.raw()); |
13327 } | 13174 } |
13328 | 13175 |
13329 | 13176 |
13330 RawAbstractType* TypeParameter::InstantiateFrom( | 13177 RawAbstractType* TypeParameter::InstantiateFrom( |
13331 const AbstractTypeArguments& instantiator_type_arguments, | 13178 const TypeArguments& instantiator_type_arguments, |
13332 Error* bound_error, | 13179 Error* bound_error, |
13333 GrowableObjectArray* trail) const { | 13180 GrowableObjectArray* trail) const { |
13334 ASSERT(IsFinalized()); | 13181 ASSERT(IsFinalized()); |
13335 if (instantiator_type_arguments.IsNull()) { | 13182 if (instantiator_type_arguments.IsNull()) { |
13336 return Type::DynamicType(); | 13183 return Type::DynamicType(); |
13337 } | 13184 } |
13338 const AbstractType& type_arg = AbstractType::Handle( | 13185 const AbstractType& type_arg = AbstractType::Handle( |
13339 instantiator_type_arguments.TypeAt(index())); | 13186 instantiator_type_arguments.TypeAt(index())); |
13340 // There is no need to canonicalize the instantiated type parameter, since all | 13187 // There is no need to canonicalize the instantiated type parameter, since all |
13341 // type arguments are canonicalized at type finalization time. It would be too | 13188 // type arguments are canonicalized at type finalization time. It would be too |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13546 | 13393 |
13547 void BoundedType::set_type_parameter(const TypeParameter& value) const { | 13394 void BoundedType::set_type_parameter(const TypeParameter& value) const { |
13548 // A null type parameter is set when marking a type malformed because of a | 13395 // A null type parameter is set when marking a type malformed because of a |
13549 // bound error at compile time. | 13396 // bound error at compile time. |
13550 ASSERT(value.IsNull() || value.IsFinalized()); | 13397 ASSERT(value.IsNull() || value.IsFinalized()); |
13551 StorePointer(&raw_ptr()->type_parameter_, value.raw()); | 13398 StorePointer(&raw_ptr()->type_parameter_, value.raw()); |
13552 } | 13399 } |
13553 | 13400 |
13554 | 13401 |
13555 RawAbstractType* BoundedType::InstantiateFrom( | 13402 RawAbstractType* BoundedType::InstantiateFrom( |
13556 const AbstractTypeArguments& instantiator_type_arguments, | 13403 const TypeArguments& instantiator_type_arguments, |
13557 Error* bound_error, | 13404 Error* bound_error, |
13558 GrowableObjectArray* trail) const { | 13405 GrowableObjectArray* trail) const { |
13559 ASSERT(IsFinalized()); | 13406 ASSERT(IsFinalized()); |
13560 AbstractType& bounded_type = AbstractType::Handle(type()); | 13407 AbstractType& bounded_type = AbstractType::Handle(type()); |
13561 if (!bounded_type.IsInstantiated()) { | 13408 if (!bounded_type.IsInstantiated()) { |
13562 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, | 13409 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, |
13563 bound_error, | 13410 bound_error, |
13564 trail); | 13411 trail); |
13565 } | 13412 } |
13566 if (FLAG_enable_type_checks && bound_error->IsNull()) { | 13413 if (FLAG_enable_type_checks && bound_error->IsNull()) { |
(...skipping 2657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16224 // Both handles point to the same raw instance. | 16071 // Both handles point to the same raw instance. |
16225 return true; | 16072 return true; |
16226 } | 16073 } |
16227 | 16074 |
16228 // An Array may be compared to an ImmutableArray. | 16075 // An Array may be compared to an ImmutableArray. |
16229 if (!other.IsArray() || other.IsNull()) { | 16076 if (!other.IsArray() || other.IsNull()) { |
16230 return false; | 16077 return false; |
16231 } | 16078 } |
16232 | 16079 |
16233 // Both arrays must have the same type arguments. | 16080 // Both arrays must have the same type arguments. |
16234 const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle( | 16081 const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments()); |
16235 GetTypeArguments()); | 16082 const TypeArguments& other_type_args = TypeArguments::Handle( |
16236 const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle( | |
16237 other.GetTypeArguments()); | 16083 other.GetTypeArguments()); |
16238 if (!type_args.Equals(other_type_args)) { | 16084 if (!type_args.Equals(other_type_args)) { |
16239 return false; | 16085 return false; |
16240 } | 16086 } |
16241 | 16087 |
16242 const Array& other_arr = Array::Cast(other); | 16088 const Array& other_arr = Array::Cast(other); |
16243 | 16089 |
16244 intptr_t len = this->Length(); | 16090 intptr_t len = this->Length(); |
16245 if (len != other_arr.Length()) { | 16091 if (len != other_arr.Length()) { |
16246 return false; | 16092 return false; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16303 void Array::PrintToJSONStream(JSONStream* stream, bool ref) const { | 16149 void Array::PrintToJSONStream(JSONStream* stream, bool ref) const { |
16304 Instance::PrintToJSONStream(stream, ref); | 16150 Instance::PrintToJSONStream(stream, ref); |
16305 } | 16151 } |
16306 | 16152 |
16307 | 16153 |
16308 RawArray* Array::Grow(const Array& source, int new_length, Heap::Space space) { | 16154 RawArray* Array::Grow(const Array& source, int new_length, Heap::Space space) { |
16309 const Array& result = Array::Handle(Array::New(new_length, space)); | 16155 const Array& result = Array::Handle(Array::New(new_length, space)); |
16310 intptr_t len = 0; | 16156 intptr_t len = 0; |
16311 if (!source.IsNull()) { | 16157 if (!source.IsNull()) { |
16312 len = source.Length(); | 16158 len = source.Length(); |
16313 result.SetTypeArguments( | 16159 result.SetTypeArguments(TypeArguments::Handle(source.GetTypeArguments())); |
16314 AbstractTypeArguments::Handle(source.GetTypeArguments())); | |
16315 } | 16160 } |
16316 ASSERT(new_length >= len); // Cannot copy 'source' into new array. | 16161 ASSERT(new_length >= len); // Cannot copy 'source' into new array. |
16317 ASSERT(new_length != len); // Unnecessary copying of array. | 16162 ASSERT(new_length != len); // Unnecessary copying of array. |
16318 Object& obj = Object::Handle(); | 16163 Object& obj = Object::Handle(); |
16319 for (int i = 0; i < len; i++) { | 16164 for (int i = 0; i < len; i++) { |
16320 obj = source.At(i); | 16165 obj = source.At(i); |
16321 result.SetAt(i, obj); | 16166 result.SetAt(i, obj); |
16322 } | 16167 } |
16323 return result.raw(); | 16168 return result.raw(); |
16324 } | 16169 } |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16448 } | 16293 } |
16449 | 16294 |
16450 const GrowableObjectArray& other_arr = GrowableObjectArray::Cast(other); | 16295 const GrowableObjectArray& other_arr = GrowableObjectArray::Cast(other); |
16451 | 16296 |
16452 // The capacity and length of both objects must be equal. | 16297 // The capacity and length of both objects must be equal. |
16453 if (Capacity() != other_arr.Capacity() || Length() != other_arr.Length()) { | 16298 if (Capacity() != other_arr.Capacity() || Length() != other_arr.Length()) { |
16454 return false; | 16299 return false; |
16455 } | 16300 } |
16456 | 16301 |
16457 // Both arrays must have the same type arguments. | 16302 // Both arrays must have the same type arguments. |
16458 const AbstractTypeArguments& type_args = AbstractTypeArguments::Handle( | 16303 const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments()); |
16459 GetTypeArguments()); | 16304 const TypeArguments& other_type_args = TypeArguments::Handle( |
16460 const AbstractTypeArguments& other_type_args = AbstractTypeArguments::Handle( | |
16461 other.GetTypeArguments()); | 16305 other.GetTypeArguments()); |
16462 if (!type_args.Equals(other_type_args)) { | 16306 if (!type_args.Equals(other_type_args)) { |
16463 return false; | 16307 return false; |
16464 } | 16308 } |
16465 | 16309 |
16466 // The data part in both arrays must be identical. | 16310 // The data part in both arrays must be identical. |
16467 const Array& contents = Array::Handle(data()); | 16311 const Array& contents = Array::Handle(data()); |
16468 const Array& other_contents = Array::Handle(other_arr.data()); | 16312 const Array& other_contents = Array::Handle(other_arr.data()); |
16469 for (intptr_t i = 0; i < Length(); i++) { | 16313 for (intptr_t i = 0; i < Length(); i++) { |
16470 if (contents.At(i) != other_contents.At(i)) { | 16314 if (contents.At(i) != other_contents.At(i)) { |
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17467 return "_MirrorReference"; | 17311 return "_MirrorReference"; |
17468 } | 17312 } |
17469 | 17313 |
17470 | 17314 |
17471 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 17315 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
17472 Instance::PrintToJSONStream(stream, ref); | 17316 Instance::PrintToJSONStream(stream, ref); |
17473 } | 17317 } |
17474 | 17318 |
17475 | 17319 |
17476 } // namespace dart | 17320 } // namespace dart |
OLD | NEW |