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

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

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

Powered by Google App Engine
This is Rietveld 408576698