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 4441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4452 strings.SetAt(s++, Symbols::RAngleBracket()); | 4452 strings.SetAt(s++, Symbols::RAngleBracket()); |
4453 ASSERT(s == num_strings); | 4453 ASSERT(s == num_strings); |
4454 name = String::ConcatAll(strings); | 4454 name = String::ConcatAll(strings); |
4455 return Symbols::New(name); | 4455 return Symbols::New(name); |
4456 } | 4456 } |
4457 | 4457 |
4458 | 4458 |
4459 bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other, | 4459 bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other, |
4460 intptr_t from_index, | 4460 intptr_t from_index, |
4461 intptr_t len, | 4461 intptr_t len, |
4462 GrowableObjectArray* trail) const { | 4462 TrailPtr trail) const { |
4463 if (this->raw() == other.raw()) { | 4463 if (this->raw() == other.raw()) { |
4464 return true; | 4464 return true; |
4465 } | 4465 } |
4466 if (IsNull() || other.IsNull()) { | 4466 if (IsNull() || other.IsNull()) { |
4467 return false; | 4467 return false; |
4468 } | 4468 } |
4469 const intptr_t num_types = Length(); | 4469 const intptr_t num_types = Length(); |
4470 if (num_types != other.Length()) { | 4470 if (num_types != other.Length()) { |
4471 return false; | 4471 return false; |
4472 } | 4472 } |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4649 if (!type.IsResolved()) { | 4649 if (!type.IsResolved()) { |
4650 return false; | 4650 return false; |
4651 } | 4651 } |
4652 } | 4652 } |
4653 return true; | 4653 return true; |
4654 } | 4654 } |
4655 | 4655 |
4656 | 4656 |
4657 bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index, | 4657 bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index, |
4658 intptr_t len, | 4658 intptr_t len, |
4659 GrowableObjectArray* trail) const { | 4659 TrailPtr trail) const { |
4660 ASSERT(!IsNull()); | 4660 ASSERT(!IsNull()); |
4661 AbstractType& type = AbstractType::Handle(); | 4661 AbstractType& type = AbstractType::Handle(); |
4662 for (intptr_t i = 0; i < len; i++) { | 4662 for (intptr_t i = 0; i < len; i++) { |
4663 type = TypeAt(from_index + i); | 4663 type = TypeAt(from_index + i); |
4664 // If the type argument is null, the type parameterized with this type | 4664 // If the type argument is null, the type parameterized with this type |
4665 // argument is still being finalized. Skip this null type argument. | 4665 // argument is still being finalized. Skip this null type argument. |
4666 if (!type.IsNull() && !type.IsInstantiated(trail)) { | 4666 if (!type.IsNull() && !type.IsInstantiated(trail)) { |
4667 return false; | 4667 return false; |
4668 } | 4668 } |
4669 } | 4669 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4807 return true; | 4807 return true; |
4808 } | 4808 } |
4809 } | 4809 } |
4810 return false; | 4810 return false; |
4811 } | 4811 } |
4812 | 4812 |
4813 | 4813 |
4814 RawTypeArguments* TypeArguments::InstantiateFrom( | 4814 RawTypeArguments* TypeArguments::InstantiateFrom( |
4815 const TypeArguments& instantiator_type_arguments, | 4815 const TypeArguments& instantiator_type_arguments, |
4816 Error* bound_error, | 4816 Error* bound_error, |
4817 GrowableObjectArray* trail) const { | 4817 TrailPtr trail) const { |
4818 ASSERT(!IsInstantiated()); | 4818 ASSERT(!IsInstantiated()); |
4819 if (!instantiator_type_arguments.IsNull() && | 4819 if (!instantiator_type_arguments.IsNull() && |
4820 IsUninstantiatedIdentity() && | 4820 IsUninstantiatedIdentity() && |
4821 (instantiator_type_arguments.Length() == Length())) { | 4821 (instantiator_type_arguments.Length() == Length())) { |
4822 return instantiator_type_arguments.raw(); | 4822 return instantiator_type_arguments.raw(); |
4823 } | 4823 } |
4824 const intptr_t num_types = Length(); | 4824 const intptr_t num_types = Length(); |
4825 TypeArguments& instantiated_array = | 4825 TypeArguments& instantiated_array = |
4826 TypeArguments::Handle(TypeArguments::New(num_types, Heap::kNew)); | 4826 TypeArguments::Handle(TypeArguments::New(num_types, Heap::kNew)); |
4827 AbstractType& type = AbstractType::Handle(); | 4827 AbstractType& type = AbstractType::Handle(); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5041 type = type.CloneUnfinalized(); | 5041 type = type.CloneUnfinalized(); |
5042 clone.SetTypeAt(i, type); | 5042 clone.SetTypeAt(i, type); |
5043 } | 5043 } |
5044 ASSERT(clone.IsResolved()); | 5044 ASSERT(clone.IsResolved()); |
5045 return clone.raw(); | 5045 return clone.raw(); |
5046 } | 5046 } |
5047 | 5047 |
5048 | 5048 |
5049 RawTypeArguments* TypeArguments::CloneUninstantiated( | 5049 RawTypeArguments* TypeArguments::CloneUninstantiated( |
5050 const Class& new_owner, | 5050 const Class& new_owner, |
5051 GrowableObjectArray* trail) const { | 5051 TrailPtr trail) const { |
5052 ASSERT(!IsNull()); | 5052 ASSERT(!IsNull()); |
5053 ASSERT(IsFinalized()); | 5053 ASSERT(IsFinalized()); |
5054 ASSERT(!IsInstantiated()); | 5054 ASSERT(!IsInstantiated()); |
5055 AbstractType& type = AbstractType::Handle(); | 5055 AbstractType& type = AbstractType::Handle(); |
5056 const intptr_t num_types = Length(); | 5056 const intptr_t num_types = Length(); |
5057 const TypeArguments& clone = TypeArguments::Handle( | 5057 const TypeArguments& clone = TypeArguments::Handle( |
5058 TypeArguments::New(num_types)); | 5058 TypeArguments::New(num_types)); |
5059 for (intptr_t i = 0; i < num_types; i++) { | 5059 for (intptr_t i = 0; i < num_types; i++) { |
5060 type = TypeAt(i); | 5060 type = TypeAt(i); |
5061 if (!type.IsInstantiated()) { | 5061 if (!type.IsInstantiated()) { |
5062 type = type.CloneUninstantiated(new_owner, trail); | 5062 type = type.CloneUninstantiated(new_owner, trail); |
5063 } | 5063 } |
5064 clone.SetTypeAt(i, type); | 5064 clone.SetTypeAt(i, type); |
5065 } | 5065 } |
5066 ASSERT(clone.IsFinalized()); | 5066 ASSERT(clone.IsFinalized()); |
5067 return clone.raw(); | 5067 return clone.raw(); |
5068 } | 5068 } |
5069 | 5069 |
5070 | 5070 |
5071 RawTypeArguments* TypeArguments::Canonicalize( | 5071 RawTypeArguments* TypeArguments::Canonicalize(TrailPtr trail) const { |
5072 GrowableObjectArray* trail) const { | |
5073 if (IsNull() || IsCanonical()) { | 5072 if (IsNull() || IsCanonical()) { |
5074 ASSERT(IsOld()); | 5073 ASSERT(IsOld()); |
5075 return this->raw(); | 5074 return this->raw(); |
5076 } | 5075 } |
5077 const intptr_t num_types = Length(); | 5076 const intptr_t num_types = Length(); |
5078 if (IsRaw(0, num_types)) { | 5077 if (IsRaw(0, num_types)) { |
5079 return TypeArguments::null(); | 5078 return TypeArguments::null(); |
5080 } | 5079 } |
5081 Isolate* isolate = Isolate::Current(); | 5080 Isolate* isolate = Isolate::Current(); |
5082 ObjectStore* object_store = isolate->object_store(); | 5081 ObjectStore* object_store = isolate->object_store(); |
(...skipping 9716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14799 } | 14798 } |
14800 | 14799 |
14801 | 14800 |
14802 intptr_t AbstractType::token_pos() const { | 14801 intptr_t AbstractType::token_pos() const { |
14803 // AbstractType is an abstract class. | 14802 // AbstractType is an abstract class. |
14804 UNREACHABLE(); | 14803 UNREACHABLE(); |
14805 return -1; | 14804 return -1; |
14806 } | 14805 } |
14807 | 14806 |
14808 | 14807 |
14809 bool AbstractType::IsInstantiated(GrowableObjectArray* trail) const { | 14808 bool AbstractType::IsInstantiated(TrailPtr trail) const { |
14810 // AbstractType is an abstract class. | 14809 // AbstractType is an abstract class. |
14811 UNREACHABLE(); | 14810 UNREACHABLE(); |
14812 return false; | 14811 return false; |
14813 } | 14812 } |
14814 | 14813 |
14815 | 14814 |
14816 bool AbstractType::IsFinalized() const { | 14815 bool AbstractType::IsFinalized() const { |
14817 // AbstractType is an abstract class. | 14816 // AbstractType is an abstract class. |
14818 UNREACHABLE(); | 14817 UNREACHABLE(); |
14819 return false; | 14818 return false; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14854 return LanguageError::null(); | 14853 return LanguageError::null(); |
14855 } | 14854 } |
14856 | 14855 |
14857 | 14856 |
14858 void AbstractType::set_error(const LanguageError& value) const { | 14857 void AbstractType::set_error(const LanguageError& value) const { |
14859 // AbstractType is an abstract class. | 14858 // AbstractType is an abstract class. |
14860 UNREACHABLE(); | 14859 UNREACHABLE(); |
14861 } | 14860 } |
14862 | 14861 |
14863 | 14862 |
14864 bool AbstractType::IsEquivalent(const Instance& other, | 14863 bool AbstractType::IsEquivalent(const Instance& other, TrailPtr trail) const { |
14865 GrowableObjectArray* trail) const { | |
14866 // AbstractType is an abstract class. | 14864 // AbstractType is an abstract class. |
14867 UNREACHABLE(); | 14865 UNREACHABLE(); |
14868 return false; | 14866 return false; |
14869 } | 14867 } |
14870 | 14868 |
14871 | 14869 |
14872 bool AbstractType::IsRecursive() const { | 14870 bool AbstractType::IsRecursive() const { |
14873 // AbstractType is an abstract class. | 14871 // AbstractType is an abstract class. |
14874 UNREACHABLE(); | 14872 UNREACHABLE(); |
14875 return false; | 14873 return false; |
14876 } | 14874 } |
14877 | 14875 |
14878 | 14876 |
14879 RawAbstractType* AbstractType::InstantiateFrom( | 14877 RawAbstractType* AbstractType::InstantiateFrom( |
14880 const TypeArguments& instantiator_type_arguments, | 14878 const TypeArguments& instantiator_type_arguments, |
14881 Error* bound_error, | 14879 Error* bound_error, |
14882 GrowableObjectArray* trail) const { | 14880 TrailPtr trail) const { |
14883 // AbstractType is an abstract class. | 14881 // AbstractType is an abstract class. |
14884 UNREACHABLE(); | 14882 UNREACHABLE(); |
14885 return NULL; | 14883 return NULL; |
14886 } | 14884 } |
14887 | 14885 |
14888 | 14886 |
14889 RawAbstractType* AbstractType::CloneUnfinalized() const { | 14887 RawAbstractType* AbstractType::CloneUnfinalized() const { |
14890 // AbstractType is an abstract class. | 14888 // AbstractType is an abstract class. |
14891 UNREACHABLE(); | 14889 UNREACHABLE(); |
14892 return NULL; | 14890 return NULL; |
14893 } | 14891 } |
14894 | 14892 |
14895 | 14893 |
14896 RawAbstractType* AbstractType::CloneUninstantiated( | 14894 RawAbstractType* AbstractType::CloneUninstantiated( |
14897 const Class& new_owner, | 14895 const Class& new_owner, TrailPtr trail) const { |
14898 GrowableObjectArray* trail) const { | |
14899 // AbstractType is an abstract class. | 14896 // AbstractType is an abstract class. |
14900 UNREACHABLE(); | 14897 UNREACHABLE(); |
14901 return NULL; | 14898 return NULL; |
14902 } | 14899 } |
14903 | 14900 |
14904 | 14901 |
14905 RawAbstractType* AbstractType::Canonicalize(GrowableObjectArray* trail) const { | 14902 RawAbstractType* AbstractType::Canonicalize(TrailPtr trail) const { |
14906 // AbstractType is an abstract class. | 14903 // AbstractType is an abstract class. |
14907 UNREACHABLE(); | 14904 UNREACHABLE(); |
14908 return NULL; | 14905 return NULL; |
14909 } | 14906 } |
14910 | 14907 |
14911 | 14908 |
14912 RawObject* AbstractType::OnlyBuddyInTrail(GrowableObjectArray* trail) const { | 14909 RawAbstractType* AbstractType::OnlyBuddyInTrail(TrailPtr trail) const { |
14913 if (trail == NULL) { | 14910 if (trail == NULL) { |
14914 return Object::null(); | 14911 return AbstractType::null(); |
14915 } | 14912 } |
14916 const intptr_t len = trail->Length(); | 14913 const intptr_t len = trail->length(); |
14917 ASSERT((len % 2) == 0); | 14914 ASSERT((len % 2) == 0); |
14918 for (intptr_t i = 0; i < len; i += 2) { | 14915 for (intptr_t i = 0; i < len; i += 2) { |
14919 if (trail->At(i) == this->raw()) { | 14916 ASSERT(trail->At(i)->IsZoneHandle()); |
14920 ASSERT(trail->At(i + 1) != Object::null()); | 14917 ASSERT(trail->At(i + 1)->IsZoneHandle()); |
14921 return trail->At(i + 1); | 14918 if (trail->At(i)->raw() == this->raw()) { |
| 14919 ASSERT(!trail->At(i + 1)->IsNull()); |
| 14920 return trail->At(i + 1)->raw(); |
14922 } | 14921 } |
14923 } | 14922 } |
14924 return Object::null(); | 14923 return AbstractType::null(); |
14925 } | 14924 } |
14926 | 14925 |
14927 | 14926 |
14928 void AbstractType::AddOnlyBuddyToTrail(GrowableObjectArray** trail, | 14927 void AbstractType::AddOnlyBuddyToTrail(TrailPtr* trail, |
14929 const Object& buddy) const { | 14928 const AbstractType& buddy) const { |
14930 if (*trail == NULL) { | 14929 if (*trail == NULL) { |
14931 *trail = &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New()); | 14930 *trail = new Trail(4); |
14932 } else { | 14931 } else { |
14933 ASSERT(OnlyBuddyInTrail(*trail) == Object::null()); | 14932 ASSERT(OnlyBuddyInTrail(*trail) == AbstractType::null()); |
14934 } | 14933 } |
14935 (*trail)->Add(*this); | 14934 AbstractType& t = AbstractType::ZoneHandle(this->raw()); |
14936 (*trail)->Add(buddy); | 14935 AbstractType& b = AbstractType::ZoneHandle(buddy.raw()); |
| 14936 (*trail)->Add(&t); |
| 14937 (*trail)->Add(&b); |
14937 } | 14938 } |
14938 | 14939 |
14939 | 14940 |
14940 RawString* AbstractType::BuildName(NameVisibility name_visibility) const { | 14941 RawString* AbstractType::BuildName(NameVisibility name_visibility) const { |
14941 if (IsBoundedType()) { | 14942 if (IsBoundedType()) { |
14942 const AbstractType& type = AbstractType::Handle( | 14943 const AbstractType& type = AbstractType::Handle( |
14943 BoundedType::Cast(*this).type()); | 14944 BoundedType::Cast(*this).type()); |
14944 if (name_visibility == kPrettyName) { | 14945 if (name_visibility == kPrettyName) { |
14945 return type.BuildName(kPrettyName); | 14946 return type.BuildName(kPrettyName); |
14946 } else if (name_visibility == kUserVisibleName) { | 14947 } else if (name_visibility == kUserVisibleName) { |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15431 return reinterpret_cast<RawUnresolvedClass*>(raw_ptr()->type_class_); | 15432 return reinterpret_cast<RawUnresolvedClass*>(raw_ptr()->type_class_); |
15432 #endif | 15433 #endif |
15433 } | 15434 } |
15434 | 15435 |
15435 | 15436 |
15436 RawTypeArguments* Type::arguments() const { | 15437 RawTypeArguments* Type::arguments() const { |
15437 return raw_ptr()->arguments_; | 15438 return raw_ptr()->arguments_; |
15438 } | 15439 } |
15439 | 15440 |
15440 | 15441 |
15441 bool Type::IsInstantiated(GrowableObjectArray* trail) const { | 15442 bool Type::IsInstantiated(TrailPtr trail) const { |
15442 if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) { | 15443 if (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) { |
15443 return true; | 15444 return true; |
15444 } | 15445 } |
15445 if (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated) { | 15446 if (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated) { |
15446 return false; | 15447 return false; |
15447 } | 15448 } |
15448 if (arguments() == TypeArguments::null()) { | 15449 if (arguments() == TypeArguments::null()) { |
15449 return true; | 15450 return true; |
15450 } | 15451 } |
15451 const TypeArguments& args = TypeArguments::Handle(arguments()); | 15452 const TypeArguments& args = TypeArguments::Handle(arguments()); |
(...skipping 13 matching lines...) Expand all Loading... |
15465 num_type_args = len; | 15466 num_type_args = len; |
15466 len = cls.NumTypeParameters(); // Check the type parameters only. | 15467 len = cls.NumTypeParameters(); // Check the type parameters only. |
15467 } | 15468 } |
15468 return (len == 0) || args.IsSubvectorInstantiated(num_type_args - len, len); | 15469 return (len == 0) || args.IsSubvectorInstantiated(num_type_args - len, len); |
15469 } | 15470 } |
15470 | 15471 |
15471 | 15472 |
15472 RawAbstractType* Type::InstantiateFrom( | 15473 RawAbstractType* Type::InstantiateFrom( |
15473 const TypeArguments& instantiator_type_arguments, | 15474 const TypeArguments& instantiator_type_arguments, |
15474 Error* bound_error, | 15475 Error* bound_error, |
15475 GrowableObjectArray* trail) const { | 15476 TrailPtr trail) const { |
15476 ASSERT(IsFinalized() || IsBeingFinalized()); | 15477 ASSERT(IsFinalized() || IsBeingFinalized()); |
15477 ASSERT(!IsInstantiated()); | 15478 ASSERT(!IsInstantiated()); |
15478 // Return the uninstantiated type unchanged if malformed. No copy needed. | 15479 // Return the uninstantiated type unchanged if malformed. No copy needed. |
15479 if (IsMalformed()) { | 15480 if (IsMalformed()) { |
15480 return raw(); | 15481 return raw(); |
15481 } | 15482 } |
15482 // Instantiating this type with its own type arguments as instantiator can | 15483 // Instantiating this type with its own type arguments as instantiator can |
15483 // occur during finalization and bounds checking. Return the type unchanged. | 15484 // occur during finalization and bounds checking. Return the type unchanged. |
15484 if (arguments() == instantiator_type_arguments.raw()) { | 15485 if (arguments() == instantiator_type_arguments.raw()) { |
15485 return raw(); | 15486 return raw(); |
(...skipping 25 matching lines...) Expand all Loading... |
15511 if (IsFinalized()) { | 15512 if (IsFinalized()) { |
15512 instantiated_type.SetIsFinalized(); | 15513 instantiated_type.SetIsFinalized(); |
15513 } else { | 15514 } else { |
15514 instantiated_type.set_is_resolved(); | 15515 instantiated_type.set_is_resolved(); |
15515 } | 15516 } |
15516 // Canonicalization is not part of instantiation. | 15517 // Canonicalization is not part of instantiation. |
15517 return instantiated_type.raw(); | 15518 return instantiated_type.raw(); |
15518 } | 15519 } |
15519 | 15520 |
15520 | 15521 |
15521 bool Type::IsEquivalent(const Instance& other, | 15522 bool Type::IsEquivalent(const Instance& other, TrailPtr trail) const { |
15522 GrowableObjectArray* trail) const { | |
15523 ASSERT(!IsNull()); | 15523 ASSERT(!IsNull()); |
15524 if (raw() == other.raw()) { | 15524 if (raw() == other.raw()) { |
15525 return true; | 15525 return true; |
15526 } | 15526 } |
15527 if (other.IsTypeRef()) { | 15527 if (other.IsTypeRef()) { |
15528 // Unfold right hand type. Divergence is controlled by left hand type. | 15528 // Unfold right hand type. Divergence is controlled by left hand type. |
15529 const AbstractType& other_ref_type = AbstractType::Handle( | 15529 const AbstractType& other_ref_type = AbstractType::Handle( |
15530 TypeRef::Cast(other).type()); | 15530 TypeRef::Cast(other).type()); |
15531 ASSERT(!other_ref_type.IsTypeRef()); | 15531 ASSERT(!other_ref_type.IsTypeRef()); |
15532 return IsEquivalent(other_ref_type, trail); | 15532 return IsEquivalent(other_ref_type, trail); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15607 TypeArguments& type_args = TypeArguments::Handle(arguments()); | 15607 TypeArguments& type_args = TypeArguments::Handle(arguments()); |
15608 type_args = type_args.CloneUnfinalized(); | 15608 type_args = type_args.CloneUnfinalized(); |
15609 const Class& type_cls = Class::Handle(type_class()); | 15609 const Class& type_cls = Class::Handle(type_class()); |
15610 const Type& clone = Type::Handle(Type::New(type_cls, type_args, token_pos())); | 15610 const Type& clone = Type::Handle(Type::New(type_cls, type_args, token_pos())); |
15611 clone.set_is_resolved(); | 15611 clone.set_is_resolved(); |
15612 return clone.raw(); | 15612 return clone.raw(); |
15613 } | 15613 } |
15614 | 15614 |
15615 | 15615 |
15616 RawAbstractType* Type::CloneUninstantiated(const Class& new_owner, | 15616 RawAbstractType* Type::CloneUninstantiated(const Class& new_owner, |
15617 GrowableObjectArray* trail) const { | 15617 TrailPtr trail) const { |
15618 ASSERT(IsFinalized()); | 15618 ASSERT(IsFinalized()); |
15619 ASSERT(!IsMalformed()); | 15619 ASSERT(!IsMalformed()); |
15620 if (IsInstantiated()) { | 15620 if (IsInstantiated()) { |
15621 return raw(); | 15621 return raw(); |
15622 } | 15622 } |
15623 // We may recursively encounter a type already being cloned, because we clone | 15623 // We may recursively encounter a type already being cloned, because we clone |
15624 // the upper bounds of its uninstantiated type arguments in the same pass. | 15624 // the upper bounds of its uninstantiated type arguments in the same pass. |
15625 Type& clone = Type::Handle(); | 15625 Type& clone = Type::Handle(); |
15626 clone ^= OnlyBuddyInTrail(trail); | 15626 clone ^= OnlyBuddyInTrail(trail); |
15627 if (!clone.IsNull()) { | 15627 if (!clone.IsNull()) { |
15628 return clone.raw(); | 15628 return clone.raw(); |
15629 } | 15629 } |
15630 const Class& type_cls = Class::Handle(type_class()); | 15630 const Class& type_cls = Class::Handle(type_class()); |
15631 clone = Type::New(type_cls, TypeArguments::Handle(), token_pos()); | 15631 clone = Type::New(type_cls, TypeArguments::Handle(), token_pos()); |
15632 TypeArguments& type_args = TypeArguments::Handle(arguments()); | 15632 TypeArguments& type_args = TypeArguments::Handle(arguments()); |
15633 // Upper bounds of uninstantiated type arguments may form a cycle. | 15633 // Upper bounds of uninstantiated type arguments may form a cycle. |
15634 if (type_args.IsRecursive() || !type_args.IsInstantiated()) { | 15634 if (type_args.IsRecursive() || !type_args.IsInstantiated()) { |
15635 AddOnlyBuddyToTrail(&trail, clone); | 15635 AddOnlyBuddyToTrail(&trail, clone); |
15636 } | 15636 } |
15637 type_args = type_args.CloneUninstantiated(new_owner, trail); | 15637 type_args = type_args.CloneUninstantiated(new_owner, trail); |
15638 clone.set_arguments(type_args); | 15638 clone.set_arguments(type_args); |
15639 clone.SetIsFinalized(); | 15639 clone.SetIsFinalized(); |
15640 return clone.raw(); | 15640 return clone.raw(); |
15641 } | 15641 } |
15642 | 15642 |
15643 | 15643 |
15644 RawAbstractType* Type::Canonicalize(GrowableObjectArray* trail) const { | 15644 RawAbstractType* Type::Canonicalize(TrailPtr trail) const { |
15645 ASSERT(IsFinalized()); | 15645 ASSERT(IsFinalized()); |
15646 if (IsCanonical() || IsMalformed()) { | 15646 if (IsCanonical() || IsMalformed()) { |
15647 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); | 15647 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); |
15648 return this->raw(); | 15648 return this->raw(); |
15649 } | 15649 } |
15650 Isolate* isolate = Isolate::Current(); | 15650 Isolate* isolate = Isolate::Current(); |
15651 Type& type = Type::Handle(isolate); | 15651 Type& type = Type::Handle(isolate); |
15652 const Class& cls = Class::Handle(isolate, type_class()); | 15652 const Class& cls = Class::Handle(isolate, type_class()); |
15653 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { | 15653 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { |
15654 return Object::dynamic_type(); | 15654 return Object::dynamic_type(); |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15882 if (ref) { | 15882 if (ref) { |
15883 return; | 15883 return; |
15884 } | 15884 } |
15885 const TypeArguments& typeArgs = TypeArguments::Handle(arguments()); | 15885 const TypeArguments& typeArgs = TypeArguments::Handle(arguments()); |
15886 if (!typeArgs.IsNull()) { | 15886 if (!typeArgs.IsNull()) { |
15887 jsobj.AddProperty("typeArguments", typeArgs); | 15887 jsobj.AddProperty("typeArguments", typeArgs); |
15888 } | 15888 } |
15889 } | 15889 } |
15890 | 15890 |
15891 | 15891 |
15892 bool TypeRef::IsInstantiated(GrowableObjectArray* trail) const { | 15892 bool TypeRef::IsInstantiated(TrailPtr trail) const { |
15893 if (TestAndAddToTrail(&trail)) { | 15893 if (TestAndAddToTrail(&trail)) { |
15894 return true; | 15894 return true; |
15895 } | 15895 } |
15896 return AbstractType::Handle(type()).IsInstantiated(trail); | 15896 return AbstractType::Handle(type()).IsInstantiated(trail); |
15897 } | 15897 } |
15898 | 15898 |
15899 | 15899 |
15900 bool TypeRef::IsEquivalent(const Instance& other, | 15900 bool TypeRef::IsEquivalent(const Instance& other, TrailPtr trail) const { |
15901 GrowableObjectArray* trail) const { | |
15902 if (raw() == other.raw()) { | 15901 if (raw() == other.raw()) { |
15903 return true; | 15902 return true; |
15904 } | 15903 } |
15905 if (TestAndAddBuddyToTrail(&trail, other)) { | 15904 if (!other.IsAbstractType()) { |
| 15905 return false; |
| 15906 } |
| 15907 if (TestAndAddBuddyToTrail(&trail, AbstractType::Cast(other))) { |
15906 return true; | 15908 return true; |
15907 } | 15909 } |
15908 return AbstractType::Handle(type()).IsEquivalent(other, trail); | 15910 return AbstractType::Handle(type()).IsEquivalent(other, trail); |
15909 } | 15911 } |
15910 | 15912 |
15911 | 15913 |
15912 RawTypeRef* TypeRef::InstantiateFrom( | 15914 RawTypeRef* TypeRef::InstantiateFrom( |
15913 const TypeArguments& instantiator_type_arguments, | 15915 const TypeArguments& instantiator_type_arguments, |
15914 Error* bound_error, | 15916 Error* bound_error, |
15915 GrowableObjectArray* trail) const { | 15917 TrailPtr trail) const { |
15916 TypeRef& instantiated_type_ref = TypeRef::Handle(); | 15918 TypeRef& instantiated_type_ref = TypeRef::Handle(); |
15917 instantiated_type_ref ^= OnlyBuddyInTrail(trail); | 15919 instantiated_type_ref ^= OnlyBuddyInTrail(trail); |
15918 if (!instantiated_type_ref.IsNull()) { | 15920 if (!instantiated_type_ref.IsNull()) { |
15919 return instantiated_type_ref.raw(); | 15921 return instantiated_type_ref.raw(); |
15920 } | 15922 } |
15921 AbstractType& ref_type = AbstractType::Handle(type()); | 15923 AbstractType& ref_type = AbstractType::Handle(type()); |
15922 ASSERT(!ref_type.IsTypeRef()); | 15924 ASSERT(!ref_type.IsTypeRef()); |
15923 AbstractType& instantiated_ref_type = AbstractType::Handle(); | 15925 AbstractType& instantiated_ref_type = AbstractType::Handle(); |
15924 instantiated_ref_type = ref_type.InstantiateFrom( | 15926 instantiated_ref_type = ref_type.InstantiateFrom( |
15925 instantiator_type_arguments, bound_error, trail); | 15927 instantiator_type_arguments, bound_error, trail); |
15926 ASSERT(!instantiated_ref_type.IsTypeRef()); | 15928 ASSERT(!instantiated_ref_type.IsTypeRef()); |
15927 instantiated_type_ref = TypeRef::New(instantiated_ref_type); | 15929 instantiated_type_ref = TypeRef::New(instantiated_ref_type); |
15928 AddOnlyBuddyToTrail(&trail, instantiated_type_ref); | 15930 AddOnlyBuddyToTrail(&trail, instantiated_type_ref); |
15929 return instantiated_type_ref.raw(); | 15931 return instantiated_type_ref.raw(); |
15930 } | 15932 } |
15931 | 15933 |
15932 | 15934 |
15933 RawTypeRef* TypeRef::CloneUninstantiated(const Class& new_owner, | 15935 RawTypeRef* TypeRef::CloneUninstantiated(const Class& new_owner, |
15934 GrowableObjectArray* trail) const { | 15936 TrailPtr trail) const { |
15935 TypeRef& cloned_type_ref = TypeRef::Handle(); | 15937 TypeRef& cloned_type_ref = TypeRef::Handle(); |
15936 cloned_type_ref ^= OnlyBuddyInTrail(trail); | 15938 cloned_type_ref ^= OnlyBuddyInTrail(trail); |
15937 if (!cloned_type_ref.IsNull()) { | 15939 if (!cloned_type_ref.IsNull()) { |
15938 return cloned_type_ref.raw(); | 15940 return cloned_type_ref.raw(); |
15939 } | 15941 } |
15940 AbstractType& ref_type = AbstractType::Handle(type()); | 15942 AbstractType& ref_type = AbstractType::Handle(type()); |
15941 ASSERT(!ref_type.IsTypeRef()); | 15943 ASSERT(!ref_type.IsTypeRef()); |
15942 AbstractType& cloned_ref_type = AbstractType::Handle(); | 15944 AbstractType& cloned_ref_type = AbstractType::Handle(); |
15943 cloned_ref_type = ref_type.CloneUninstantiated(new_owner, trail); | 15945 cloned_ref_type = ref_type.CloneUninstantiated(new_owner, trail); |
15944 ASSERT(!cloned_ref_type.IsTypeRef()); | 15946 ASSERT(!cloned_ref_type.IsTypeRef()); |
15945 cloned_type_ref = TypeRef::New(cloned_ref_type); | 15947 cloned_type_ref = TypeRef::New(cloned_ref_type); |
15946 AddOnlyBuddyToTrail(&trail, cloned_type_ref); | 15948 AddOnlyBuddyToTrail(&trail, cloned_type_ref); |
15947 return cloned_type_ref.raw(); | 15949 return cloned_type_ref.raw(); |
15948 } | 15950 } |
15949 | 15951 |
15950 | 15952 |
15951 void TypeRef::set_type(const AbstractType& value) const { | 15953 void TypeRef::set_type(const AbstractType& value) const { |
15952 ASSERT(value.HasResolvedTypeClass()); | 15954 ASSERT(value.HasResolvedTypeClass()); |
15953 ASSERT(!value.IsTypeRef()); | 15955 ASSERT(!value.IsTypeRef()); |
15954 StorePointer(&raw_ptr()->type_, value.raw()); | 15956 StorePointer(&raw_ptr()->type_, value.raw()); |
15955 } | 15957 } |
15956 | 15958 |
15957 | 15959 |
15958 // A TypeRef cannot be canonical by definition. Only its referenced type can be. | 15960 // A TypeRef cannot be canonical by definition. Only its referenced type can be. |
15959 // Consider the type Derived, where class Derived extends Base<Derived>. | 15961 // Consider the type Derived, where class Derived extends Base<Derived>. |
15960 // The first type argument of its flattened type argument vector is Derived, | 15962 // The first type argument of its flattened type argument vector is Derived, |
15961 // represented by a TypeRef pointing to itself. | 15963 // represented by a TypeRef pointing to itself. |
15962 RawAbstractType* TypeRef::Canonicalize(GrowableObjectArray* trail) const { | 15964 RawAbstractType* TypeRef::Canonicalize(TrailPtr trail) const { |
15963 if (TestAndAddToTrail(&trail)) { | 15965 if (TestAndAddToTrail(&trail)) { |
15964 return raw(); | 15966 return raw(); |
15965 } | 15967 } |
15966 // TODO(regis): Try to reduce the number of nodes required to represent the | 15968 // TODO(regis): Try to reduce the number of nodes required to represent the |
15967 // referenced recursive type. | 15969 // referenced recursive type. |
15968 AbstractType& ref_type = AbstractType::Handle(type()); | 15970 AbstractType& ref_type = AbstractType::Handle(type()); |
15969 ref_type = ref_type.Canonicalize(trail); | 15971 ref_type = ref_type.Canonicalize(trail); |
15970 set_type(ref_type); | 15972 set_type(ref_type); |
15971 return raw(); | 15973 return raw(); |
15972 } | 15974 } |
15973 | 15975 |
15974 | 15976 |
15975 intptr_t TypeRef::Hash() const { | 15977 intptr_t TypeRef::Hash() const { |
15976 // Do not calculate the hash of the referenced type to avoid divergence. | 15978 // Do not calculate the hash of the referenced type to avoid divergence. |
15977 const uint32_t result = | 15979 const uint32_t result = |
15978 Class::Handle(AbstractType::Handle(type()).type_class()).id(); | 15980 Class::Handle(AbstractType::Handle(type()).type_class()).id(); |
15979 return FinalizeHash(result); | 15981 return FinalizeHash(result); |
15980 } | 15982 } |
15981 | 15983 |
15982 | 15984 |
15983 bool TypeRef::TestAndAddToTrail(GrowableObjectArray** trail) const { | 15985 bool TypeRef::TestAndAddToTrail(TrailPtr* trail) const { |
15984 if (*trail == NULL) { | 15986 if (*trail == NULL) { |
15985 *trail = &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New()); | 15987 *trail = new Trail(4); |
15986 } else { | 15988 } else { |
15987 const intptr_t len = (*trail)->Length(); | 15989 const intptr_t len = (*trail)->length(); |
15988 for (intptr_t i = 0; i < len; i++) { | 15990 for (intptr_t i = 0; i < len; i++) { |
15989 if ((*trail)->At(i) == this->raw()) { | 15991 if ((*trail)->At(i)->raw() == this->raw()) { |
15990 return true; | 15992 return true; |
15991 } | 15993 } |
15992 } | 15994 } |
15993 } | 15995 } |
15994 (*trail)->Add(*this); | 15996 AbstractType& t = AbstractType::ZoneHandle(this->raw()); |
| 15997 (*trail)->Add(&t); |
15995 return false; | 15998 return false; |
15996 } | 15999 } |
15997 | 16000 |
15998 | 16001 |
15999 bool TypeRef::TestAndAddBuddyToTrail(GrowableObjectArray** trail, | 16002 bool TypeRef::TestAndAddBuddyToTrail(TrailPtr* trail, |
16000 const Object& buddy) const { | 16003 const AbstractType& buddy) const { |
16001 if (*trail == NULL) { | 16004 if (*trail == NULL) { |
16002 *trail = &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New()); | 16005 *trail = new Trail(4); |
16003 } else { | 16006 } else { |
16004 const intptr_t len = (*trail)->Length(); | 16007 const intptr_t len = (*trail)->length(); |
16005 ASSERT((len % 2) == 0); | 16008 ASSERT((len % 2) == 0); |
16006 for (intptr_t i = 0; i < len; i += 2) { | 16009 for (intptr_t i = 0; i < len; i += 2) { |
16007 if (((*trail)->At(i) == this->raw()) && | 16010 ASSERT((*trail)->At(i)->IsZoneHandle()); |
16008 ((*trail)->At(i + 1) == buddy.raw())) { | 16011 ASSERT((*trail)->At(i + 1)->IsZoneHandle()); |
| 16012 if (((*trail)->At(i)->raw() == this->raw()) && |
| 16013 ((*trail)->At(i + 1)->raw() == buddy.raw())) { |
16009 return true; | 16014 return true; |
16010 } | 16015 } |
16011 } | 16016 } |
16012 } | 16017 } |
16013 (*trail)->Add(*this); | 16018 AbstractType& t = AbstractType::ZoneHandle(this->raw()); |
16014 (*trail)->Add(buddy); | 16019 AbstractType& b = AbstractType::ZoneHandle(buddy.raw()); |
| 16020 (*trail)->Add(&t); |
| 16021 (*trail)->Add(&b); |
16015 return false; | 16022 return false; |
16016 } | 16023 } |
16017 | 16024 |
16018 | 16025 |
16019 RawTypeRef* TypeRef::New() { | 16026 RawTypeRef* TypeRef::New() { |
16020 RawObject* raw = Object::Allocate(TypeRef::kClassId, | 16027 RawObject* raw = Object::Allocate(TypeRef::kClassId, |
16021 TypeRef::InstanceSize(), | 16028 TypeRef::InstanceSize(), |
16022 Heap::kOld); | 16029 Heap::kOld); |
16023 return reinterpret_cast<RawTypeRef*>(raw); | 16030 return reinterpret_cast<RawTypeRef*>(raw); |
16024 } | 16031 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16067 jsobj.AddProperty("targetType", AbstractType::Handle(type())); | 16074 jsobj.AddProperty("targetType", AbstractType::Handle(type())); |
16068 } | 16075 } |
16069 | 16076 |
16070 | 16077 |
16071 void TypeParameter::set_is_finalized() const { | 16078 void TypeParameter::set_is_finalized() const { |
16072 ASSERT(!IsFinalized()); | 16079 ASSERT(!IsFinalized()); |
16073 set_type_state(RawTypeParameter::kFinalizedUninstantiated); | 16080 set_type_state(RawTypeParameter::kFinalizedUninstantiated); |
16074 } | 16081 } |
16075 | 16082 |
16076 | 16083 |
16077 bool TypeParameter::IsEquivalent(const Instance& other, | 16084 bool TypeParameter::IsEquivalent(const Instance& other, TrailPtr trail) const { |
16078 GrowableObjectArray* trail) const { | |
16079 if (raw() == other.raw()) { | 16085 if (raw() == other.raw()) { |
16080 return true; | 16086 return true; |
16081 } | 16087 } |
16082 if (other.IsTypeRef()) { | 16088 if (other.IsTypeRef()) { |
16083 // Unfold right hand type. Divergence is controlled by left hand type. | 16089 // Unfold right hand type. Divergence is controlled by left hand type. |
16084 const AbstractType& other_ref_type = AbstractType::Handle( | 16090 const AbstractType& other_ref_type = AbstractType::Handle( |
16085 TypeRef::Cast(other).type()); | 16091 TypeRef::Cast(other).type()); |
16086 ASSERT(!other_ref_type.IsTypeRef()); | 16092 ASSERT(!other_ref_type.IsTypeRef()); |
16087 return IsEquivalent(other_ref_type, trail); | 16093 return IsEquivalent(other_ref_type, trail); |
16088 } | 16094 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16120 | 16126 |
16121 | 16127 |
16122 void TypeParameter::set_bound(const AbstractType& value) const { | 16128 void TypeParameter::set_bound(const AbstractType& value) const { |
16123 StorePointer(&raw_ptr()->bound_, value.raw()); | 16129 StorePointer(&raw_ptr()->bound_, value.raw()); |
16124 } | 16130 } |
16125 | 16131 |
16126 | 16132 |
16127 RawAbstractType* TypeParameter::InstantiateFrom( | 16133 RawAbstractType* TypeParameter::InstantiateFrom( |
16128 const TypeArguments& instantiator_type_arguments, | 16134 const TypeArguments& instantiator_type_arguments, |
16129 Error* bound_error, | 16135 Error* bound_error, |
16130 GrowableObjectArray* trail) const { | 16136 TrailPtr trail) const { |
16131 ASSERT(IsFinalized()); | 16137 ASSERT(IsFinalized()); |
16132 if (instantiator_type_arguments.IsNull()) { | 16138 if (instantiator_type_arguments.IsNull()) { |
16133 return Type::DynamicType(); | 16139 return Type::DynamicType(); |
16134 } | 16140 } |
16135 const AbstractType& type_arg = AbstractType::Handle( | 16141 const AbstractType& type_arg = AbstractType::Handle( |
16136 instantiator_type_arguments.TypeAt(index())); | 16142 instantiator_type_arguments.TypeAt(index())); |
16137 // There is no need to canonicalize the instantiated type parameter, since all | 16143 // There is no need to canonicalize the instantiated type parameter, since all |
16138 // type arguments are canonicalized at type finalization time. It would be too | 16144 // type arguments are canonicalized at type finalization time. It would be too |
16139 // early to canonicalize the returned type argument here, since instantiation | 16145 // early to canonicalize the returned type argument here, since instantiation |
16140 // not only happens at run time, but also during type finalization. | 16146 // not only happens at run time, but also during type finalization. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16196 // No need to clone bound, as it is not part of the finalization state. | 16202 // No need to clone bound, as it is not part of the finalization state. |
16197 return TypeParameter::New(Class::Handle(parameterized_class()), | 16203 return TypeParameter::New(Class::Handle(parameterized_class()), |
16198 index(), | 16204 index(), |
16199 String::Handle(name()), | 16205 String::Handle(name()), |
16200 AbstractType::Handle(bound()), | 16206 AbstractType::Handle(bound()), |
16201 token_pos()); | 16207 token_pos()); |
16202 } | 16208 } |
16203 | 16209 |
16204 | 16210 |
16205 RawAbstractType* TypeParameter::CloneUninstantiated( | 16211 RawAbstractType* TypeParameter::CloneUninstantiated( |
16206 const Class& new_owner, | 16212 const Class& new_owner, TrailPtr trail) const { |
16207 GrowableObjectArray* trail) const { | |
16208 ASSERT(IsFinalized()); | 16213 ASSERT(IsFinalized()); |
16209 AbstractType& upper_bound = AbstractType::Handle(bound()); | 16214 AbstractType& upper_bound = AbstractType::Handle(bound()); |
16210 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail); | 16215 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail); |
16211 const Class& old_owner = Class::Handle(parameterized_class()); | 16216 const Class& old_owner = Class::Handle(parameterized_class()); |
16212 const intptr_t new_index = index() + | 16217 const intptr_t new_index = index() + |
16213 new_owner.NumTypeArguments() - old_owner.NumTypeArguments(); | 16218 new_owner.NumTypeArguments() - old_owner.NumTypeArguments(); |
16214 const TypeParameter& clone = TypeParameter::Handle( | 16219 const TypeParameter& clone = TypeParameter::Handle( |
16215 TypeParameter::New(new_owner, | 16220 TypeParameter::New(new_owner, |
16216 new_index, | 16221 new_index, |
16217 String::Handle(name()), | 16222 String::Handle(name()), |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16320 bool BoundedType::IsMalformedOrMalbounded() const { | 16325 bool BoundedType::IsMalformedOrMalbounded() const { |
16321 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); | 16326 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); |
16322 } | 16327 } |
16323 | 16328 |
16324 | 16329 |
16325 RawLanguageError* BoundedType::error() const { | 16330 RawLanguageError* BoundedType::error() const { |
16326 return AbstractType::Handle(type()).error(); | 16331 return AbstractType::Handle(type()).error(); |
16327 } | 16332 } |
16328 | 16333 |
16329 | 16334 |
16330 bool BoundedType::IsEquivalent(const Instance& other, | 16335 bool BoundedType::IsEquivalent(const Instance& other, TrailPtr trail) const { |
16331 GrowableObjectArray* trail) const { | |
16332 // BoundedType are not canonicalized, because their bound may get finalized | 16336 // BoundedType are not canonicalized, because their bound may get finalized |
16333 // after the BoundedType is created and initialized. | 16337 // after the BoundedType is created and initialized. |
16334 if (raw() == other.raw()) { | 16338 if (raw() == other.raw()) { |
16335 return true; | 16339 return true; |
16336 } | 16340 } |
16337 if (other.IsTypeRef()) { | 16341 if (other.IsTypeRef()) { |
16338 // Unfold right hand type. Divergence is controlled by left hand type. | 16342 // Unfold right hand type. Divergence is controlled by left hand type. |
16339 const AbstractType& other_ref_type = AbstractType::Handle( | 16343 const AbstractType& other_ref_type = AbstractType::Handle( |
16340 TypeRef::Cast(other).type()); | 16344 TypeRef::Cast(other).type()); |
16341 ASSERT(!other_ref_type.IsTypeRef()); | 16345 ASSERT(!other_ref_type.IsTypeRef()); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16385 // A null type parameter is set when marking a type malformed because of a | 16389 // A null type parameter is set when marking a type malformed because of a |
16386 // bound error at compile time. | 16390 // bound error at compile time. |
16387 ASSERT(value.IsNull() || value.IsFinalized()); | 16391 ASSERT(value.IsNull() || value.IsFinalized()); |
16388 StorePointer(&raw_ptr()->type_parameter_, value.raw()); | 16392 StorePointer(&raw_ptr()->type_parameter_, value.raw()); |
16389 } | 16393 } |
16390 | 16394 |
16391 | 16395 |
16392 RawAbstractType* BoundedType::InstantiateFrom( | 16396 RawAbstractType* BoundedType::InstantiateFrom( |
16393 const TypeArguments& instantiator_type_arguments, | 16397 const TypeArguments& instantiator_type_arguments, |
16394 Error* bound_error, | 16398 Error* bound_error, |
16395 GrowableObjectArray* trail) const { | 16399 TrailPtr trail) const { |
16396 ASSERT(IsFinalized()); | 16400 ASSERT(IsFinalized()); |
16397 AbstractType& bounded_type = AbstractType::Handle(type()); | 16401 AbstractType& bounded_type = AbstractType::Handle(type()); |
16398 ASSERT(bounded_type.IsFinalized()); | 16402 ASSERT(bounded_type.IsFinalized()); |
16399 if (!bounded_type.IsInstantiated()) { | 16403 if (!bounded_type.IsInstantiated()) { |
16400 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, | 16404 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, |
16401 bound_error, | 16405 bound_error, |
16402 trail); | 16406 trail); |
16403 // In case types of instantiator_type_arguments are not finalized, then | 16407 // In case types of instantiator_type_arguments are not finalized, then |
16404 // the instantiated bounded_type is not finalized either. | 16408 // the instantiated bounded_type is not finalized either. |
16405 // Note that instantiator_type_arguments must have the final length, though. | 16409 // Note that instantiator_type_arguments must have the final length, though. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16441 bounded_type = bounded_type.CloneUnfinalized(); | 16445 bounded_type = bounded_type.CloneUnfinalized(); |
16442 // No need to clone bound or type parameter, as they are not part of the | 16446 // No need to clone bound or type parameter, as they are not part of the |
16443 // finalization state of this bounded type. | 16447 // finalization state of this bounded type. |
16444 return BoundedType::New(bounded_type, | 16448 return BoundedType::New(bounded_type, |
16445 AbstractType::Handle(bound()), | 16449 AbstractType::Handle(bound()), |
16446 TypeParameter::Handle(type_parameter())); | 16450 TypeParameter::Handle(type_parameter())); |
16447 } | 16451 } |
16448 | 16452 |
16449 | 16453 |
16450 RawAbstractType* BoundedType::CloneUninstantiated( | 16454 RawAbstractType* BoundedType::CloneUninstantiated( |
16451 const Class& new_owner, | 16455 const Class& new_owner, TrailPtr trail) const { |
16452 GrowableObjectArray* trail) const { | |
16453 if (IsInstantiated()) { | 16456 if (IsInstantiated()) { |
16454 return raw(); | 16457 return raw(); |
16455 } | 16458 } |
16456 AbstractType& bounded_type = AbstractType::Handle(type()); | 16459 AbstractType& bounded_type = AbstractType::Handle(type()); |
16457 bounded_type = bounded_type.CloneUninstantiated(new_owner, trail); | 16460 bounded_type = bounded_type.CloneUninstantiated(new_owner, trail); |
16458 AbstractType& upper_bound = AbstractType::Handle(bound()); | 16461 AbstractType& upper_bound = AbstractType::Handle(bound()); |
16459 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail); | 16462 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail); |
16460 TypeParameter& type_param = TypeParameter::Handle(type_parameter()); | 16463 TypeParameter& type_param = TypeParameter::Handle(type_parameter()); |
16461 type_param ^= type_param.CloneUninstantiated(new_owner, trail); | 16464 type_param ^= type_param.CloneUninstantiated(new_owner, trail); |
16462 return BoundedType::New(bounded_type, upper_bound, type_param); | 16465 return BoundedType::New(bounded_type, upper_bound, type_param); |
(...skipping 4969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21432 return tag_label.ToCString(); | 21435 return tag_label.ToCString(); |
21433 } | 21436 } |
21434 | 21437 |
21435 | 21438 |
21436 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21439 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21437 Instance::PrintJSONImpl(stream, ref); | 21440 Instance::PrintJSONImpl(stream, ref); |
21438 } | 21441 } |
21439 | 21442 |
21440 | 21443 |
21441 } // namespace dart | 21444 } // namespace dart |
OLD | NEW |