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 2406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2417 set_num_own_type_arguments(num_type_params - num_overlapping_type_args); | 2417 set_num_own_type_arguments(num_type_params - num_overlapping_type_args); |
2418 return num_type_params - num_overlapping_type_args; | 2418 return num_type_params - num_overlapping_type_args; |
2419 } | 2419 } |
2420 } | 2420 } |
2421 // No overlap found. | 2421 // No overlap found. |
2422 set_num_own_type_arguments(num_type_params); | 2422 set_num_own_type_arguments(num_type_params); |
2423 return num_type_params; | 2423 return num_type_params; |
2424 } | 2424 } |
2425 | 2425 |
2426 | 2426 |
2427 bool Class::IsGeneric() const { | |
2428 return NumTypeParameters() != 0; | |
2429 } | |
2430 | |
2431 | |
2432 intptr_t Class::NumTypeArguments() const { | 2427 intptr_t Class::NumTypeArguments() const { |
2433 // Return cached value if already calculated. | 2428 // Return cached value if already calculated. |
2434 if (num_type_arguments() != kUnknownNumTypeArguments) { | 2429 if (num_type_arguments() != kUnknownNumTypeArguments) { |
2435 return num_type_arguments(); | 2430 return num_type_arguments(); |
2436 } | 2431 } |
2437 // To work properly, this call requires the super class of this class to be | 2432 // To work properly, this call requires the super class of this class to be |
2438 // resolved, which is checked by the type_class() call on the super type. | 2433 // resolved, which is checked by the type_class() call on the super type. |
2439 // Note that calling type_class() on a MixinAppType fails. | 2434 // Note that calling type_class() on a MixinAppType fails. |
2440 Thread* thread = Thread::Current(); | 2435 Thread* thread = Thread::Current(); |
2441 Zone* zone = thread->zone(); | 2436 Zone* zone = thread->zone(); |
(...skipping 3442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5884 } | 5879 } |
5885 | 5880 |
5886 | 5881 |
5887 RawTypeParameter* Function::LookupTypeParameter( | 5882 RawTypeParameter* Function::LookupTypeParameter( |
5888 const String& type_name, intptr_t* function_level) const { | 5883 const String& type_name, intptr_t* function_level) const { |
5889 ASSERT(!type_name.IsNull()); | 5884 ASSERT(!type_name.IsNull()); |
5890 Thread* thread = Thread::Current(); | 5885 Thread* thread = Thread::Current(); |
5891 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread); | 5886 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread); |
5892 REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread); | 5887 REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread); |
5893 REUSABLE_STRING_HANDLESCOPE(thread); | 5888 REUSABLE_STRING_HANDLESCOPE(thread); |
| 5889 REUSABLE_FUNCTION_HANDLESCOPE(thread); |
5894 TypeArguments& type_params = thread->TypeArgumentsHandle(); | 5890 TypeArguments& type_params = thread->TypeArgumentsHandle(); |
5895 TypeParameter& type_param = thread->TypeParameterHandle(); | 5891 TypeParameter& type_param = thread->TypeParameterHandle(); |
5896 String& type_param_name = thread->StringHandle(); | 5892 String& type_param_name = thread->StringHandle(); |
5897 Function& function = thread->FunctionHandle(); | 5893 Function& function = thread->FunctionHandle(); |
5898 | 5894 |
5899 function ^= this->raw(); | 5895 function ^= this->raw(); |
5900 intptr_t parent_level = -1; | 5896 intptr_t parent_level = -1; |
5901 while (!function.IsNull()) { | 5897 while (!function.IsNull()) { |
5902 type_params ^= function.type_parameters(); | 5898 type_params ^= function.type_parameters(); |
5903 if (!type_params.IsNull()) { | 5899 if (!type_params.IsNull()) { |
(...skipping 12067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17971 return result.raw(); | 17967 return result.raw(); |
17972 } | 17968 } |
17973 | 17969 |
17974 | 17970 |
17975 void TypeParameter::set_token_pos(TokenPosition token_pos) const { | 17971 void TypeParameter::set_token_pos(TokenPosition token_pos) const { |
17976 ASSERT(!token_pos.IsClassifying()); | 17972 ASSERT(!token_pos.IsClassifying()); |
17977 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); | 17973 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); |
17978 } | 17974 } |
17979 | 17975 |
17980 | 17976 |
| 17977 void TypeParameter::set_parent_level(uint8_t value) const { |
| 17978 StoreNonPointer(&raw_ptr()->parent_level_, value); |
| 17979 } |
| 17980 |
| 17981 |
17981 void TypeParameter::set_type_state(int8_t state) const { | 17982 void TypeParameter::set_type_state(int8_t state) const { |
17982 ASSERT((state == RawTypeParameter::kAllocated) || | 17983 ASSERT((state == RawTypeParameter::kAllocated) || |
17983 (state == RawTypeParameter::kBeingFinalized) || | 17984 (state == RawTypeParameter::kBeingFinalized) || |
17984 (state == RawTypeParameter::kFinalizedUninstantiated)); | 17985 (state == RawTypeParameter::kFinalizedUninstantiated)); |
17985 StoreNonPointer(&raw_ptr()->type_state_, state); | 17986 StoreNonPointer(&raw_ptr()->type_state_, state); |
17986 } | 17987 } |
17987 | 17988 |
17988 | 17989 |
17989 const char* TypeParameter::ToCString() const { | 17990 const char* TypeParameter::ToCString() const { |
17990 const char* format = | |
17991 "TypeParameter: name %s; index: %d; class: %s; bound: %s"; | |
17992 const char* name_cstr = String::Handle(Name()).ToCString(); | 17991 const char* name_cstr = String::Handle(Name()).ToCString(); |
17993 const Class& cls = Class::Handle(parameterized_class()); | |
17994 const char* cls_cstr = | |
17995 cls.IsNull() ? " null" : String::Handle(cls.Name()).ToCString(); | |
17996 const AbstractType& upper_bound = AbstractType::Handle(bound()); | 17992 const AbstractType& upper_bound = AbstractType::Handle(bound()); |
17997 const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString(); | 17993 const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString(); |
17998 intptr_t len = OS::SNPrint( | 17994 if (IsFunctionTypeParameter()) { |
17999 NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) + 1; | 17995 const char* format = "TypeParameter: name %s; index: %d; parent_level: %d, " |
18000 char* chars = Thread::Current()->zone()->Alloc<char>(len); | 17996 "function: %s; bound: %s"; |
18001 OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr, bound_cstr); | 17997 const Function& function = Function::Handle(parameterized_function()); |
18002 return chars; | 17998 const char* fun_cstr = String::Handle(function.name()).ToCString(); |
| 17999 intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, index(), |
| 18000 parent_level(), fun_cstr, bound_cstr) + 1; |
| 18001 char* chars = Thread::Current()->zone()->Alloc<char>(len); |
| 18002 OS::SNPrint(chars, len, format, name_cstr, index(), parent_level(), |
| 18003 fun_cstr, bound_cstr); |
| 18004 return chars; |
| 18005 } else { |
| 18006 const char* format = |
| 18007 "TypeParameter: name %s; index: %d; class: %s; bound: %s"; |
| 18008 const Class& cls = Class::Handle(parameterized_class()); |
| 18009 const char* cls_cstr = |
| 18010 cls.IsNull() ? " null" : String::Handle(cls.Name()).ToCString(); |
| 18011 intptr_t len = OS::SNPrint( |
| 18012 NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) + 1; |
| 18013 char* chars = Thread::Current()->zone()->Alloc<char>(len); |
| 18014 OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr, bound_cstr); |
| 18015 return chars; |
| 18016 } |
18003 } | 18017 } |
18004 | 18018 |
18005 | 18019 |
18006 bool BoundedType::IsMalformed() const { | 18020 bool BoundedType::IsMalformed() const { |
18007 return AbstractType::Handle(type()).IsMalformed(); | 18021 return AbstractType::Handle(type()).IsMalformed(); |
18008 } | 18022 } |
18009 | 18023 |
18010 | 18024 |
18011 bool BoundedType::IsMalbounded() const { | 18025 bool BoundedType::IsMalbounded() const { |
18012 return AbstractType::Handle(type()).IsMalbounded(); | 18026 return AbstractType::Handle(type()).IsMalbounded(); |
(...skipping 4934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22947 return UserTag::null(); | 22961 return UserTag::null(); |
22948 } | 22962 } |
22949 | 22963 |
22950 | 22964 |
22951 const char* UserTag::ToCString() const { | 22965 const char* UserTag::ToCString() const { |
22952 const String& tag_label = String::Handle(label()); | 22966 const String& tag_label = String::Handle(label()); |
22953 return tag_label.ToCString(); | 22967 return tag_label.ToCString(); |
22954 } | 22968 } |
22955 | 22969 |
22956 } // namespace dart | 22970 } // namespace dart |
OLD | NEW |