Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(491)

Side by Side Diff: runtime/vm/object.cc

Issue 2349593003: Support generic method syntax (fixes #25869). (Closed)
Patch Set: address comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 2465 matching lines...) Expand 10 before | Expand all | Expand 10 after
2476 2476
2477 2477
2478 void Class::set_super_type(const AbstractType& value) const { 2478 void Class::set_super_type(const AbstractType& value) const {
2479 ASSERT(value.IsNull() || 2479 ASSERT(value.IsNull() ||
2480 (value.IsType() && !value.IsDynamicType()) || 2480 (value.IsType() && !value.IsDynamicType()) ||
2481 value.IsMixinAppType()); 2481 value.IsMixinAppType());
2482 StorePointer(&raw_ptr()->super_type_, value.raw()); 2482 StorePointer(&raw_ptr()->super_type_, value.raw());
2483 } 2483 }
2484 2484
2485 2485
2486 // Return a TypeParameter if the type_name is a type parameter of this class.
2487 // Return null otherwise.
2488 RawTypeParameter* Class::LookupTypeParameter(const String& type_name) const { 2486 RawTypeParameter* Class::LookupTypeParameter(const String& type_name) const {
2489 ASSERT(!type_name.IsNull()); 2487 ASSERT(!type_name.IsNull());
2490 Thread* thread = Thread::Current(); 2488 Thread* thread = Thread::Current();
2491 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread); 2489 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
2492 REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread); 2490 REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread);
2493 REUSABLE_STRING_HANDLESCOPE(thread); 2491 REUSABLE_STRING_HANDLESCOPE(thread);
2494 TypeArguments& type_params = thread->TypeArgumentsHandle(); 2492 TypeArguments& type_params = thread->TypeArgumentsHandle();
2495 TypeParameter& type_param = thread->TypeParameterHandle(); 2493 TypeParameter& type_param = thread->TypeParameterHandle();
2496 String& type_param_name = thread->StringHandle(); 2494 String& type_param_name = thread->StringHandle();
2497 2495
(...skipping 2998 matching lines...) Expand 10 before | Expand all | Expand 10 after
5496 return Field::null(); 5494 return Field::null();
5497 } 5495 }
5498 5496
5499 5497
5500 5498
5501 RawFunction* Function::parent_function() const { 5499 RawFunction* Function::parent_function() const {
5502 if (IsClosureFunction()) { 5500 if (IsClosureFunction()) {
5503 const Object& obj = Object::Handle(raw_ptr()->data_); 5501 const Object& obj = Object::Handle(raw_ptr()->data_);
5504 ASSERT(!obj.IsNull()); 5502 ASSERT(!obj.IsNull());
5505 return ClosureData::Cast(obj).parent_function(); 5503 return ClosureData::Cast(obj).parent_function();
5504 } else if (IsSignatureFunction()) {
5505 const Object& obj = Object::Handle(raw_ptr()->data_);
5506 // Parent function may be null or data_ may already be set to function type.
5507 if (!obj.IsNull() && obj.IsFunction()) {
5508 return Function::Cast(obj).raw();
5509 }
5506 } 5510 }
5507 return Function::null(); 5511 return Function::null();
5508 } 5512 }
5509 5513
5510 5514
5511 void Function::set_parent_function(const Function& value) const { 5515 void Function::set_parent_function(const Function& value) const {
5512 if (IsClosureFunction()) { 5516 if (IsClosureFunction()) {
5513 const Object& obj = Object::Handle(raw_ptr()->data_); 5517 const Object& obj = Object::Handle(raw_ptr()->data_);
5514 ASSERT(!obj.IsNull()); 5518 ASSERT(!obj.IsNull());
5515 ClosureData::Cast(obj).set_parent_function(value); 5519 ClosureData::Cast(obj).set_parent_function(value);
5516 return; 5520 return;
5521 } else if (IsSignatureFunction()) {
5522 set_data(value); // Temporarily set during parsing only.
5523 return;
5517 } 5524 }
5518 UNREACHABLE(); 5525 UNREACHABLE();
5519 } 5526 }
5520 5527
5521 5528
5522 RawFunction* Function::implicit_closure_function() const { 5529 RawFunction* Function::implicit_closure_function() const {
5523 if (IsClosureFunction() || 5530 if (IsClosureFunction() ||
5524 IsSignatureFunction() || 5531 IsSignatureFunction() ||
5525 IsFactory()) { 5532 IsFactory()) {
5526 return Function::null(); 5533 return Function::null();
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
5854 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_); 5861 const Array& parameter_names = Array::Handle(raw_ptr()->parameter_names_);
5855 parameter_names.SetAt(index, value); 5862 parameter_names.SetAt(index, value);
5856 } 5863 }
5857 5864
5858 5865
5859 void Function::set_parameter_names(const Array& value) const { 5866 void Function::set_parameter_names(const Array& value) const {
5860 StorePointer(&raw_ptr()->parameter_names_, value.raw()); 5867 StorePointer(&raw_ptr()->parameter_names_, value.raw());
5861 } 5868 }
5862 5869
5863 5870
5871 void Function::set_type_parameters(const TypeArguments& value) const {
5872 StorePointer(&raw_ptr()->type_parameters_, value.raw());
5873 }
5874
5875
5876 intptr_t Function::NumTypeParameters(Thread* thread) const {
5877 if (type_parameters() == TypeArguments::null()) {
5878 return 0;
5879 }
5880 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
5881 TypeArguments& type_params = thread->TypeArgumentsHandle();
5882 type_params = type_parameters();
5883 return type_params.Length();
5884 }
5885
5886
5887 RawTypeParameter* Function::LookupTypeParameter(
5888 const String& type_name, intptr_t* function_level) const {
5889 ASSERT(!type_name.IsNull());
5890 Thread* thread = Thread::Current();
5891 REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
5892 REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread);
5893 REUSABLE_STRING_HANDLESCOPE(thread);
5894 TypeArguments& type_params = thread->TypeArgumentsHandle();
5895 TypeParameter& type_param = thread->TypeParameterHandle();
5896 String& type_param_name = thread->StringHandle();
5897 Function& function = thread->FunctionHandle();
siva 2016/09/19 23:23:46 REUSABLE_FUNCTION_HANDLESCOPE(thread); needed her
regis 2016/09/23 00:35:23 Done.
5898
5899 function ^= this->raw();
5900 intptr_t parent_level = -1;
5901 while (!function.IsNull()) {
5902 type_params ^= function.type_parameters();
5903 if (!type_params.IsNull()) {
5904 parent_level++;
5905 const intptr_t num_type_params = type_params.Length();
5906 for (intptr_t i = 0; i < num_type_params; i++) {
5907 type_param ^= type_params.TypeAt(i);
5908 type_param_name = type_param.name();
5909 if (type_param_name.Equals(type_name)) {
5910 if (parent_level > 0) {
5911 // TODO(regis): Clone type parameter and set parent_level.
5912 }
5913 return type_param.raw();
5914 }
5915 }
5916 }
5917 function ^= function.parent_function();
5918 if (function_level != NULL) {
5919 (*function_level)--;
5920 }
5921 }
5922 return TypeParameter::null();
5923 }
5924
5925
5864 void Function::set_kind(RawFunction::Kind value) const { 5926 void Function::set_kind(RawFunction::Kind value) const {
5865 set_kind_tag(KindBits::update(value, raw_ptr()->kind_tag_)); 5927 set_kind_tag(KindBits::update(value, raw_ptr()->kind_tag_));
5866 } 5928 }
5867 5929
5868 5930
5869 void Function::set_modifier(RawFunction::AsyncModifier value) const { 5931 void Function::set_modifier(RawFunction::AsyncModifier value) const {
5870 set_kind_tag(ModifierBits::update(value, raw_ptr()->kind_tag_)); 5932 set_kind_tag(ModifierBits::update(value, raw_ptr()->kind_tag_));
5871 } 5933 }
5872 5934
5873 5935
(...skipping 11827 matching lines...) Expand 10 before | Expand all | Expand 10 after
17701 17763
17702 RawClass* TypeParameter::parameterized_class() const { 17764 RawClass* TypeParameter::parameterized_class() const {
17703 classid_t cid = parameterized_class_id(); 17765 classid_t cid = parameterized_class_id();
17704 if (cid == kIllegalCid) { 17766 if (cid == kIllegalCid) {
17705 return Class::null(); 17767 return Class::null();
17706 } 17768 }
17707 return Isolate::Current()->class_table()->At(cid); 17769 return Isolate::Current()->class_table()->At(cid);
17708 } 17770 }
17709 17771
17710 17772
17773 void TypeParameter::set_parameterized_function(const Function& value) const {
17774 StorePointer(&raw_ptr()->parameterized_function_, value.raw());
17775 }
17776
17777
17711 void TypeParameter::set_index(intptr_t value) const { 17778 void TypeParameter::set_index(intptr_t value) const {
17712 ASSERT(value >= 0); 17779 ASSERT(value >= 0);
17713 ASSERT(Utils::IsInt(16, value)); 17780 ASSERT(Utils::IsInt(16, value));
17714 StoreNonPointer(&raw_ptr()->index_, value); 17781 StoreNonPointer(&raw_ptr()->index_, value);
17715 } 17782 }
17716 17783
17717 17784
17718 void TypeParameter::set_name(const String& value) const { 17785 void TypeParameter::set_name(const String& value) const {
17719 ASSERT(value.IsSymbol()); 17786 ASSERT(value.IsSymbol());
17720 StorePointer(&raw_ptr()->name_, value.raw()); 17787 StorePointer(&raw_ptr()->name_, value.raw());
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
17811 return false; 17878 return false;
17812 } 17879 }
17813 17880
17814 17881
17815 RawAbstractType* TypeParameter::CloneUnfinalized() const { 17882 RawAbstractType* TypeParameter::CloneUnfinalized() const {
17816 if (IsFinalized()) { 17883 if (IsFinalized()) {
17817 return raw(); 17884 return raw();
17818 } 17885 }
17819 // No need to clone bound, as it is not part of the finalization state. 17886 // No need to clone bound, as it is not part of the finalization state.
17820 return TypeParameter::New(Class::Handle(parameterized_class()), 17887 return TypeParameter::New(Class::Handle(parameterized_class()),
17888 Function::Handle(parameterized_function()),
17821 index(), 17889 index(),
17822 String::Handle(name()), 17890 String::Handle(name()),
17823 AbstractType::Handle(bound()), 17891 AbstractType::Handle(bound()),
17824 token_pos()); 17892 token_pos());
17825 } 17893 }
17826 17894
17827 17895
17828 RawAbstractType* TypeParameter::CloneUninstantiated( 17896 RawAbstractType* TypeParameter::CloneUninstantiated(
17829 const Class& new_owner, TrailPtr trail) const { 17897 const Class& new_owner, TrailPtr trail) const {
17830 ASSERT(IsFinalized()); 17898 ASSERT(IsFinalized());
17831 TypeParameter& clone = TypeParameter::Handle(); 17899 TypeParameter& clone = TypeParameter::Handle();
17832 clone ^= OnlyBuddyInTrail(trail); 17900 clone ^= OnlyBuddyInTrail(trail);
17833 if (!clone.IsNull()) { 17901 if (!clone.IsNull()) {
17834 return clone.raw(); 17902 return clone.raw();
17835 } 17903 }
17836 const Class& old_owner = Class::Handle(parameterized_class()); 17904 const Class& old_owner = Class::Handle(parameterized_class());
17837 const intptr_t new_index = index() + 17905 const intptr_t new_index = index() +
17838 new_owner.NumTypeArguments() - old_owner.NumTypeArguments(); 17906 new_owner.NumTypeArguments() - old_owner.NumTypeArguments();
17839 AbstractType& upper_bound = AbstractType::Handle(bound()); 17907 AbstractType& upper_bound = AbstractType::Handle(bound());
17908 ASSERT(parameterized_function() == Function::null());
17840 clone = TypeParameter::New(new_owner, 17909 clone = TypeParameter::New(new_owner,
17910 Function::Handle(),
17841 new_index, 17911 new_index,
17842 String::Handle(name()), 17912 String::Handle(name()),
17843 upper_bound, // Not cloned yet. 17913 upper_bound, // Not cloned yet.
17844 token_pos()); 17914 token_pos());
17845 clone.SetIsFinalized(); 17915 clone.SetIsFinalized();
17846 AddOnlyBuddyToTrail(&trail, clone); 17916 AddOnlyBuddyToTrail(&trail, clone);
17847 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail); 17917 upper_bound = upper_bound.CloneUninstantiated(new_owner, trail);
17848 clone.set_bound(upper_bound); 17918 clone.set_bound(upper_bound);
17849 return clone.raw(); 17919 return clone.raw();
17850 } 17920 }
(...skipping 30 matching lines...) Expand all
17881 17951
17882 RawTypeParameter* TypeParameter::New() { 17952 RawTypeParameter* TypeParameter::New() {
17883 RawObject* raw = Object::Allocate(TypeParameter::kClassId, 17953 RawObject* raw = Object::Allocate(TypeParameter::kClassId,
17884 TypeParameter::InstanceSize(), 17954 TypeParameter::InstanceSize(),
17885 Heap::kOld); 17955 Heap::kOld);
17886 return reinterpret_cast<RawTypeParameter*>(raw); 17956 return reinterpret_cast<RawTypeParameter*>(raw);
17887 } 17957 }
17888 17958
17889 17959
17890 RawTypeParameter* TypeParameter::New(const Class& parameterized_class, 17960 RawTypeParameter* TypeParameter::New(const Class& parameterized_class,
17961 const Function& parameterized_function,
17891 intptr_t index, 17962 intptr_t index,
17892 const String& name, 17963 const String& name,
17893 const AbstractType& bound, 17964 const AbstractType& bound,
17894 TokenPosition token_pos) { 17965 TokenPosition token_pos) {
17966 ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
17895 const TypeParameter& result = TypeParameter::Handle(TypeParameter::New()); 17967 const TypeParameter& result = TypeParameter::Handle(TypeParameter::New());
17896 result.set_parameterized_class(parameterized_class); 17968 result.set_parameterized_class(parameterized_class);
17969 result.set_parameterized_function(parameterized_function);
17897 result.set_index(index); 17970 result.set_index(index);
17898 result.set_name(name); 17971 result.set_name(name);
17899 result.set_bound(bound); 17972 result.set_bound(bound);
17900 result.SetHash(0); 17973 result.SetHash(0);
17901 result.set_token_pos(token_pos); 17974 result.set_token_pos(token_pos);
17902 result.StoreNonPointer(&result.raw_ptr()->type_state_, 17975 result.StoreNonPointer(&result.raw_ptr()->type_state_,
17903 RawTypeParameter::kAllocated); 17976 RawTypeParameter::kAllocated);
17904 return result.raw(); 17977 return result.raw();
17905 } 17978 }
17906 17979
(...skipping 4972 matching lines...) Expand 10 before | Expand all | Expand 10 after
22879 return UserTag::null(); 22952 return UserTag::null();
22880 } 22953 }
22881 22954
22882 22955
22883 const char* UserTag::ToCString() const { 22956 const char* UserTag::ToCString() const {
22884 const String& tag_label = String::Handle(label()); 22957 const String& tag_label = String::Handle(label());
22885 return tag_label.ToCString(); 22958 return tag_label.ToCString();
22886 } 22959 }
22887 22960
22888 } // namespace dart 22961 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698