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/become.h" | 10 #include "vm/become.h" |
(...skipping 5928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5939 while (!function.IsNull()) { | 5939 while (!function.IsNull()) { |
5940 type_params ^= function.type_parameters(); | 5940 type_params ^= function.type_parameters(); |
5941 if (!type_params.IsNull()) { | 5941 if (!type_params.IsNull()) { |
5942 const intptr_t num_type_params = type_params.Length(); | 5942 const intptr_t num_type_params = type_params.Length(); |
5943 for (intptr_t i = 0; i < num_type_params; i++) { | 5943 for (intptr_t i = 0; i < num_type_params; i++) { |
5944 type_param ^= type_params.TypeAt(i); | 5944 type_param ^= type_params.TypeAt(i); |
5945 type_param_name = type_param.name(); | 5945 type_param_name = type_param.name(); |
5946 if (type_param_name.Equals(type_name)) { | 5946 if (type_param_name.Equals(type_name)) { |
5947 if (parent_level > 0) { | 5947 if (parent_level > 0) { |
5948 // Clone type parameter and set parent_level. | 5948 // Clone type parameter and set parent_level. |
5949 return TypeParameter::New( | 5949 type_param = TypeParameter::New( |
5950 Class::Handle(), function, type_param.index(), parent_level, | 5950 Class::Handle(), function, type_param.index(), parent_level, |
5951 type_param_name, AbstractType::Handle(type_param.bound()), | 5951 type_param_name, AbstractType::Handle(type_param.bound()), |
5952 TokenPosition::kNoSource); | 5952 TokenPosition::kNoSource); |
| 5953 type_param.SetIsFinalized(); |
5953 } | 5954 } |
5954 return type_param.raw(); | 5955 return type_param.raw(); |
5955 } | 5956 } |
5956 } | 5957 } |
5957 } | 5958 } |
5958 function ^= function.parent_function(); | 5959 function ^= function.parent_function(); |
5959 parent_level++; | 5960 parent_level++; |
5960 if (function_level != NULL) { | 5961 if (function_level != NULL) { |
5961 (*function_level)--; | 5962 (*function_level)--; |
5962 } | 5963 } |
(...skipping 11761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17724 // Unfold right hand type. Divergence is controlled by left hand type. | 17725 // Unfold right hand type. Divergence is controlled by left hand type. |
17725 const AbstractType& other_ref_type = | 17726 const AbstractType& other_ref_type = |
17726 AbstractType::Handle(TypeRef::Cast(other).type()); | 17727 AbstractType::Handle(TypeRef::Cast(other).type()); |
17727 ASSERT(!other_ref_type.IsTypeRef()); | 17728 ASSERT(!other_ref_type.IsTypeRef()); |
17728 return IsEquivalent(other_ref_type, trail); | 17729 return IsEquivalent(other_ref_type, trail); |
17729 } | 17730 } |
17730 if (!other.IsTypeParameter()) { | 17731 if (!other.IsTypeParameter()) { |
17731 return false; | 17732 return false; |
17732 } | 17733 } |
17733 const TypeParameter& other_type_param = TypeParameter::Cast(other); | 17734 const TypeParameter& other_type_param = TypeParameter::Cast(other); |
17734 if (parameterized_class() != other_type_param.parameterized_class()) { | 17735 if (parameterized_class_id() != other_type_param.parameterized_class_id()) { |
| 17736 return false; |
| 17737 } |
| 17738 if (parameterized_function() != other_type_param.parameterized_function()) { |
17735 return false; | 17739 return false; |
17736 } | 17740 } |
17737 if (IsFinalized() == other_type_param.IsFinalized()) { | 17741 if (IsFinalized() == other_type_param.IsFinalized()) { |
17738 return index() == other_type_param.index(); | 17742 return (index() == other_type_param.index()) && |
| 17743 (parent_level() == other_type_param.parent_level()); |
17739 } | 17744 } |
17740 return name() == other_type_param.name(); | 17745 return name() == other_type_param.name(); |
17741 } | 17746 } |
17742 | 17747 |
17743 | 17748 |
17744 void TypeParameter::set_parameterized_class(const Class& value) const { | 17749 void TypeParameter::set_parameterized_class(const Class& value) const { |
17745 // Set value may be null. | 17750 // Set value may be null. |
17746 classid_t cid = kFunctionCid; // Denotes a function type parameter. | 17751 classid_t cid = kFunctionCid; // Denotes a function type parameter. |
17747 if (!value.IsNull()) { | 17752 if (!value.IsNull()) { |
17748 cid = value.id(); | 17753 cid = value.id(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17922 pieces.Add(Symbols::SpaceIsFromSpace()); | 17927 pieces.Add(Symbols::SpaceIsFromSpace()); |
17923 const Library& library = Library::Handle(zone, cls.library()); | 17928 const Library& library = Library::Handle(zone, cls.library()); |
17924 pieces.Add(String::Handle(zone, library.url())); | 17929 pieces.Add(String::Handle(zone, library.url())); |
17925 pieces.Add(Symbols::NewLine()); | 17930 pieces.Add(Symbols::NewLine()); |
17926 return Symbols::FromConcatAll(thread, pieces); | 17931 return Symbols::FromConcatAll(thread, pieces); |
17927 } | 17932 } |
17928 | 17933 |
17929 | 17934 |
17930 intptr_t TypeParameter::ComputeHash() const { | 17935 intptr_t TypeParameter::ComputeHash() const { |
17931 ASSERT(IsFinalized()); | 17936 ASSERT(IsFinalized()); |
17932 uint32_t result = Class::Handle(parameterized_class()).id(); | 17937 uint32_t result; |
| 17938 if (IsClassTypeParameter()) { |
| 17939 result = parameterized_class_id(); |
| 17940 } else { |
| 17941 result = Function::Handle(parameterized_function()).Hash(); |
| 17942 result = CombineHashes(result, parent_level()); |
| 17943 } |
17933 // No need to include the hash of the bound, since the type parameter is fully | 17944 // No need to include the hash of the bound, since the type parameter is fully |
17934 // identified by its class and index. | 17945 // identified by its class and index. |
17935 result = CombineHashes(result, index()); | 17946 result = CombineHashes(result, index()); |
17936 result = FinalizeHash(result, kHashBits); | 17947 result = FinalizeHash(result, kHashBits); |
17937 SetHash(result); | 17948 SetHash(result); |
17938 return result; | 17949 return result; |
17939 } | 17950 } |
17940 | 17951 |
17941 | 17952 |
17942 RawTypeParameter* TypeParameter::New() { | 17953 RawTypeParameter* TypeParameter::New() { |
(...skipping 4996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22939 return UserTag::null(); | 22950 return UserTag::null(); |
22940 } | 22951 } |
22941 | 22952 |
22942 | 22953 |
22943 const char* UserTag::ToCString() const { | 22954 const char* UserTag::ToCString() const { |
22944 const String& tag_label = String::Handle(label()); | 22955 const String& tag_label = String::Handle(label()); |
22945 return tag_label.ToCString(); | 22956 return tag_label.ToCString(); |
22946 } | 22957 } |
22947 | 22958 |
22948 } // namespace dart | 22959 } // namespace dart |
OLD | NEW |