Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 3540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3551 if (!IsGeneric() && !IsClosureClass()) { | 3551 if (!IsGeneric() && !IsClosureClass()) { |
| 3552 ASSERT((canonical_types() == Object::null()) || | 3552 ASSERT((canonical_types() == Object::null()) || |
| 3553 (canonical_types() == type.raw())); // Set during own finalization. | 3553 (canonical_types() == type.raw())); // Set during own finalization. |
| 3554 set_canonical_types(type); | 3554 set_canonical_types(type); |
| 3555 } else { | 3555 } else { |
| 3556 Array& types = Array::Handle(); | 3556 Array& types = Array::Handle(); |
| 3557 types ^= canonical_types(); | 3557 types ^= canonical_types(); |
| 3558 ASSERT(!types.IsNull() && (types.Length() > 1)); | 3558 ASSERT(!types.IsNull() && (types.Length() > 1)); |
| 3559 ASSERT((types.At(0) == Object::null()) || (types.At(0) == type.raw())); | 3559 ASSERT((types.At(0) == Object::null()) || (types.At(0) == type.raw())); |
| 3560 types.SetAt(0, type); | 3560 types.SetAt(0, type); |
| 3561 // Makes sure that 'canonical_types' has not changed. | |
| 3562 ASSERT(types.raw() == canonical_types()); | |
| 3561 } | 3563 } |
| 3562 } | 3564 } |
| 3563 | 3565 |
| 3564 | 3566 |
| 3565 intptr_t Class::FindCanonicalTypeIndex(const AbstractType& needle) const { | 3567 intptr_t Class::FindCanonicalTypeIndex(const AbstractType& needle) const { |
| 3566 Thread* thread = Thread::Current(); | 3568 Thread* thread = Thread::Current(); |
| 3567 if (EnsureIsFinalized(thread) != Error::null()) { | 3569 if (EnsureIsFinalized(thread) != Error::null()) { |
| 3568 return -1; | 3570 return -1; |
| 3569 } | 3571 } |
| 3570 if (needle.raw() == CanonicalType()) { | 3572 if (needle.raw() == CanonicalType()) { |
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4120 Zone* zone = Thread::Current()->zone(); | 4122 Zone* zone = Thread::Current()->zone(); |
| 4121 const Library& lib = Library::Handle(zone, library()); | 4123 const Library& lib = Library::Handle(zone, library()); |
| 4122 const Object& obj = Object::Handle(zone, lib.LookupLocalObject(name)); | 4124 const Object& obj = Object::Handle(zone, lib.LookupLocalObject(name)); |
| 4123 if (!obj.IsNull() && obj.IsLibraryPrefix()) { | 4125 if (!obj.IsNull() && obj.IsLibraryPrefix()) { |
| 4124 return LibraryPrefix::Cast(obj).raw(); | 4126 return LibraryPrefix::Cast(obj).raw(); |
| 4125 } | 4127 } |
| 4126 return LibraryPrefix::null(); | 4128 return LibraryPrefix::null(); |
| 4127 } | 4129 } |
| 4128 | 4130 |
| 4129 | 4131 |
| 4132 RawAbstractType* Class::LookupCanonicalType(const AbstractType& lookup_type, | |
|
regis
2016/02/29 23:40:04
Lookup and insert?
srdjan
2016/03/30 17:48:27
LookupOrAdd
| |
| 4133 intptr_t start_index) const { | |
| 4134 intptr_t index = start_index; | |
| 4135 Zone* zone = Thread::Current()->zone(); | |
| 4136 AbstractType& type = Type::Handle(zone); | |
| 4137 Array& canonical_types = Array::Handle(zone); | |
| 4138 canonical_types ^= this->canonical_types(); | |
| 4139 if (canonical_types.IsNull()) { | |
| 4140 canonical_types = empty_array().raw(); | |
| 4141 } | |
| 4142 ASSERT(canonical_types.IsArray()); | |
| 4143 const intptr_t length = canonical_types.Length(); | |
| 4144 while (index < length) { | |
| 4145 type ^= canonical_types.At(index); | |
| 4146 if (type.IsNull()) { | |
| 4147 break; | |
| 4148 } | |
| 4149 ASSERT(type.IsFinalized()); | |
| 4150 if (lookup_type.Equals(type)) { | |
| 4151 ASSERT(type.IsCanonical()); | |
| 4152 return type.raw(); | |
| 4153 } | |
| 4154 index++; | |
| 4155 } | |
| 4156 | |
| 4157 lookup_type.SetCanonical(); | |
| 4158 | |
| 4159 // The type needs to be added to the list. Grow the list if it is full. | |
| 4160 if (index >= length) { | |
| 4161 ASSERT((index == length) || ((index == 1) && (length == 0))); | |
| 4162 const intptr_t new_length = (length > 64) ? | |
| 4163 (length + 64) : | |
| 4164 ((length == 0) ? 2 : (length * 2)); | |
| 4165 const Array& new_canonical_types = Array::Handle( | |
| 4166 zone, Array::Grow(canonical_types, new_length, Heap::kOld)); | |
| 4167 new_canonical_types.SetAt(index, lookup_type); | |
| 4168 this->set_canonical_types(new_canonical_types); | |
| 4169 } else { | |
| 4170 canonical_types.SetAt(index, lookup_type); | |
| 4171 } | |
| 4172 return lookup_type.raw(); | |
| 4173 } | |
| 4174 | |
| 4175 | |
| 4130 const char* Class::ToCString() const { | 4176 const char* Class::ToCString() const { |
| 4131 const Library& lib = Library::Handle(library()); | 4177 const Library& lib = Library::Handle(library()); |
| 4132 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); | 4178 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); |
| 4133 const char* patch_prefix = is_patch() ? "Patch " : ""; | 4179 const char* patch_prefix = is_patch() ? "Patch " : ""; |
| 4134 const char* class_name = String::Handle(Name()).ToCString(); | 4180 const char* class_name = String::Handle(Name()).ToCString(); |
| 4135 return OS::SCreate(Thread::Current()->zone(), | 4181 return OS::SCreate(Thread::Current()->zone(), |
| 4136 "%s %sClass: %s", library_name, patch_prefix, class_name); | 4182 "%s %sClass: %s", library_name, patch_prefix, class_name); |
| 4137 } | 4183 } |
| 4138 | 4184 |
| 4139 | 4185 |
| (...skipping 11646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15786 // In case the type is first canonicalized at runtime, its type argument | 15832 // In case the type is first canonicalized at runtime, its type argument |
| 15787 // vector may be longer than necessary. This is not an issue. | 15833 // vector may be longer than necessary. This is not an issue. |
| 15788 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); | 15834 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); |
| 15789 type_args = type_args.Canonicalize(trail); | 15835 type_args = type_args.Canonicalize(trail); |
| 15790 if (IsCanonical()) { | 15836 if (IsCanonical()) { |
| 15791 // Canonicalizing type_args canonicalized this type as a side effect. | 15837 // Canonicalizing type_args canonicalized this type as a side effect. |
| 15792 ASSERT(IsRecursive()); | 15838 ASSERT(IsRecursive()); |
| 15793 return this->raw(); | 15839 return this->raw(); |
| 15794 } | 15840 } |
| 15795 set_arguments(type_args); | 15841 set_arguments(type_args); |
| 15842 ASSERT(type_args.IsNull() || type_args.IsOld()); | |
| 15796 | 15843 |
| 15797 // Canonicalizing the type arguments may have changed the index, may have | 15844 return cls.LookupCanonicalType(*this, index); |
| 15798 // grown the table, or may even have canonicalized this type. | |
|
regis
2016/02/29 23:40:04
I would still keep this comment around, because th
srdjan
2016/03/30 17:48:27
Done.
| |
| 15799 canonical_types ^= cls.canonical_types(); | |
| 15800 if (canonical_types.IsNull()) { | |
| 15801 canonical_types = empty_array().raw(); | |
| 15802 } | |
| 15803 length = canonical_types.Length(); | |
| 15804 while (index < length) { | |
| 15805 type ^= canonical_types.At(index); | |
| 15806 if (type.IsNull()) { | |
| 15807 break; | |
| 15808 } | |
| 15809 ASSERT(type.IsFinalized()); | |
| 15810 if (this->Equals(type)) { | |
| 15811 ASSERT(type.IsCanonical()); | |
| 15812 return type.raw(); | |
| 15813 } | |
| 15814 index++; | |
| 15815 } | |
| 15816 | |
| 15817 // The type needs to be added to the list. Grow the list if it is full. | |
| 15818 if (index >= length) { | |
| 15819 ASSERT((index == length) || ((index == 1) && (length == 0))); | |
| 15820 const intptr_t new_length = (length > 64) ? | |
| 15821 (length + 64) : | |
| 15822 ((length == 0) ? 2 : (length * 2)); | |
| 15823 const Array& new_canonical_types = Array::Handle( | |
| 15824 zone, Array::Grow(canonical_types, new_length, Heap::kOld)); | |
| 15825 cls.set_canonical_types(new_canonical_types); | |
| 15826 canonical_types = new_canonical_types.raw(); | |
| 15827 } | |
| 15828 canonical_types.SetAt(index, *this); | |
| 15829 ASSERT(IsOld()); | |
| 15830 ASSERT(type_args.IsNull() || type_args.IsOld()); | |
| 15831 SetCanonical(); | |
| 15832 return this->raw(); | |
| 15833 } | 15845 } |
| 15834 | 15846 |
| 15835 | 15847 |
| 15836 RawString* Type::EnumerateURIs() const { | 15848 RawString* Type::EnumerateURIs() const { |
| 15837 if (IsDynamicType()) { | 15849 if (IsDynamicType()) { |
| 15838 return Symbols::Empty().raw(); | 15850 return Symbols::Empty().raw(); |
| 15839 } | 15851 } |
| 15840 Zone* zone = Thread::Current()->zone(); | 15852 Zone* zone = Thread::Current()->zone(); |
| 15841 GrowableHandlePtrArray<const String> pieces(zone, 6); | 15853 GrowableHandlePtrArray<const String> pieces(zone, 6); |
| 15842 const Class& cls = Class::Handle(zone, type_class()); | 15854 const Class& cls = Class::Handle(zone, type_class()); |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16296 sig_fun.set_parameter_types(Array::Handle(Array::New(num_params, | 16308 sig_fun.set_parameter_types(Array::Handle(Array::New(num_params, |
| 16297 Heap::kOld))); | 16309 Heap::kOld))); |
| 16298 for (intptr_t i = 0; i < num_params; i++) { | 16310 for (intptr_t i = 0; i < num_params; i++) { |
| 16299 type = fun.ParameterTypeAt(i); | 16311 type = fun.ParameterTypeAt(i); |
| 16300 type = type.Canonicalize(trail); | 16312 type = type.Canonicalize(trail); |
| 16301 sig_fun.SetParameterTypeAt(i, type); | 16313 sig_fun.SetParameterTypeAt(i, type); |
| 16302 } | 16314 } |
| 16303 sig_fun.set_parameter_names(Array::Handle(zone, fun.parameter_names())); | 16315 sig_fun.set_parameter_names(Array::Handle(zone, fun.parameter_names())); |
| 16304 set_signature(sig_fun); | 16316 set_signature(sig_fun); |
| 16305 } | 16317 } |
| 16318 ASSERT(type_args.IsNull() || type_args.IsOld()); | |
| 16306 | 16319 |
| 16307 // Canonicalizing the type arguments and the signature may have changed the | 16320 return scope_cls.LookupCanonicalType(*this, index); |
| 16308 // index, may have grown the table, or may even have canonicalized this type. | |
|
regis
2016/02/29 23:40:04
ditto
| |
| 16309 canonical_types ^= scope_cls.canonical_types(); | |
| 16310 if (canonical_types.IsNull()) { | |
| 16311 canonical_types = empty_array().raw(); | |
| 16312 } | |
| 16313 length = canonical_types.Length(); | |
| 16314 while (index < length) { | |
| 16315 type ^= canonical_types.At(index); | |
| 16316 if (type.IsNull()) { | |
| 16317 break; | |
| 16318 } | |
| 16319 ASSERT(type.IsFinalized()); | |
| 16320 if (this->Equals(type)) { | |
| 16321 ASSERT(type.IsCanonical()); | |
| 16322 return type.raw(); | |
| 16323 } | |
| 16324 index++; | |
| 16325 } | |
| 16326 | |
| 16327 // The type needs to be added to the list. Grow the list if it is full. | |
| 16328 if (index >= length) { | |
| 16329 ASSERT((index == length) || ((index == 1) && (length == 0))); | |
| 16330 const intptr_t new_length = (length > 64) ? | |
| 16331 (length + 64) : | |
| 16332 ((length == 0) ? 2 : (length * 2)); | |
| 16333 const Array& new_canonical_types = Array::Handle( | |
| 16334 zone, Array::Grow(canonical_types, new_length, Heap::kOld)); | |
| 16335 scope_cls.set_canonical_types(new_canonical_types); | |
| 16336 canonical_types = new_canonical_types.raw(); | |
| 16337 } | |
| 16338 canonical_types.SetAt(index, *this); | |
| 16339 ASSERT(IsOld()); | |
| 16340 ASSERT(type_args.IsNull() || type_args.IsOld()); | |
| 16341 SetCanonical(); | |
| 16342 return this->raw(); | |
| 16343 } | 16321 } |
| 16344 | 16322 |
| 16345 | 16323 |
| 16346 RawString* FunctionType::EnumerateURIs() const { | 16324 RawString* FunctionType::EnumerateURIs() const { |
| 16347 Zone* zone = Thread::Current()->zone(); | 16325 Zone* zone = Thread::Current()->zone(); |
| 16348 // The scope class and type arguments do not appear explicitly in the user | 16326 // The scope class and type arguments do not appear explicitly in the user |
| 16349 // visible name. The type arguments were used to instantiate the function type | 16327 // visible name. The type arguments were used to instantiate the function type |
| 16350 // prior to this call. | 16328 // prior to this call. |
| 16351 const Function& sig_fun = Function::Handle(zone, signature()); | 16329 const Function& sig_fun = Function::Handle(zone, signature()); |
| 16352 AbstractType& type = AbstractType::Handle(zone); | 16330 AbstractType& type = AbstractType::Handle(zone); |
| (...skipping 5327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21680 return UserTag::null(); | 21658 return UserTag::null(); |
| 21681 } | 21659 } |
| 21682 | 21660 |
| 21683 | 21661 |
| 21684 const char* UserTag::ToCString() const { | 21662 const char* UserTag::ToCString() const { |
| 21685 const String& tag_label = String::Handle(label()); | 21663 const String& tag_label = String::Handle(label()); |
| 21686 return tag_label.ToCString(); | 21664 return tag_label.ToCString(); |
| 21687 } | 21665 } |
| 21688 | 21666 |
| 21689 } // namespace dart | 21667 } // namespace dart |
| OLD | NEW |