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 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1143 // canonical_type_arguments_ are Smi terminated. | 1143 // canonical_type_arguments_ are Smi terminated. |
| 1144 // Last element contains the count of used slots. | 1144 // Last element contains the count of used slots. |
| 1145 const intptr_t kInitialCanonicalTypeArgumentsSize = 4; | 1145 const intptr_t kInitialCanonicalTypeArgumentsSize = 4; |
| 1146 array = Array::New(kInitialCanonicalTypeArgumentsSize + 1); | 1146 array = Array::New(kInitialCanonicalTypeArgumentsSize + 1); |
| 1147 array.SetAt(kInitialCanonicalTypeArgumentsSize, | 1147 array.SetAt(kInitialCanonicalTypeArgumentsSize, |
| 1148 Smi::Handle(zone, Smi::New(0))); | 1148 Smi::Handle(zone, Smi::New(0))); |
| 1149 object_store->set_canonical_type_arguments(array); | 1149 object_store->set_canonical_type_arguments(array); |
| 1150 | 1150 |
| 1151 // Setup type class early in the process. | 1151 // Setup type class early in the process. |
| 1152 const Class& type_cls = Class::Handle(zone, Class::New<Type>()); | 1152 const Class& type_cls = Class::Handle(zone, Class::New<Type>()); |
| 1153 const Class& function_type_cls = Class::Handle(zone, | |
| 1154 Class::New<FunctionType>()); | |
| 1155 const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>()); | 1153 const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>()); |
| 1156 const Class& type_parameter_cls = Class::Handle(zone, | 1154 const Class& type_parameter_cls = Class::Handle(zone, |
| 1157 Class::New<TypeParameter>()); | 1155 Class::New<TypeParameter>()); |
| 1158 const Class& bounded_type_cls = Class::Handle(zone, | 1156 const Class& bounded_type_cls = Class::Handle(zone, |
| 1159 Class::New<BoundedType>()); | 1157 Class::New<BoundedType>()); |
| 1160 const Class& mixin_app_type_cls = Class::Handle(zone, | 1158 const Class& mixin_app_type_cls = Class::Handle(zone, |
| 1161 Class::New<MixinAppType>()); | 1159 Class::New<MixinAppType>()); |
| 1162 const Class& library_prefix_cls = Class::Handle(zone, | 1160 const Class& library_prefix_cls = Class::Handle(zone, |
| 1163 Class::New<LibraryPrefix>()); | 1161 Class::New<LibraryPrefix>()); |
| 1164 | 1162 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1307 RegisterClass(cls, Symbols::Null(), core_lib); | 1305 RegisterClass(cls, Symbols::Null(), core_lib); |
| 1308 pending_classes.Add(cls); | 1306 pending_classes.Add(cls); |
| 1309 | 1307 |
| 1310 ASSERT(!library_prefix_cls.IsNull()); | 1308 ASSERT(!library_prefix_cls.IsNull()); |
| 1311 RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(), core_lib); | 1309 RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(), core_lib); |
| 1312 pending_classes.Add(library_prefix_cls); | 1310 pending_classes.Add(library_prefix_cls); |
| 1313 | 1311 |
| 1314 RegisterPrivateClass(type_cls, Symbols::Type(), core_lib); | 1312 RegisterPrivateClass(type_cls, Symbols::Type(), core_lib); |
| 1315 pending_classes.Add(type_cls); | 1313 pending_classes.Add(type_cls); |
| 1316 | 1314 |
| 1317 RegisterPrivateClass(function_type_cls, Symbols::FunctionType(), core_lib); | |
| 1318 pending_classes.Add(function_type_cls); | |
| 1319 | |
| 1320 RegisterPrivateClass(type_ref_cls, Symbols::TypeRef(), core_lib); | 1315 RegisterPrivateClass(type_ref_cls, Symbols::TypeRef(), core_lib); |
| 1321 pending_classes.Add(type_ref_cls); | 1316 pending_classes.Add(type_ref_cls); |
| 1322 | 1317 |
| 1323 RegisterPrivateClass(type_parameter_cls, Symbols::TypeParameter(), core_lib); | 1318 RegisterPrivateClass(type_parameter_cls, Symbols::TypeParameter(), core_lib); |
| 1324 pending_classes.Add(type_parameter_cls); | 1319 pending_classes.Add(type_parameter_cls); |
| 1325 | 1320 |
| 1326 RegisterPrivateClass(bounded_type_cls, Symbols::BoundedType(), core_lib); | 1321 RegisterPrivateClass(bounded_type_cls, Symbols::BoundedType(), core_lib); |
| 1327 pending_classes.Add(bounded_type_cls); | 1322 pending_classes.Add(bounded_type_cls); |
| 1328 | 1323 |
| 1329 RegisterPrivateClass(mixin_app_type_cls, Symbols::MixinAppType(), core_lib); | 1324 RegisterPrivateClass(mixin_app_type_cls, Symbols::MixinAppType(), core_lib); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1633 // This is done to allow bootstrapping of reading classes from the snapshot. | 1628 // This is done to allow bootstrapping of reading classes from the snapshot. |
| 1634 // Some classes are not stored in the object store. Yet we still need to | 1629 // Some classes are not stored in the object store. Yet we still need to |
| 1635 // create their Class object so that they get put into the class_table | 1630 // create their Class object so that they get put into the class_table |
| 1636 // (as a side effect of Class::New()). | 1631 // (as a side effect of Class::New()). |
| 1637 | 1632 |
| 1638 cls = Class::New<Instance>(kInstanceCid); | 1633 cls = Class::New<Instance>(kInstanceCid); |
| 1639 object_store->set_object_class(cls); | 1634 object_store->set_object_class(cls); |
| 1640 | 1635 |
| 1641 cls = Class::New<LibraryPrefix>(); | 1636 cls = Class::New<LibraryPrefix>(); |
| 1642 cls = Class::New<Type>(); | 1637 cls = Class::New<Type>(); |
| 1643 cls = Class::New<FunctionType>(); | |
| 1644 cls = Class::New<TypeRef>(); | 1638 cls = Class::New<TypeRef>(); |
| 1645 cls = Class::New<TypeParameter>(); | 1639 cls = Class::New<TypeParameter>(); |
| 1646 cls = Class::New<BoundedType>(); | 1640 cls = Class::New<BoundedType>(); |
| 1647 cls = Class::New<MixinAppType>(); | 1641 cls = Class::New<MixinAppType>(); |
| 1648 | 1642 |
| 1649 cls = Class::New<Array>(); | 1643 cls = Class::New<Array>(); |
| 1650 object_store->set_array_class(cls); | 1644 object_store->set_array_class(cls); |
| 1651 | 1645 |
| 1652 cls = Class::New<Array>(kImmutableArrayCid); | 1646 cls = Class::New<Array>(kImmutableArrayCid); |
| 1653 object_store->set_immutable_array_class(cls); | 1647 object_store->set_immutable_array_class(cls); |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2426 do { | 2420 do { |
| 2427 // Calling NumOwnTypeArguments() on a mixin application class will setup the | 2421 // Calling NumOwnTypeArguments() on a mixin application class will setup the |
| 2428 // type parameters if not already done. | 2422 // type parameters if not already done. |
| 2429 num_type_args += cls.NumOwnTypeArguments(); | 2423 num_type_args += cls.NumOwnTypeArguments(); |
| 2430 // Super type of Object class is null. | 2424 // Super type of Object class is null. |
| 2431 if ((cls.super_type() == AbstractType::null()) || | 2425 if ((cls.super_type() == AbstractType::null()) || |
| 2432 (cls.super_type() == isolate->object_store()->object_type())) { | 2426 (cls.super_type() == isolate->object_store()->object_type())) { |
| 2433 break; | 2427 break; |
| 2434 } | 2428 } |
| 2435 sup_type = cls.super_type(); | 2429 sup_type = cls.super_type(); |
| 2436 // A BoundedType, TypeRef, or FunctionType can appear as type argument of | 2430 // A BoundedType, TypeRef, or function type can appear as type argument of |
| 2437 // sup_type, but not as sup_type itself. | 2431 // sup_type, but not as sup_type itself. |
| 2438 ASSERT(sup_type.IsType()); | 2432 ASSERT(sup_type.IsType()); |
| 2439 sup_type = ClassFinalizer::ResolveTypeClass(cls, Type::Cast(sup_type)); | 2433 ClassFinalizer::ResolveTypeClass(cls, Type::Cast(sup_type)); |
| 2440 cls = sup_type.type_class(); | 2434 cls = sup_type.type_class(); |
| 2441 ASSERT(!cls.IsTypedefClass()); | 2435 ASSERT(!cls.IsTypedefClass()); |
| 2442 } while (true); | 2436 } while (true); |
| 2443 set_num_type_arguments(num_type_args); | 2437 set_num_type_arguments(num_type_args); |
| 2444 return num_type_args; | 2438 return num_type_args; |
| 2445 } | 2439 } |
| 2446 | 2440 |
| 2447 | 2441 |
| 2448 RawClass* Class::SuperClass() const { | 2442 RawClass* Class::SuperClass() const { |
| 2449 if (super_type() == AbstractType::null()) { | 2443 if (super_type() == AbstractType::null()) { |
| (...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3631 return; | 3625 return; |
| 3632 } | 3626 } |
| 3633 ASSERT(!existing_stub.IsDisabled()); | 3627 ASSERT(!existing_stub.IsDisabled()); |
| 3634 // Change the stub so that the next caller will regenerate the stub. | 3628 // Change the stub so that the next caller will regenerate the stub. |
| 3635 existing_stub.DisableStubCode(); | 3629 existing_stub.DisableStubCode(); |
| 3636 // Disassociate the existing stub from class. | 3630 // Disassociate the existing stub from class. |
| 3637 StorePointer(&raw_ptr()->allocation_stub_, Code::null()); | 3631 StorePointer(&raw_ptr()->allocation_stub_, Code::null()); |
| 3638 } | 3632 } |
| 3639 | 3633 |
| 3640 | 3634 |
| 3641 bool Class::IsFunctionClass() const { | 3635 bool Class::IsDartFunctionClass() const { |
| 3642 return raw() == Type::Handle(Type::Function()).type_class(); | 3636 return raw() == Type::Handle(Type::DartFunctionType()).type_class(); |
| 3643 } | 3637 } |
| 3644 | 3638 |
| 3645 | 3639 |
| 3646 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. | 3640 // If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T. |
| 3647 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. | 3641 // If test_kind == kIsMoreSpecificThan, checks if S is more specific than T. |
| 3648 // Type S is specified by this class parameterized with 'type_arguments', and | 3642 // Type S is specified by this class parameterized with 'type_arguments', and |
| 3649 // type T by class 'other' parameterized with 'other_type_arguments'. | 3643 // type T by class 'other' parameterized with 'other_type_arguments'. |
| 3650 // This class and class 'other' do not need to be finalized, however, they must | 3644 // This class and class 'other' do not need to be finalized, however, they must |
| 3651 // be resolved as well as their interfaces. | 3645 // be resolved as well as their interfaces. |
| 3652 bool Class::TypeTestNonRecursive(const Class& cls, | 3646 bool Class::TypeTestNonRecursive(const Class& cls, |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3710 return test_kind == Class::kIsSubtypeOf; | 3704 return test_kind == Class::kIsSubtypeOf; |
| 3711 } | 3705 } |
| 3712 return type_arguments.TypeTest(test_kind, | 3706 return type_arguments.TypeTest(test_kind, |
| 3713 other_type_arguments, | 3707 other_type_arguments, |
| 3714 from_index, | 3708 from_index, |
| 3715 num_type_params, | 3709 num_type_params, |
| 3716 bound_error, | 3710 bound_error, |
| 3717 bound_trail, | 3711 bound_trail, |
| 3718 space); | 3712 space); |
| 3719 } | 3713 } |
| 3720 if (other.IsFunctionClass()) { | 3714 if (other.IsDartFunctionClass()) { |
| 3721 // Check if type S has a call() method. | 3715 // Check if type S has a call() method. |
| 3722 Function& function = Function::Handle(zone, | 3716 Function& function = Function::Handle(zone, |
| 3723 thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call())); | 3717 thsi.LookupDynamicFunctionAllowAbstract(Symbols::Call())); |
| 3724 if (function.IsNull()) { | 3718 if (function.IsNull()) { |
| 3725 // Walk up the super_class chain. | 3719 // Walk up the super_class chain. |
| 3726 Class& cls = Class::Handle(zone, thsi.SuperClass()); | 3720 Class& cls = Class::Handle(zone, thsi.SuperClass()); |
| 3727 while (!cls.IsNull() && function.IsNull()) { | 3721 while (!cls.IsNull() && function.IsNull()) { |
| 3728 function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); | 3722 function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
| 3729 cls = cls.SuperClass(); | 3723 cls = cls.SuperClass(); |
| 3730 } | 3724 } |
| (...skipping 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5432 ASSERT(obj.IsArray()); | 5426 ASSERT(obj.IsArray()); |
| 5433 ASSERT((Array::Cast(obj).At(1) == Object::null()) || value.IsNull()); | 5427 ASSERT((Array::Cast(obj).At(1) == Object::null()) || value.IsNull()); |
| 5434 Array::Cast(obj).SetAt(1, value); | 5428 Array::Cast(obj).SetAt(1, value); |
| 5435 } else { | 5429 } else { |
| 5436 ASSERT((raw_ptr()->data_ == Object::null()) || value.IsNull()); | 5430 ASSERT((raw_ptr()->data_ == Object::null()) || value.IsNull()); |
| 5437 set_data(value); | 5431 set_data(value); |
| 5438 } | 5432 } |
| 5439 } | 5433 } |
| 5440 | 5434 |
| 5441 | 5435 |
| 5442 RawFunctionType* Function::SignatureType() const { | 5436 RawType* Function::SignatureType() const { |
| 5443 FunctionType& type = FunctionType::Handle(); | 5437 Type& type = Type::Handle(); |
| 5444 const Object& obj = Object::Handle(raw_ptr()->data_); | 5438 const Object& obj = Object::Handle(raw_ptr()->data_); |
| 5445 if (IsSignatureFunction()) { | 5439 if (IsSignatureFunction()) { |
| 5446 ASSERT(obj.IsNull() || obj.IsFunctionType()); | 5440 ASSERT(obj.IsNull() || Type::Cast(obj).IsFunctionType()); |
| 5447 type = obj.IsNull() ? FunctionType::null() : FunctionType::Cast(obj).raw(); | 5441 type = obj.IsNull() ? Type::null() : Type::Cast(obj).raw(); |
| 5448 } else { | 5442 } else { |
| 5449 ASSERT(IsClosureFunction()); | 5443 ASSERT(IsClosureFunction()); |
| 5450 ASSERT(!obj.IsNull()); | 5444 ASSERT(!obj.IsNull()); |
| 5451 type = ClosureData::Cast(obj).signature_type(); | 5445 type = ClosureData::Cast(obj).signature_type(); |
| 5452 } | 5446 } |
| 5453 if (type.IsNull()) { | 5447 if (type.IsNull()) { |
| 5454 // A function type is parameterized in the same way as the owner class of | 5448 // A function type is parameterized in the same way as the owner class of |
| 5455 // its non-static signature function. | 5449 // its non-static signature function. |
| 5456 // It is not type parameterized if its signature function is static. | 5450 // It is not type parameterized if its signature function is static. |
| 5457 // During type finalization, the type arguments of the super class of the | 5451 // During type finalization, the type arguments of the super class of the |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 5473 HasInstantiatedSignature())) { | 5467 HasInstantiatedSignature())) { |
| 5474 scope_class = Isolate::Current()->object_store()->closure_class(); | 5468 scope_class = Isolate::Current()->object_store()->closure_class(); |
| 5475 if (IsSignatureFunction()) { | 5469 if (IsSignatureFunction()) { |
| 5476 set_owner(scope_class); | 5470 set_owner(scope_class); |
| 5477 set_token_pos(TokenPosition::kNoSource); | 5471 set_token_pos(TokenPosition::kNoSource); |
| 5478 } | 5472 } |
| 5479 } | 5473 } |
| 5480 const TypeArguments& signature_type_arguments = | 5474 const TypeArguments& signature_type_arguments = |
| 5481 TypeArguments::Handle(scope_class.type_parameters()); | 5475 TypeArguments::Handle(scope_class.type_parameters()); |
| 5482 // Return the still unfinalized signature type. | 5476 // Return the still unfinalized signature type. |
| 5483 type = FunctionType::New(scope_class, | 5477 type = Type::New(scope_class, signature_type_arguments, token_pos()); |
| 5484 signature_type_arguments, | 5478 type.set_signature(*this); |
| 5485 *this, | |
| 5486 token_pos()); | |
| 5487 | |
| 5488 SetSignatureType(type); | 5479 SetSignatureType(type); |
| 5489 } | 5480 } |
| 5490 return type.raw(); | 5481 return type.raw(); |
| 5491 } | 5482 } |
| 5492 | 5483 |
| 5493 | 5484 |
| 5494 void Function::SetSignatureType(const FunctionType& value) const { | 5485 void Function::SetSignatureType(const Type& value) const { |
| 5495 if (IsSignatureFunction()) { | 5486 if (IsSignatureFunction()) { |
| 5496 set_data(value); | 5487 set_data(value); |
| 5497 } else { | 5488 } else { |
| 5498 ASSERT(IsClosureFunction()); | 5489 ASSERT(IsClosureFunction()); |
| 5499 const Object& obj = Object::Handle(raw_ptr()->data_); | 5490 const Object& obj = Object::Handle(raw_ptr()->data_); |
| 5500 ASSERT(!obj.IsNull()); | 5491 ASSERT(!obj.IsNull()); |
| 5501 ClosureData::Cast(obj).set_signature_type(value); | 5492 ClosureData::Cast(obj).set_signature_type(value); |
| 5502 } | 5493 } |
| 5503 } | 5494 } |
| 5504 | 5495 |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6153 other.token_pos(), | 6144 other.token_pos(), |
| 6154 Report::AtLocation, | 6145 Report::AtLocation, |
| 6155 Report::kError, | 6146 Report::kError, |
| 6156 Heap::kNew, | 6147 Heap::kNew, |
| 6157 "signature type '%s' of function '%s' is not a subtype of signature " | 6148 "signature type '%s' of function '%s' is not a subtype of signature " |
| 6158 "type '%s' of function '%s' where\n%s%s", | 6149 "type '%s' of function '%s' where\n%s%s", |
| 6159 String::Handle(UserVisibleSignature()).ToCString(), | 6150 String::Handle(UserVisibleSignature()).ToCString(), |
| 6160 String::Handle(UserVisibleName()).ToCString(), | 6151 String::Handle(UserVisibleName()).ToCString(), |
| 6161 String::Handle(other.UserVisibleSignature()).ToCString(), | 6152 String::Handle(other.UserVisibleSignature()).ToCString(), |
| 6162 String::Handle(other.UserVisibleName()).ToCString(), | 6153 String::Handle(other.UserVisibleName()).ToCString(), |
| 6163 String::Handle(FunctionType::Handle( | 6154 String::Handle(Type::Handle( |
| 6164 SignatureType()).EnumerateURIs()).ToCString(), | 6155 SignatureType()).EnumerateURIs()).ToCString(), |
| 6165 String::Handle(FunctionType::Handle( | 6156 String::Handle(Type::Handle( |
| 6166 other.SignatureType()).EnumerateURIs()).ToCString()); | 6157 other.SignatureType()).EnumerateURIs()).ToCString()); |
| 6167 return false; | 6158 return false; |
| 6168 } | 6159 } |
| 6169 // We should also check that if the other function explicitly specifies a | 6160 // We should also check that if the other function explicitly specifies a |
| 6170 // default value for a formal parameter, this function does not specify a | 6161 // default value for a formal parameter, this function does not specify a |
| 6171 // different default value for the same parameter. However, this check is not | 6162 // different default value for the same parameter. However, this check is not |
| 6172 // possible in the current implementation, because the default parameter | 6163 // possible in the current implementation, because the default parameter |
| 6173 // values are not stored in the Function object, but discarded after a | 6164 // values are not stored in the Function object, but discarded after a |
| 6174 // function is compiled. | 6165 // function is compiled. |
| 6175 return true; | 6166 return true; |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6591 // Add implicit closure object parameter. | 6582 // Add implicit closure object parameter. |
| 6592 param_type = Type::DynamicType(); | 6583 param_type = Type::DynamicType(); |
| 6593 closure_function.SetParameterTypeAt(0, param_type); | 6584 closure_function.SetParameterTypeAt(0, param_type); |
| 6594 closure_function.SetParameterNameAt(0, Symbols::ClosureParameter()); | 6585 closure_function.SetParameterNameAt(0, Symbols::ClosureParameter()); |
| 6595 for (int i = kClosure; i < num_params; i++) { | 6586 for (int i = kClosure; i < num_params; i++) { |
| 6596 param_type = ParameterTypeAt(has_receiver - kClosure + i); | 6587 param_type = ParameterTypeAt(has_receiver - kClosure + i); |
| 6597 closure_function.SetParameterTypeAt(i, param_type); | 6588 closure_function.SetParameterTypeAt(i, param_type); |
| 6598 param_name = ParameterNameAt(has_receiver - kClosure + i); | 6589 param_name = ParameterNameAt(has_receiver - kClosure + i); |
| 6599 closure_function.SetParameterNameAt(i, param_name); | 6590 closure_function.SetParameterNameAt(i, param_name); |
| 6600 } | 6591 } |
| 6601 const FunctionType& signature_type = | 6592 const Type& signature_type = Type::Handle(closure_function.SignatureType()); |
| 6602 FunctionType::Handle(closure_function.SignatureType()); | |
| 6603 if (!signature_type.IsFinalized()) { | 6593 if (!signature_type.IsFinalized()) { |
| 6604 ClassFinalizer::FinalizeType( | 6594 ClassFinalizer::FinalizeType( |
| 6605 Class::Handle(Owner()), signature_type, ClassFinalizer::kCanonicalize); | 6595 Class::Handle(Owner()), signature_type, ClassFinalizer::kCanonicalize); |
| 6606 } | 6596 } |
| 6607 set_implicit_closure_function(closure_function); | 6597 set_implicit_closure_function(closure_function); |
| 6608 ASSERT(closure_function.IsImplicitClosureFunction()); | 6598 ASSERT(closure_function.IsImplicitClosureFunction()); |
| 6609 return closure_function.raw(); | 6599 return closure_function.raw(); |
| 6610 } | 6600 } |
| 6611 | 6601 |
| 6612 | 6602 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6667 } | 6657 } |
| 6668 i++; | 6658 i++; |
| 6669 } | 6659 } |
| 6670 if (num_opt_params > 0) { | 6660 if (num_opt_params > 0) { |
| 6671 if (num_opt_pos_params > 0) { | 6661 if (num_opt_pos_params > 0) { |
| 6672 pieces->Add(Symbols::LBracket()); | 6662 pieces->Add(Symbols::LBracket()); |
| 6673 } else { | 6663 } else { |
| 6674 pieces->Add(Symbols::LBrace()); | 6664 pieces->Add(Symbols::LBrace()); |
| 6675 } | 6665 } |
| 6676 for (intptr_t i = num_fixed_params; i < num_params; i++) { | 6666 for (intptr_t i = num_fixed_params; i < num_params; i++) { |
| 6677 // The parameter name of an optional positional parameter does not need | |
| 6678 // to be part of the signature, since it is not used. | |
| 6679 if (num_opt_named_params > 0) { | |
| 6680 name = ParameterNameAt(i); | |
| 6681 pieces->Add(name); | |
| 6682 pieces->Add(Symbols::ColonSpace()); | |
| 6683 } | |
| 6684 param_type = ParameterTypeAt(i); | 6667 param_type = ParameterTypeAt(i); |
| 6685 if (instantiate && | 6668 if (instantiate && |
| 6686 param_type.IsFinalized() && | 6669 param_type.IsFinalized() && |
| 6687 !param_type.IsInstantiated()) { | 6670 !param_type.IsInstantiated()) { |
| 6688 param_type = param_type.InstantiateFrom(instantiator, NULL, | 6671 param_type = param_type.InstantiateFrom(instantiator, NULL, |
| 6689 NULL, NULL, Heap::kNew); | 6672 NULL, NULL, Heap::kNew); |
| 6690 } | 6673 } |
| 6691 ASSERT(!param_type.IsNull()); | 6674 ASSERT(!param_type.IsNull()); |
| 6692 name = param_type.BuildName(name_visibility); | 6675 name = param_type.BuildName(name_visibility); |
| 6693 pieces->Add(name); | 6676 pieces->Add(name); |
| 6677 // The parameter name of an optional positional parameter does not need | |
| 6678 // to be part of the signature, since it is not used. | |
| 6679 if (num_opt_named_params > 0) { | |
| 6680 name = ParameterNameAt(i); | |
| 6681 pieces->Add(Symbols::Blank()); | |
| 6682 pieces->Add(name); | |
| 6683 } | |
| 6694 if (i != (num_params - 1)) { | 6684 if (i != (num_params - 1)) { |
| 6695 pieces->Add(Symbols::CommaSpace()); | 6685 pieces->Add(Symbols::CommaSpace()); |
| 6696 } | 6686 } |
| 6697 } | 6687 } |
| 6698 if (num_opt_pos_params > 0) { | 6688 if (num_opt_pos_params > 0) { |
| 6699 pieces->Add(Symbols::RBracket()); | 6689 pieces->Add(Symbols::RBracket()); |
| 6700 } else { | 6690 } else { |
| 6701 pieces->Add(Symbols::RBrace()); | 6691 pieces->Add(Symbols::RBrace()); |
| 6702 } | 6692 } |
| 6703 } | 6693 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 6715 Instance& closure = | 6705 Instance& closure = |
| 6716 Instance::Handle(zone, Closure::New(*this, context, Heap::kOld)); | 6706 Instance::Handle(zone, Closure::New(*this, context, Heap::kOld)); |
| 6717 set_implicit_static_closure(closure); | 6707 set_implicit_static_closure(closure); |
| 6718 } | 6708 } |
| 6719 return implicit_static_closure(); | 6709 return implicit_static_closure(); |
| 6720 } | 6710 } |
| 6721 | 6711 |
| 6722 | 6712 |
| 6723 RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const { | 6713 RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const { |
| 6724 ASSERT(IsImplicitClosureFunction()); | 6714 ASSERT(IsImplicitClosureFunction()); |
| 6725 const FunctionType& signature_type = FunctionType::Handle(SignatureType()); | 6715 const Type& signature_type = Type::Handle(SignatureType()); |
| 6726 const Class& cls = Class::Handle(signature_type.type_class()); | 6716 const Class& cls = Class::Handle(signature_type.type_class()); |
| 6727 const Context& context = Context::Handle(Context::New(1)); | 6717 const Context& context = Context::Handle(Context::New(1)); |
| 6728 context.SetAt(0, receiver); | 6718 context.SetAt(0, receiver); |
| 6729 const Instance& result = Instance::Handle(Closure::New(*this, context)); | 6719 const Instance& result = Instance::Handle(Closure::New(*this, context)); |
| 6730 if (cls.IsGeneric()) { | 6720 if (cls.IsGeneric()) { |
| 6731 const TypeArguments& type_arguments = | 6721 const TypeArguments& type_arguments = |
| 6732 TypeArguments::Handle(receiver.GetTypeArguments()); | 6722 TypeArguments::Handle(receiver.GetTypeArguments()); |
| 6733 result.SetTypeArguments(type_arguments); | 6723 result.SetTypeArguments(type_arguments); |
| 6734 } | 6724 } |
| 6735 return result.raw(); | 6725 return result.raw(); |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7127 ASSERT(raw_ptr()->closure_ == Instance::null()); | 7117 ASSERT(raw_ptr()->closure_ == Instance::null()); |
| 7128 StorePointer(&raw_ptr()->closure_, closure.raw()); | 7118 StorePointer(&raw_ptr()->closure_, closure.raw()); |
| 7129 } | 7119 } |
| 7130 | 7120 |
| 7131 | 7121 |
| 7132 void ClosureData::set_parent_function(const Function& value) const { | 7122 void ClosureData::set_parent_function(const Function& value) const { |
| 7133 StorePointer(&raw_ptr()->parent_function_, value.raw()); | 7123 StorePointer(&raw_ptr()->parent_function_, value.raw()); |
| 7134 } | 7124 } |
| 7135 | 7125 |
| 7136 | 7126 |
| 7137 void ClosureData::set_signature_type(const FunctionType& value) const { | 7127 void ClosureData::set_signature_type(const Type& value) const { |
| 7138 StorePointer(&raw_ptr()->signature_type_, value.raw()); | 7128 StorePointer(&raw_ptr()->signature_type_, value.raw()); |
| 7139 } | 7129 } |
| 7140 | 7130 |
| 7141 | 7131 |
| 7142 RawClosureData* ClosureData::New() { | 7132 RawClosureData* ClosureData::New() { |
| 7143 ASSERT(Object::closure_data_class() != Class::null()); | 7133 ASSERT(Object::closure_data_class() != Class::null()); |
| 7144 RawObject* raw = Object::Allocate(ClosureData::kClassId, | 7134 RawObject* raw = Object::Allocate(ClosureData::kClassId, |
| 7145 ClosureData::InstanceSize(), | 7135 ClosureData::InstanceSize(), |
| 7146 Heap::kOld); | 7136 Heap::kOld); |
| 7147 return reinterpret_cast<RawClosureData*>(raw); | 7137 return reinterpret_cast<RawClosureData*>(raw); |
| (...skipping 4945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12093 ASSERT(!value.IsNull()); | 12083 ASSERT(!value.IsNull()); |
| 12094 StorePointer(&raw_ptr()->target_name_, value.raw()); | 12084 StorePointer(&raw_ptr()->target_name_, value.raw()); |
| 12095 } | 12085 } |
| 12096 | 12086 |
| 12097 | 12087 |
| 12098 void ICData::set_arguments_descriptor(const Array& value) const { | 12088 void ICData::set_arguments_descriptor(const Array& value) const { |
| 12099 ASSERT(!value.IsNull()); | 12089 ASSERT(!value.IsNull()); |
| 12100 StorePointer(&raw_ptr()->args_descriptor_, value.raw()); | 12090 StorePointer(&raw_ptr()->args_descriptor_, value.raw()); |
| 12101 } | 12091 } |
| 12102 | 12092 |
| 12093 | |
| 12103 void ICData::set_deopt_id(intptr_t value) const { | 12094 void ICData::set_deopt_id(intptr_t value) const { |
| 12104 ASSERT(value <= kMaxInt32); | 12095 ASSERT(value <= kMaxInt32); |
| 12105 StoreNonPointer(&raw_ptr()->deopt_id_, value); | 12096 StoreNonPointer(&raw_ptr()->deopt_id_, value); |
| 12106 } | 12097 } |
| 12107 | 12098 |
| 12108 | 12099 |
| 12109 void ICData::set_ic_data_array(const Array& value) const { | 12100 void ICData::set_ic_data_array(const Array& value) const { |
| 12110 ASSERT(!value.IsNull()); | 12101 ASSERT(!value.IsNull()); |
| 12111 StorePointer(&raw_ptr()->ic_data_, value.raw()); | 12102 StorePointer(&raw_ptr()->ic_data_, value.raw()); |
| 12112 } | 12103 } |
| (...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14612 | 14603 |
| 14613 | 14604 |
| 14614 RawAbstractType* Instance::GetType() const { | 14605 RawAbstractType* Instance::GetType() const { |
| 14615 if (IsNull()) { | 14606 if (IsNull()) { |
| 14616 return Type::NullType(); | 14607 return Type::NullType(); |
| 14617 } | 14608 } |
| 14618 const Class& cls = Class::Handle(clazz()); | 14609 const Class& cls = Class::Handle(clazz()); |
| 14619 if (cls.IsClosureClass()) { | 14610 if (cls.IsClosureClass()) { |
| 14620 const Function& signature = | 14611 const Function& signature = |
| 14621 Function::Handle(Closure::Cast(*this).function()); | 14612 Function::Handle(Closure::Cast(*this).function()); |
| 14622 FunctionType& type = FunctionType::Handle(signature.SignatureType()); | 14613 Type& type = Type::Handle(signature.SignatureType()); |
| 14623 if (type.scope_class() == cls.raw()) { | 14614 if (type.type_class() == cls.raw()) { |
| 14624 // Type is not parameterized. | 14615 // Type is not parameterized. |
| 14625 if (!type.IsCanonical()) { | 14616 if (!type.IsCanonical()) { |
| 14626 type ^= type.Canonicalize(); | 14617 type ^= type.Canonicalize(); |
| 14627 signature.SetSignatureType(type); | 14618 signature.SetSignatureType(type); |
| 14628 } | 14619 } |
| 14629 return type.raw(); | 14620 return type.raw(); |
| 14630 } | 14621 } |
| 14631 const Class& scope_cls = Class::Handle(type.scope_class()); | 14622 const Class& scope_cls = Class::Handle(type.type_class()); |
| 14632 ASSERT(scope_cls.NumTypeArguments() > 0); | 14623 ASSERT(scope_cls.NumTypeArguments() > 0); |
| 14633 TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments()); | 14624 TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments()); |
| 14634 type = FunctionType::New( | 14625 type = Type::New(scope_cls, type_arguments, TokenPosition::kNoSource); |
| 14635 scope_cls, type_arguments, signature, TokenPosition::kNoSource); | 14626 type.set_signature(signature); |
| 14636 type.SetIsFinalized(); | 14627 type.SetIsFinalized(); |
| 14637 type ^= type.Canonicalize(); | 14628 type ^= type.Canonicalize(); |
| 14638 return type.raw(); | 14629 return type.raw(); |
| 14639 } | 14630 } |
| 14640 Type& type = Type::Handle(); | 14631 Type& type = Type::Handle(); |
| 14641 if (!cls.IsGeneric()) { | 14632 if (!cls.IsGeneric()) { |
| 14642 type = cls.CanonicalType(); | 14633 type = cls.CanonicalType(); |
| 14643 } | 14634 } |
| 14644 if (type.IsNull()) { | 14635 if (type.IsNull()) { |
| 14645 TypeArguments& type_arguments = TypeArguments::Handle(); | 14636 TypeArguments& type_arguments = TypeArguments::Handle(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14705 instantiated_other = TypeRef::Cast(instantiated_other).type(); | 14696 instantiated_other = TypeRef::Cast(instantiated_other).type(); |
| 14706 } | 14697 } |
| 14707 if (instantiated_other.IsDynamicType() || | 14698 if (instantiated_other.IsDynamicType() || |
| 14708 instantiated_other.IsObjectType() || | 14699 instantiated_other.IsObjectType() || |
| 14709 instantiated_other.IsDartFunctionType()) { | 14700 instantiated_other.IsDartFunctionType()) { |
| 14710 return true; | 14701 return true; |
| 14711 } | 14702 } |
| 14712 if (!instantiated_other.IsFunctionType()) { | 14703 if (!instantiated_other.IsFunctionType()) { |
| 14713 return false; | 14704 return false; |
| 14714 } | 14705 } |
| 14715 other_signature = FunctionType::Cast(instantiated_other).signature(); | 14706 other_signature = Type::Cast(instantiated_other).signature(); |
| 14716 other_type_arguments = instantiated_other.arguments(); | 14707 other_type_arguments = instantiated_other.arguments(); |
| 14717 } else { | 14708 } else { |
| 14718 if (!other.IsFunctionType()) { | 14709 if (!other.IsFunctionType()) { |
| 14719 return false; | 14710 return false; |
| 14720 } | 14711 } |
| 14721 other_signature = FunctionType::Cast(other).signature(); | 14712 other_signature = Type::Cast(other).signature(); |
| 14722 other_type_arguments = other.arguments(); | 14713 other_type_arguments = other.arguments(); |
| 14723 } | 14714 } |
| 14724 const Function& signature = | 14715 const Function& signature = |
| 14725 Function::Handle(zone, Closure::Cast(*this).function()); | 14716 Function::Handle(zone, Closure::Cast(*this).function()); |
| 14726 const TypeArguments& type_arguments = | 14717 const TypeArguments& type_arguments = |
| 14727 TypeArguments::Handle(zone, GetTypeArguments()); | 14718 TypeArguments::Handle(zone, GetTypeArguments()); |
| 14728 return signature.IsSubtypeOf(type_arguments, | 14719 return signature.IsSubtypeOf(type_arguments, |
| 14729 other_signature, | 14720 other_signature, |
| 14730 other_type_arguments, | 14721 other_type_arguments, |
| 14731 bound_error, | 14722 bound_error, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14776 while (!super_cls.IsNull() && call.IsNull()) { | 14767 while (!super_cls.IsNull() && call.IsNull()) { |
| 14777 call = super_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); | 14768 call = super_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
| 14778 super_cls = super_cls.SuperClass(); | 14769 super_cls = super_cls.SuperClass(); |
| 14779 } | 14770 } |
| 14780 } | 14771 } |
| 14781 if (!call.IsNull()) { | 14772 if (!call.IsNull()) { |
| 14782 if (other_is_dart_function) { | 14773 if (other_is_dart_function) { |
| 14783 return true; | 14774 return true; |
| 14784 } | 14775 } |
| 14785 const Function& other_signature = Function::Handle( | 14776 const Function& other_signature = Function::Handle( |
| 14786 zone, FunctionType::Cast(instantiated_other).signature()); | 14777 zone, Type::Cast(instantiated_other).signature()); |
| 14787 if (call.IsSubtypeOf(type_arguments, | 14778 if (call.IsSubtypeOf(type_arguments, |
| 14788 other_signature, | 14779 other_signature, |
| 14789 other_type_arguments, | 14780 other_type_arguments, |
| 14790 bound_error, | 14781 bound_error, |
| 14791 Heap::kOld)) { | 14782 Heap::kOld)) { |
| 14792 return true; | 14783 return true; |
| 14793 } | 14784 } |
| 14794 } | 14785 } |
| 14795 } | 14786 } |
| 14796 if (!instantiated_other.IsType()) { | 14787 if (!instantiated_other.IsType()) { |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15273 // a malformed type, so proceed with caution. | 15264 // a malformed type, so proceed with caution. |
| 15274 const TypeArguments& args = TypeArguments::Handle(zone, arguments()); | 15265 const TypeArguments& args = TypeArguments::Handle(zone, arguments()); |
| 15275 const intptr_t num_args = args.IsNull() ? 0 : args.Length(); | 15266 const intptr_t num_args = args.IsNull() ? 0 : args.Length(); |
| 15276 String& class_name = String::Handle(zone); | 15267 String& class_name = String::Handle(zone); |
| 15277 intptr_t first_type_param_index; | 15268 intptr_t first_type_param_index; |
| 15278 intptr_t num_type_params; // Number of type parameters to print. | 15269 intptr_t num_type_params; // Number of type parameters to print. |
| 15279 Class& cls = Class::Handle(zone); | 15270 Class& cls = Class::Handle(zone); |
| 15280 if (IsFunctionType()) { | 15271 if (IsFunctionType()) { |
| 15281 cls = type_class(); | 15272 cls = type_class(); |
| 15282 const Function& signature_function = Function::Handle( | 15273 const Function& signature_function = Function::Handle( |
| 15283 zone, FunctionType::Cast(*this).signature()); | 15274 zone, Type::Cast(*this).signature()); |
| 15284 if (!cls.IsTypedefClass() || | 15275 if (!cls.IsTypedefClass() || |
| 15285 (cls.signature_function() != signature_function.raw())) { | 15276 (cls.signature_function() != signature_function.raw())) { |
| 15286 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { | 15277 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { |
| 15287 return signature_function.UserVisibleSignature(); | 15278 return signature_function.UserVisibleSignature(); |
| 15288 } | 15279 } |
| 15289 return signature_function.InstantiatedSignatureFrom(args, | 15280 return signature_function.InstantiatedSignatureFrom(args, |
| 15290 name_visibility); | 15281 name_visibility); |
| 15291 } | 15282 } |
| 15292 class_name = cls.Name(); // Typedef name. | 15283 class_name = cls.Name(); // Typedef name. |
| 15293 // We may be reporting an error about a malformed function type. In that | 15284 // We may be reporting an error about a malformed function type. In that |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15378 pieces.Add(String::Handle(zone, BuildName(kUserVisibleName))); | 15369 pieces.Add(String::Handle(zone, BuildName(kUserVisibleName))); |
| 15379 if (!IsDynamicType() && !IsVoidType()) { | 15370 if (!IsDynamicType() && !IsVoidType()) { |
| 15380 pieces.Add(Symbols::SpaceWhereNewLine()); | 15371 pieces.Add(Symbols::SpaceWhereNewLine()); |
| 15381 pieces.Add(String::Handle(zone, EnumerateURIs())); | 15372 pieces.Add(String::Handle(zone, EnumerateURIs())); |
| 15382 } | 15373 } |
| 15383 return Symbols::FromConcatAll(pieces); | 15374 return Symbols::FromConcatAll(pieces); |
| 15384 } | 15375 } |
| 15385 | 15376 |
| 15386 | 15377 |
| 15387 RawString* AbstractType::ClassName() const { | 15378 RawString* AbstractType::ClassName() const { |
| 15379 ASSERT(!IsFunctionType()); | |
| 15388 if (HasResolvedTypeClass()) { | 15380 if (HasResolvedTypeClass()) { |
| 15389 return Class::Handle(type_class()).Name(); | 15381 return Class::Handle(type_class()).Name(); |
| 15390 } else { | 15382 } else { |
| 15391 return UnresolvedClass::Handle(unresolved_class()).Name(); | 15383 return UnresolvedClass::Handle(unresolved_class()).Name(); |
| 15392 } | 15384 } |
| 15393 } | 15385 } |
| 15394 | 15386 |
| 15395 | 15387 |
| 15396 bool AbstractType::IsNullType() const { | 15388 bool AbstractType::IsNullType() const { |
| 15397 return HasResolvedTypeClass() && | 15389 return !IsFunctionType() && |
| 15390 HasResolvedTypeClass() && | |
| 15398 (type_class() == Isolate::Current()->object_store()->null_class()); | 15391 (type_class() == Isolate::Current()->object_store()->null_class()); |
| 15399 } | 15392 } |
| 15400 | 15393 |
| 15401 | 15394 |
| 15402 bool AbstractType::IsBoolType() const { | 15395 bool AbstractType::IsBoolType() const { |
| 15403 return HasResolvedTypeClass() && | 15396 return !IsFunctionType() && |
| 15397 HasResolvedTypeClass() && | |
| 15404 (type_class() == Isolate::Current()->object_store()->bool_class()); | 15398 (type_class() == Isolate::Current()->object_store()->bool_class()); |
| 15405 } | 15399 } |
| 15406 | 15400 |
| 15407 | 15401 |
| 15408 bool AbstractType::IsIntType() const { | 15402 bool AbstractType::IsIntType() const { |
| 15409 return HasResolvedTypeClass() && | 15403 return !IsFunctionType() && |
| 15404 HasResolvedTypeClass() && | |
| 15410 (type_class() == Type::Handle(Type::IntType()).type_class()); | 15405 (type_class() == Type::Handle(Type::IntType()).type_class()); |
| 15411 } | 15406 } |
| 15412 | 15407 |
| 15413 | 15408 |
| 15414 bool AbstractType::IsDoubleType() const { | 15409 bool AbstractType::IsDoubleType() const { |
| 15415 return HasResolvedTypeClass() && | 15410 return !IsFunctionType() && |
| 15411 HasResolvedTypeClass() && | |
| 15416 (type_class() == Type::Handle(Type::Double()).type_class()); | 15412 (type_class() == Type::Handle(Type::Double()).type_class()); |
| 15417 } | 15413 } |
| 15418 | 15414 |
| 15419 | 15415 |
| 15420 bool AbstractType::IsFloat32x4Type() const { | 15416 bool AbstractType::IsFloat32x4Type() const { |
| 15421 return HasResolvedTypeClass() && | 15417 return !IsFunctionType() && |
| 15418 HasResolvedTypeClass() && | |
| 15422 (type_class() == Type::Handle(Type::Float32x4()).type_class()); | 15419 (type_class() == Type::Handle(Type::Float32x4()).type_class()); |
| 15423 } | 15420 } |
| 15424 | 15421 |
| 15425 | 15422 |
| 15426 bool AbstractType::IsFloat64x2Type() const { | 15423 bool AbstractType::IsFloat64x2Type() const { |
| 15427 return HasResolvedTypeClass() && | 15424 return !IsFunctionType() && |
| 15425 HasResolvedTypeClass() && | |
| 15428 (type_class() == Type::Handle(Type::Float64x2()).type_class()); | 15426 (type_class() == Type::Handle(Type::Float64x2()).type_class()); |
| 15429 } | 15427 } |
| 15430 | 15428 |
| 15431 | 15429 |
| 15432 bool AbstractType::IsInt32x4Type() const { | 15430 bool AbstractType::IsInt32x4Type() const { |
| 15433 return HasResolvedTypeClass() && | 15431 return !IsFunctionType() && |
| 15432 HasResolvedTypeClass() && | |
| 15434 (type_class() == Type::Handle(Type::Int32x4()).type_class()); | 15433 (type_class() == Type::Handle(Type::Int32x4()).type_class()); |
| 15435 } | 15434 } |
| 15436 | 15435 |
| 15437 | 15436 |
| 15438 bool AbstractType::IsNumberType() const { | 15437 bool AbstractType::IsNumberType() const { |
| 15439 return HasResolvedTypeClass() && | 15438 return !IsFunctionType() && |
| 15439 HasResolvedTypeClass() && | |
| 15440 (type_class() == Type::Handle(Type::Number()).type_class()); | 15440 (type_class() == Type::Handle(Type::Number()).type_class()); |
| 15441 } | 15441 } |
| 15442 | 15442 |
| 15443 | 15443 |
| 15444 bool AbstractType::IsSmiType() const { | 15444 bool AbstractType::IsSmiType() const { |
| 15445 return HasResolvedTypeClass() && | 15445 return !IsFunctionType() && |
| 15446 HasResolvedTypeClass() && | |
| 15446 (type_class() == Type::Handle(Type::SmiType()).type_class()); | 15447 (type_class() == Type::Handle(Type::SmiType()).type_class()); |
| 15447 } | 15448 } |
| 15448 | 15449 |
| 15449 | 15450 |
| 15450 bool AbstractType::IsStringType() const { | 15451 bool AbstractType::IsStringType() const { |
| 15451 return HasResolvedTypeClass() && | 15452 return !IsFunctionType() && |
| 15453 HasResolvedTypeClass() && | |
| 15452 (type_class() == Type::Handle(Type::StringType()).type_class()); | 15454 (type_class() == Type::Handle(Type::StringType()).type_class()); |
| 15453 } | 15455 } |
| 15454 | 15456 |
| 15455 | 15457 |
| 15456 bool AbstractType::IsDartFunctionType() const { | 15458 bool AbstractType::IsDartFunctionType() const { |
| 15457 return HasResolvedTypeClass() && | 15459 return !IsFunctionType() && |
| 15458 (type_class() == Type::Handle(Type::Function()).type_class()); | 15460 HasResolvedTypeClass() && |
| 15461 (type_class() == Type::Handle(Type::DartFunctionType()).type_class()); | |
| 15459 } | 15462 } |
| 15460 | 15463 |
| 15461 | 15464 |
| 15462 bool AbstractType::TypeTest(TypeTestKind test_kind, | 15465 bool AbstractType::TypeTest(TypeTestKind test_kind, |
| 15463 const AbstractType& other, | 15466 const AbstractType& other, |
| 15464 Error* bound_error, | 15467 Error* bound_error, |
| 15465 TrailPtr bound_trail, | 15468 TrailPtr bound_trail, |
| 15466 Heap::Space space) const { | 15469 Heap::Space space) const { |
| 15467 ASSERT(IsFinalized()); | 15470 ASSERT(IsFinalized()); |
| 15468 ASSERT(other.IsFinalized()); | 15471 ASSERT(other.IsFinalized()); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15546 if (other.IsTypeParameter()) { | 15549 if (other.IsTypeParameter()) { |
| 15547 const TypeParameter& other_type_param = TypeParameter::Cast(other); | 15550 const TypeParameter& other_type_param = TypeParameter::Cast(other); |
| 15548 if (type_param.Equals(other_type_param)) { | 15551 if (type_param.Equals(other_type_param)) { |
| 15549 return true; | 15552 return true; |
| 15550 } | 15553 } |
| 15551 } | 15554 } |
| 15552 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); | 15555 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); |
| 15553 // We may be checking bounds at finalization time and can encounter | 15556 // We may be checking bounds at finalization time and can encounter |
| 15554 // a still unfinalized bound. Finalizing the bound here may lead to cycles. | 15557 // a still unfinalized bound. Finalizing the bound here may lead to cycles. |
| 15555 if (!bound.IsFinalized()) { | 15558 if (!bound.IsFinalized()) { |
| 15556 return false; // TODO(regis): Return "maybe after instantiation". | 15559 return false; // TODO(regis): Return "maybe after instantiation". |
| 15557 } | 15560 } |
| 15558 // The current bound_trail cannot be used, because operands are swapped and | 15561 // The current bound_trail cannot be used, because operands are swapped and |
| 15559 // the test is different anyway (more specific vs. subtype). | 15562 // the test is different anyway (more specific vs. subtype). |
| 15560 if (bound.IsMoreSpecificThan(other, bound_error, NULL, space)) { | 15563 if (bound.IsMoreSpecificThan(other, bound_error, NULL, space)) { |
| 15561 return true; | 15564 return true; |
| 15562 } | 15565 } |
| 15563 return false; // TODO(regis): We should return "maybe after instantiation". | 15566 return false; // TODO(regis): We should return "maybe after instantiation". |
| 15564 } | 15567 } |
| 15565 if (other.IsTypeParameter()) { | 15568 if (other.IsTypeParameter()) { |
| 15566 return false; // TODO(regis): We should return "maybe after instantiation". | 15569 return false; // TODO(regis): We should return "maybe after instantiation". |
| 15567 } | 15570 } |
| 15568 const Class& type_cls = Class::Handle(zone, type_class()); | 15571 const Class& type_cls = Class::Handle(zone, type_class()); |
| 15569 // Function types cannot be handled by Class::TypeTest(). | 15572 // Function types cannot be handled by Class::TypeTest(). |
| 15570 const bool other_is_dart_function_type = other.IsDartFunctionType(); | 15573 const bool other_is_dart_function_type = other.IsDartFunctionType(); |
| 15571 if (other_is_dart_function_type || other.IsFunctionType()) { | 15574 if (other_is_dart_function_type || other.IsFunctionType()) { |
| 15572 if (IsFunctionType()) { | 15575 if (IsFunctionType()) { |
| 15573 if (other_is_dart_function_type) { | 15576 if (other_is_dart_function_type) { |
| 15574 return true; | 15577 return true; |
| 15575 } | 15578 } |
| 15576 const Function& other_fun = | 15579 const Function& other_fun = |
| 15577 Function::Handle(zone, FunctionType::Cast(other).signature()); | 15580 Function::Handle(zone, Type::Cast(other).signature()); |
| 15578 // Check for two function types. | 15581 // Check for two function types. |
| 15579 const Function& fun = | 15582 const Function& fun = |
| 15580 Function::Handle(zone, FunctionType::Cast(*this).signature()); | 15583 Function::Handle(zone, Type::Cast(*this).signature()); |
| 15581 return fun.TypeTest(test_kind, | 15584 return fun.TypeTest(test_kind, |
| 15582 TypeArguments::Handle(zone, arguments()), | 15585 TypeArguments::Handle(zone, arguments()), |
| 15583 other_fun, | 15586 other_fun, |
| 15584 TypeArguments::Handle(zone, other.arguments()), | 15587 TypeArguments::Handle(zone, other.arguments()), |
| 15585 bound_error, | 15588 bound_error, |
| 15586 space); | 15589 space); |
| 15587 } | 15590 } |
| 15588 // Check if type S has a call() method of function type T. | 15591 // Check if type S has a call() method of function type T. |
| 15589 Function& function = Function::Handle(zone, | 15592 Function& function = Function::Handle(zone, |
| 15590 type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call())); | 15593 type_cls.LookupDynamicFunctionAllowAbstract(Symbols::Call())); |
| 15591 if (function.IsNull()) { | 15594 if (function.IsNull()) { |
| 15592 // Walk up the super_class chain. | 15595 // Walk up the super_class chain. |
| 15593 Class& cls = Class::Handle(zone, type_cls.SuperClass()); | 15596 Class& cls = Class::Handle(zone, type_cls.SuperClass()); |
| 15594 while (!cls.IsNull() && function.IsNull()) { | 15597 while (!cls.IsNull() && function.IsNull()) { |
| 15595 function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); | 15598 function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call()); |
| 15596 cls = cls.SuperClass(); | 15599 cls = cls.SuperClass(); |
| 15597 } | 15600 } |
| 15598 } | 15601 } |
| 15599 if (!function.IsNull()) { | 15602 if (!function.IsNull()) { |
| 15600 if (other_is_dart_function_type || | 15603 if (other_is_dart_function_type || |
| 15601 function.TypeTest(test_kind, | 15604 function.TypeTest(test_kind, |
| 15602 TypeArguments::Handle(zone, arguments()), | 15605 TypeArguments::Handle(zone, arguments()), |
| 15603 Function::Handle( | 15606 Function::Handle( |
| 15604 zone, FunctionType::Cast(other).signature()), | 15607 zone, Type::Cast(other).signature()), |
| 15605 TypeArguments::Handle(zone, other.arguments()), | 15608 TypeArguments::Handle(zone, other.arguments()), |
| 15606 bound_error, | 15609 bound_error, |
| 15607 space)) { | 15610 space)) { |
| 15608 return true; | 15611 return true; |
| 15609 } | 15612 } |
| 15610 } | 15613 } |
| 15611 } | 15614 } |
| 15612 if (IsFunctionType()) { | 15615 if (IsFunctionType()) { |
| 15613 return false; | 15616 return false; |
| 15614 } | 15617 } |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15704 RawType* Type::StringType() { | 15707 RawType* Type::StringType() { |
| 15705 return Isolate::Current()->object_store()->string_type(); | 15708 return Isolate::Current()->object_store()->string_type(); |
| 15706 } | 15709 } |
| 15707 | 15710 |
| 15708 | 15711 |
| 15709 RawType* Type::ArrayType() { | 15712 RawType* Type::ArrayType() { |
| 15710 return Isolate::Current()->object_store()->array_type(); | 15713 return Isolate::Current()->object_store()->array_type(); |
| 15711 } | 15714 } |
| 15712 | 15715 |
| 15713 | 15716 |
| 15714 RawType* Type::Function() { | 15717 RawType* Type::DartFunctionType() { |
| 15715 return Isolate::Current()->object_store()->function_type(); | 15718 return Isolate::Current()->object_store()->function_type(); |
| 15716 } | 15719 } |
| 15717 | 15720 |
| 15718 | 15721 |
| 15719 RawType* Type::NewNonParameterizedType(const Class& type_class) { | 15722 RawType* Type::NewNonParameterizedType(const Class& type_class) { |
| 15720 ASSERT(type_class.NumTypeArguments() == 0); | 15723 ASSERT(type_class.NumTypeArguments() == 0); |
| 15721 Type& type = Type::Handle(type_class.CanonicalType()); | 15724 Type& type = Type::Handle(type_class.CanonicalType()); |
| 15722 if (type.IsNull()) { | 15725 if (type.IsNull()) { |
| 15723 const TypeArguments& no_type_arguments = TypeArguments::Handle(); | 15726 const TypeArguments& no_type_arguments = TypeArguments::Handle(); |
| 15724 type ^= Type::New(Object::Handle(type_class.raw()), | 15727 type ^= Type::New(Object::Handle(type_class.raw()), |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 15736 ASSERT(!IsFinalized()); | 15739 ASSERT(!IsFinalized()); |
| 15737 if (IsInstantiated()) { | 15740 if (IsInstantiated()) { |
| 15738 ASSERT(HasResolvedTypeClass()); | 15741 ASSERT(HasResolvedTypeClass()); |
| 15739 set_type_state(RawType::kFinalizedInstantiated); | 15742 set_type_state(RawType::kFinalizedInstantiated); |
| 15740 } else { | 15743 } else { |
| 15741 set_type_state(RawType::kFinalizedUninstantiated); | 15744 set_type_state(RawType::kFinalizedUninstantiated); |
| 15742 } | 15745 } |
| 15743 } | 15746 } |
| 15744 | 15747 |
| 15745 | 15748 |
| 15749 void Type::ResetIsFinalized() const { | |
| 15750 ASSERT(IsFinalized()); | |
| 15751 set_type_state(RawType::kBeingFinalized); | |
| 15752 SetIsFinalized(); | |
| 15753 } | |
| 15754 | |
| 15755 | |
| 15746 void Type::SetIsBeingFinalized() const { | 15756 void Type::SetIsBeingFinalized() const { |
| 15747 ASSERT(IsResolved() && !IsFinalized() && !IsBeingFinalized()); | 15757 ASSERT(IsResolved() && !IsFinalized() && !IsBeingFinalized()); |
| 15748 set_type_state(RawType::kBeingFinalized); | 15758 set_type_state(RawType::kBeingFinalized); |
| 15749 } | 15759 } |
| 15750 | 15760 |
| 15751 | 15761 |
| 15752 bool Type::IsMalformed() const { | 15762 bool Type::IsMalformed() const { |
| 15753 if (raw_ptr()->error_ == LanguageError::null()) { | 15763 if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) { |
| 15754 return false; | 15764 return false; // Valid type, but not a function type. |
| 15755 } | 15765 } |
| 15756 const LanguageError& type_error = LanguageError::Handle(error()); | 15766 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15767 if (type_error.IsNull()) { | |
| 15768 return false; // Valid function type. | |
| 15769 } | |
| 15757 return type_error.kind() == Report::kMalformedType; | 15770 return type_error.kind() == Report::kMalformedType; |
| 15758 } | 15771 } |
| 15759 | 15772 |
| 15760 | 15773 |
| 15761 bool Type::IsMalbounded() const { | 15774 bool Type::IsMalbounded() const { |
| 15775 if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) { | |
| 15776 return false; // Valid type, but not a function type. | |
| 15777 } | |
| 15762 if (!Isolate::Current()->type_checks()) { | 15778 if (!Isolate::Current()->type_checks()) { |
| 15763 return false; | 15779 return false; |
| 15764 } | 15780 } |
| 15765 if (raw_ptr()->error_ == LanguageError::null()) { | 15781 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15766 return false; | 15782 if (type_error.IsNull()) { |
| 15783 return false; // Valid function type. | |
| 15767 } | 15784 } |
| 15768 const LanguageError& type_error = LanguageError::Handle(error()); | |
| 15769 return type_error.kind() == Report::kMalboundedType; | 15785 return type_error.kind() == Report::kMalboundedType; |
| 15770 } | 15786 } |
| 15771 | 15787 |
| 15772 | 15788 |
| 15773 bool Type::IsMalformedOrMalbounded() const { | 15789 bool Type::IsMalformedOrMalbounded() const { |
| 15774 if (raw_ptr()->error_ == LanguageError::null()) { | 15790 if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) { |
| 15775 return false; | 15791 return false; // Valid type, but not a function type. |
| 15776 } | 15792 } |
| 15777 const LanguageError& type_error = LanguageError::Handle(error()); | 15793 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15794 if (type_error.IsNull()) { | |
| 15795 return false; // Valid function type. | |
| 15796 } | |
| 15778 if (type_error.kind() == Report::kMalformedType) { | 15797 if (type_error.kind() == Report::kMalformedType) { |
| 15779 return true; | 15798 return true; |
| 15780 } | 15799 } |
| 15781 ASSERT(type_error.kind() == Report::kMalboundedType); | 15800 ASSERT(type_error.kind() == Report::kMalboundedType); |
| 15782 return Isolate::Current()->type_checks(); | 15801 return Isolate::Current()->type_checks(); |
| 15783 } | 15802 } |
| 15784 | 15803 |
| 15785 | 15804 |
| 15805 RawLanguageError* Type::error() const { | |
| 15806 const Object& type_error = Object::Handle(raw_ptr()->sig_or_err_.error_); | |
| 15807 if (type_error.IsLanguageError()) { | |
| 15808 return LanguageError::RawCast(type_error.raw()); | |
| 15809 } | |
| 15810 return LanguageError::null(); | |
| 15811 } | |
| 15812 | |
| 15813 | |
| 15786 void Type::set_error(const LanguageError& value) const { | 15814 void Type::set_error(const LanguageError& value) const { |
| 15787 StorePointer(&raw_ptr()->error_, value.raw()); | 15815 StorePointer(&raw_ptr()->sig_or_err_.error_, value.raw()); |
| 15816 } | |
| 15817 | |
| 15818 | |
| 15819 RawFunction* Type::signature() const { | |
| 15820 if (raw_ptr()->sig_or_err_.signature_ == Function::null()) { | |
| 15821 return Function::null(); | |
| 15822 } | |
| 15823 const Object& obj = Object::Handle(raw_ptr()->sig_or_err_.signature_); | |
| 15824 if (obj.IsFunction()) { | |
| 15825 return Function::RawCast(obj.raw()); | |
| 15826 } | |
| 15827 ASSERT(obj.IsLanguageError()); // Type is malformed or malbounded. | |
| 15828 return Function::null(); | |
| 15829 } | |
| 15830 | |
| 15831 | |
| 15832 void Type::set_signature(const Function& value) const { | |
| 15833 StorePointer(&raw_ptr()->sig_or_err_.signature_, value.raw()); | |
| 15788 } | 15834 } |
| 15789 | 15835 |
| 15790 | 15836 |
| 15791 void Type::SetIsResolved() const { | 15837 void Type::SetIsResolved() const { |
| 15792 ASSERT(!IsResolved()); | 15838 ASSERT(!IsResolved()); |
| 15793 // A Typedef is a FunctionType, not a type. | |
| 15794 ASSERT(!Class::Handle(type_class()).IsTypedefClass()); | |
| 15795 set_type_state(RawType::kResolved); | 15839 set_type_state(RawType::kResolved); |
| 15796 } | 15840 } |
| 15797 | 15841 |
| 15798 | 15842 |
| 15799 bool Type::HasResolvedTypeClass() const { | 15843 bool Type::HasResolvedTypeClass() const { |
| 15800 const Object& type_class = Object::Handle(raw_ptr()->type_class_); | 15844 const Object& type_class = Object::Handle(raw_ptr()->type_class_); |
| 15801 return !type_class.IsNull() && type_class.IsClass(); | 15845 return !type_class.IsNull() && type_class.IsClass(); |
| 15802 } | 15846 } |
| 15803 | 15847 |
| 15804 | 15848 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15885 ASSERT(type_arguments.Length() == cls.NumTypeArguments()); | 15929 ASSERT(type_arguments.Length() == cls.NumTypeArguments()); |
| 15886 type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments, | 15930 type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments, |
| 15887 bound_error, | 15931 bound_error, |
| 15888 instantiation_trail, | 15932 instantiation_trail, |
| 15889 bound_trail, | 15933 bound_trail, |
| 15890 space); | 15934 space); |
| 15891 // This uninstantiated type is not modified, as it can be instantiated | 15935 // This uninstantiated type is not modified, as it can be instantiated |
| 15892 // with different instantiators. Allocate a new instantiated version of it. | 15936 // with different instantiators. Allocate a new instantiated version of it. |
| 15893 const Type& instantiated_type = | 15937 const Type& instantiated_type = |
| 15894 Type::Handle(zone, Type::New(cls, type_arguments, token_pos(), space)); | 15938 Type::Handle(zone, Type::New(cls, type_arguments, token_pos(), space)); |
| 15939 // Preserve the bound error if any. | |
| 15940 if (IsMalbounded()) { | |
| 15941 const LanguageError& bound_error = LanguageError::Handle(zone, error()); | |
| 15942 instantiated_type.set_error(bound_error); | |
| 15943 } | |
| 15944 // Preserve the signature if this type represents a function type. | |
| 15945 // Note that the types in the signature remain unchanged. They get indirectly | |
| 15946 // instantiated by instantiating the type arguments above. | |
| 15947 const Function& sig_fun = Function::Handle(zone, signature()); | |
| 15948 if (!sig_fun.IsNull()) { | |
| 15949 instantiated_type.set_signature(sig_fun); | |
| 15950 } | |
| 15895 if (IsFinalized()) { | 15951 if (IsFinalized()) { |
| 15896 instantiated_type.SetIsFinalized(); | 15952 instantiated_type.SetIsFinalized(); |
| 15897 } else { | 15953 } else { |
| 15898 instantiated_type.SetIsResolved(); | 15954 instantiated_type.SetIsResolved(); |
| 15899 } | 15955 } |
| 15900 // Canonicalization is not part of instantiation. | 15956 // Canonicalization is not part of instantiation. |
| 15901 return instantiated_type.raw(); | 15957 return instantiated_type.raw(); |
| 15902 } | 15958 } |
| 15903 | 15959 |
| 15904 | 15960 |
| 15905 bool Type::IsEquivalent(const Instance& other, TrailPtr trail) const { | 15961 bool Type::IsEquivalent(const Instance& other, TrailPtr trail) const { |
| 15906 ASSERT(!IsNull()); | 15962 ASSERT(!IsNull()); |
| 15907 if (raw() == other.raw()) { | 15963 if (raw() == other.raw()) { |
| 15908 return true; | 15964 return true; |
| 15909 } | 15965 } |
| 15910 if (other.IsTypeRef()) { | 15966 if (other.IsTypeRef()) { |
| 15911 // Unfold right hand type. Divergence is controlled by left hand type. | 15967 // Unfold right hand type. Divergence is controlled by left hand type. |
| 15912 const AbstractType& other_ref_type = AbstractType::Handle( | 15968 const AbstractType& other_ref_type = AbstractType::Handle( |
| 15913 TypeRef::Cast(other).type()); | 15969 TypeRef::Cast(other).type()); |
| 15914 ASSERT(!other_ref_type.IsTypeRef()); | 15970 ASSERT(!other_ref_type.IsTypeRef()); |
| 15915 return IsEquivalent(other_ref_type, trail); | 15971 return IsEquivalent(other_ref_type, trail); |
| 15916 } | 15972 } |
| 15917 if (!other.IsType()) { | 15973 if (!other.IsType()) { |
| 15918 return false; | 15974 return false; |
| 15919 } | 15975 } |
| 15920 const Type& other_type = Type::Cast(other); | 15976 const Type& other_type = Type::Cast(other); |
| 15977 if (IsFunctionType() != other_type.IsFunctionType()) { | |
| 15978 return false; | |
| 15979 } | |
| 15921 ASSERT(IsResolved() && other_type.IsResolved()); | 15980 ASSERT(IsResolved() && other_type.IsResolved()); |
| 15922 if (IsMalformed() || other_type.IsMalformed()) { | 15981 if (IsMalformed() || other_type.IsMalformed()) { |
| 15923 return false; | 15982 return false; // Malformed types do not get canonicalized. |
| 15983 } | |
| 15984 if (IsMalbounded() != other_type.IsMalbounded()) { | |
| 15985 return false; // Do not drop bound error. | |
| 15924 } | 15986 } |
| 15925 if (type_class() != other_type.type_class()) { | 15987 if (type_class() != other_type.type_class()) { |
| 15926 return false; | 15988 return false; |
| 15927 } | 15989 } |
| 15928 if (!IsFinalized() || !other_type.IsFinalized()) { | 15990 if (!IsFinalized() || !other_type.IsFinalized()) { |
| 15929 return false; | 15991 return false; // Too early to decide if equal. |
| 15930 } | 15992 } |
| 15931 if (arguments() == other_type.arguments()) { | 15993 if ((arguments() == other_type.arguments()) && |
| 15994 (signature() == other_type.signature())) { | |
| 15932 return true; | 15995 return true; |
| 15933 } | 15996 } |
| 15934 Thread* thread = Thread::Current(); | 15997 Thread* thread = Thread::Current(); |
| 15935 Zone* zone = thread->zone(); | 15998 Zone* zone = thread->zone(); |
| 15999 if (arguments() != other_type.arguments()) { | |
| 15936 const Class& cls = Class::Handle(zone, type_class()); | 16000 const Class& cls = Class::Handle(zone, type_class()); |
| 15937 const intptr_t num_type_params = cls.NumTypeParameters(thread); | 16001 const intptr_t num_type_params = cls.NumTypeParameters(thread); |
| 15938 if (num_type_params == 0) { | 16002 // Shortcut unnecessary handle allocation below if non-generic. |
| 15939 // Shortcut unnecessary handle allocation below. | 16003 if (num_type_params > 0) { |
| 16004 const intptr_t num_type_args = cls.NumTypeArguments(); | |
| 16005 const intptr_t from_index = num_type_args - num_type_params; | |
| 16006 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | |
| 16007 const TypeArguments& other_type_args = TypeArguments::Handle( | |
| 16008 zone, other_type.arguments()); | |
| 16009 if (type_args.IsNull()) { | |
| 16010 // Ignore from_index. | |
| 16011 if (!other_type_args.IsRaw(0, num_type_args)) { | |
| 16012 return false; | |
| 16013 } | |
| 16014 } else if (other_type_args.IsNull()) { | |
| 16015 // Ignore from_index. | |
| 16016 if (!type_args.IsRaw(0, num_type_args)) { | |
| 16017 return false; | |
| 16018 } | |
| 16019 } else if (!type_args.IsSubvectorEquivalent(other_type_args, | |
| 16020 from_index, | |
| 16021 num_type_params)) { | |
| 16022 return false; | |
| 16023 } | |
| 16024 #ifdef DEBUG | |
| 16025 if (from_index > 0) { | |
| 16026 // Verify that the type arguments of the super class match, since they | |
| 16027 // depend solely on the type parameters that were just verified to | |
| 16028 // match. | |
| 16029 ASSERT(type_args.Length() >= (from_index + num_type_params)); | |
| 16030 ASSERT(other_type_args.Length() >= (from_index + num_type_params)); | |
| 16031 AbstractType& type_arg = AbstractType::Handle(zone); | |
| 16032 AbstractType& other_type_arg = AbstractType::Handle(zone); | |
| 16033 for (intptr_t i = 0; i < from_index; i++) { | |
| 16034 type_arg = type_args.TypeAt(i); | |
| 16035 other_type_arg = other_type_args.TypeAt(i); | |
| 16036 // Ignore bounds of bounded types. | |
| 16037 while (type_arg.IsBoundedType()) { | |
| 16038 type_arg = BoundedType::Cast(type_arg).type(); | |
| 16039 } | |
| 16040 while (other_type_arg.IsBoundedType()) { | |
| 16041 other_type_arg = BoundedType::Cast(other_type_arg).type(); | |
| 16042 } | |
| 16043 ASSERT(type_arg.IsEquivalent(other_type_arg, trail)); | |
| 16044 } | |
| 16045 } | |
| 16046 #endif | |
| 16047 } | |
| 16048 } | |
| 16049 if (!IsFunctionType()) { | |
| 15940 return true; | 16050 return true; |
| 15941 } | 16051 } |
| 15942 const intptr_t num_type_args = cls.NumTypeArguments(); | 16052 ASSERT(Type::Cast(other).IsFunctionType()); |
| 15943 const intptr_t from_index = num_type_args - num_type_params; | 16053 // Equal function types must have equal signature types and equal optional |
| 15944 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | 16054 // named arguments. |
| 15945 const TypeArguments& other_type_args = TypeArguments::Handle( | 16055 if (signature() == other_type.signature()) { |
| 15946 zone, other_type.arguments()); | 16056 return true; |
| 15947 if (type_args.IsNull()) { | |
| 15948 // Ignore from_index. | |
| 15949 return other_type_args.IsRaw(0, num_type_args); | |
| 15950 } | 16057 } |
| 15951 if (other_type_args.IsNull()) { | 16058 const Function& sig_fun = Function::Handle(zone, signature()); |
| 15952 // Ignore from_index. | 16059 const Function& other_sig_fun = Function::Handle( |
| 15953 return type_args.IsRaw(0, num_type_args); | 16060 zone, other_type.signature()); |
| 15954 } | 16061 |
| 15955 if (!type_args.IsSubvectorEquivalent(other_type_args, | 16062 // Compare number of function parameters. |
| 15956 from_index, | 16063 const intptr_t num_fixed_params = sig_fun.num_fixed_parameters(); |
| 15957 num_type_params)) { | 16064 const intptr_t other_num_fixed_params = other_sig_fun.num_fixed_parameters(); |
| 16065 if (num_fixed_params != other_num_fixed_params) { | |
| 15958 return false; | 16066 return false; |
| 15959 } | 16067 } |
| 15960 #ifdef DEBUG | 16068 const intptr_t num_opt_pos_params = sig_fun.NumOptionalPositionalParameters(); |
| 15961 if (from_index > 0) { | 16069 const intptr_t other_num_opt_pos_params = |
| 15962 // Verify that the type arguments of the super class match, since they | 16070 other_sig_fun.NumOptionalPositionalParameters(); |
| 15963 // depend solely on the type parameters that were just verified to match. | 16071 if (num_opt_pos_params != other_num_opt_pos_params) { |
| 15964 ASSERT(type_args.Length() >= (from_index + num_type_params)); | 16072 return false; |
| 15965 ASSERT(other_type_args.Length() >= (from_index + num_type_params)); | 16073 } |
| 15966 AbstractType& type_arg = AbstractType::Handle(zone); | 16074 const intptr_t num_opt_named_params = sig_fun.NumOptionalNamedParameters(); |
| 15967 AbstractType& other_type_arg = AbstractType::Handle(zone); | 16075 const intptr_t other_num_opt_named_params = |
| 15968 for (intptr_t i = 0; i < from_index; i++) { | 16076 other_sig_fun.NumOptionalNamedParameters(); |
| 15969 type_arg = type_args.TypeAt(i); | 16077 if (num_opt_named_params != other_num_opt_named_params) { |
| 15970 other_type_arg = other_type_args.TypeAt(i); | 16078 return false; |
| 15971 // Ignore bounds of bounded types. | 16079 } |
| 15972 while (type_arg.IsBoundedType()) { | 16080 const intptr_t num_ignored_params = sig_fun.NumImplicitParameters(); |
| 15973 type_arg = BoundedType::Cast(type_arg).type(); | 16081 const intptr_t other_num_ignored_params = |
| 15974 } | 16082 other_sig_fun.NumImplicitParameters(); |
| 15975 while (other_type_arg.IsBoundedType()) { | 16083 if (num_ignored_params != other_num_ignored_params) { |
| 15976 other_type_arg = BoundedType::Cast(other_type_arg).type(); | 16084 return false; |
| 15977 } | 16085 } |
| 15978 ASSERT(type_arg.IsEquivalent(other_type_arg, trail)); | 16086 AbstractType& param_type = Type::Handle(zone); |
| 16087 AbstractType& other_param_type = Type::Handle(zone); | |
| 16088 // Check the result type. | |
| 16089 param_type = sig_fun.result_type(); | |
| 16090 other_param_type = other_sig_fun.result_type(); | |
| 16091 if (!param_type.Equals(other_param_type)) { | |
| 16092 return false; | |
| 16093 } | |
| 16094 // Check the types of all parameters. | |
| 16095 const intptr_t num_params = sig_fun.NumParameters(); | |
| 16096 ASSERT(other_sig_fun.NumParameters() == num_params); | |
| 16097 for (intptr_t i = 0; i < num_params; i++) { | |
| 16098 param_type = sig_fun.ParameterTypeAt(i); | |
| 16099 other_param_type = other_sig_fun.ParameterTypeAt(i); | |
| 16100 if (!param_type.Equals(other_param_type)) { | |
| 16101 return false; | |
| 15979 } | 16102 } |
| 15980 } | 16103 } |
| 15981 #endif | 16104 // Check the names and types of optional named parameters. |
| 16105 if (num_opt_named_params == 0) { | |
| 16106 return true; | |
| 16107 } | |
| 16108 for (intptr_t i = num_fixed_params; i < num_params; i++) { | |
| 16109 if (sig_fun.ParameterNameAt(i) != other_sig_fun.ParameterNameAt(i)) { | |
| 16110 return false; | |
| 16111 } | |
| 16112 } | |
| 15982 return true; | 16113 return true; |
| 15983 } | 16114 } |
| 15984 | 16115 |
| 15985 | |
|
hausner
2016/03/21 20:59:17
Nit: keep this empty line.
regis
2016/03/21 21:07:09
Done.
| |
| 15986 bool Type::IsRecursive() const { | 16116 bool Type::IsRecursive() const { |
| 15987 return TypeArguments::Handle(arguments()).IsRecursive(); | 16117 return TypeArguments::Handle(arguments()).IsRecursive(); |
| 15988 } | 16118 } |
| 15989 | 16119 |
| 15990 | 16120 |
| 15991 RawAbstractType* Type::CloneUnfinalized() const { | 16121 RawAbstractType* Type::CloneUnfinalized() const { |
| 15992 ASSERT(IsResolved()); | 16122 ASSERT(IsResolved()); |
| 15993 if (IsFinalized()) { | 16123 if (IsFinalized()) { |
| 15994 return raw(); | 16124 return raw(); |
| 15995 } | 16125 } |
| 15996 ASSERT(!IsMalformed()); // Malformed types are finalized. | 16126 ASSERT(!IsMalformed()); // Malformed types are finalized. |
| 15997 ASSERT(!IsBeingFinalized()); // Cloning must occur prior to finalization. | 16127 ASSERT(!IsBeingFinalized()); // Cloning must occur prior to finalization. |
| 15998 TypeArguments& type_args = TypeArguments::Handle(arguments()); | 16128 Zone* zone = Thread::Current()->zone(); |
| 15999 type_args = type_args.CloneUnfinalized(); | 16129 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); |
| 16000 const Type& clone = Type::Handle( | 16130 const TypeArguments& type_args_clone = |
| 16001 Type::New(Class::Handle(type_class()), type_args, token_pos())); | 16131 TypeArguments::Handle(zone, type_args.CloneUnfinalized()); |
| 16132 if (type_args_clone.raw() == type_args.raw()) { | |
| 16133 return raw(); | |
| 16134 } | |
| 16135 const Type& clone = Type::Handle(zone, | |
| 16136 Type::New(Class::Handle(zone, type_class()), type_args, token_pos())); | |
| 16137 // Preserve the bound error if any. | |
| 16138 if (IsMalbounded()) { | |
| 16139 const LanguageError& bound_error = LanguageError::Handle(zone, error()); | |
| 16140 clone.set_error(bound_error); | |
| 16141 } | |
| 16142 // Clone the signature if this type represents a function type. | |
| 16143 Function& fun = Function::Handle(zone, signature()); | |
| 16144 if (!fun.IsNull()) { | |
| 16145 const Class& owner = Class::Handle(zone, fun.Owner()); | |
| 16146 Function& fun_clone = Function::Handle(zone, | |
| 16147 Function::NewSignatureFunction(owner, TokenPosition::kNoSource)); | |
| 16148 AbstractType& type = AbstractType::Handle(zone, fun.result_type()); | |
| 16149 type = type.CloneUnfinalized(); | |
| 16150 fun_clone.set_result_type(type); | |
| 16151 const intptr_t num_params = fun.NumParameters(); | |
| 16152 fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters()); | |
| 16153 fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(), | |
| 16154 fun.HasOptionalPositionalParameters()); | |
| 16155 fun_clone.set_parameter_types(Array::Handle(Array::New(num_params, | |
| 16156 Heap::kOld))); | |
| 16157 for (intptr_t i = 0; i < num_params; i++) { | |
| 16158 type = fun.ParameterTypeAt(i); | |
| 16159 type = type.CloneUnfinalized(); | |
| 16160 fun_clone.SetParameterTypeAt(i, type); | |
| 16161 } | |
| 16162 fun_clone.set_parameter_names(Array::Handle(zone, fun.parameter_names())); | |
| 16163 clone.set_signature(fun_clone); | |
| 16164 } | |
| 16002 clone.SetIsResolved(); | 16165 clone.SetIsResolved(); |
| 16003 return clone.raw(); | 16166 return clone.raw(); |
| 16004 } | 16167 } |
| 16005 | 16168 |
| 16006 | 16169 |
| 16007 RawAbstractType* Type::CloneUninstantiated(const Class& new_owner, | 16170 RawAbstractType* Type::CloneUninstantiated(const Class& new_owner, |
| 16008 TrailPtr trail) const { | 16171 TrailPtr trail) const { |
| 16009 ASSERT(IsFinalized()); | 16172 ASSERT(IsFinalized()); |
| 16010 ASSERT(!IsMalformed()); | 16173 ASSERT(!IsMalformed()); |
| 16011 if (IsInstantiated()) { | 16174 if (IsInstantiated()) { |
| 16012 return raw(); | 16175 return raw(); |
| 16013 } | 16176 } |
| 16014 // We may recursively encounter a type already being cloned, because we clone | 16177 // We may recursively encounter a type already being cloned, because we clone |
| 16015 // the upper bounds of its uninstantiated type arguments in the same pass. | 16178 // the upper bounds of its uninstantiated type arguments in the same pass. |
| 16016 Type& clone = Type::Handle(); | 16179 Zone* zone = Thread::Current()->zone(); |
| 16180 Type& clone = Type::Handle(zone); | |
| 16017 clone ^= OnlyBuddyInTrail(trail); | 16181 clone ^= OnlyBuddyInTrail(trail); |
| 16018 if (!clone.IsNull()) { | 16182 if (!clone.IsNull()) { |
| 16019 return clone.raw(); | 16183 return clone.raw(); |
| 16020 } | 16184 } |
| 16021 const Class& type_cls = Class::Handle(type_class()); | 16185 const Class& type_cls = Class::Handle(zone, type_class()); |
| 16022 clone = Type::New(type_cls, TypeArguments::Handle(), token_pos()); | 16186 clone = Type::New(type_cls, TypeArguments::Handle(zone), token_pos()); |
| 16023 TypeArguments& type_args = TypeArguments::Handle(arguments()); | 16187 // Preserve the bound error if any. |
| 16188 if (IsMalbounded()) { | |
| 16189 const LanguageError& bound_error = LanguageError::Handle(zone, error()); | |
| 16190 clone.set_error(bound_error); | |
| 16191 } | |
| 16192 // Clone the signature if this type represents a function type. | |
| 16193 const Function& fun = Function::Handle(zone, signature()); | |
| 16194 if (!fun.IsNull()) { | |
| 16195 Function& fun_clone = Function::Handle(zone, | |
| 16196 Function::NewSignatureFunction(new_owner, TokenPosition::kNoSource)); | |
| 16197 AbstractType& type = AbstractType::Handle(zone, fun.result_type()); | |
| 16198 type = type.CloneUninstantiated(new_owner, trail); | |
| 16199 fun_clone.set_result_type(type); | |
| 16200 const intptr_t num_params = fun.NumParameters(); | |
| 16201 fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters()); | |
| 16202 fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(), | |
| 16203 fun.HasOptionalPositionalParameters()); | |
| 16204 fun_clone.set_parameter_types(Array::Handle(Array::New(num_params, | |
| 16205 Heap::kOld))); | |
| 16206 for (intptr_t i = 0; i < num_params; i++) { | |
| 16207 type = fun.ParameterTypeAt(i); | |
| 16208 type = type.CloneUninstantiated(new_owner, trail); | |
| 16209 fun_clone.SetParameterTypeAt(i, type); | |
| 16210 } | |
| 16211 fun_clone.set_parameter_names(Array::Handle(zone, fun.parameter_names())); | |
| 16212 clone.set_signature(fun_clone); | |
| 16213 } | |
| 16214 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | |
| 16024 // Upper bounds of uninstantiated type arguments may form a cycle. | 16215 // Upper bounds of uninstantiated type arguments may form a cycle. |
| 16025 if (type_args.IsRecursive() || !type_args.IsInstantiated()) { | 16216 if (type_args.IsRecursive() || !type_args.IsInstantiated()) { |
| 16026 AddOnlyBuddyToTrail(&trail, clone); | 16217 AddOnlyBuddyToTrail(&trail, clone); |
| 16027 } | 16218 } |
| 16028 type_args = type_args.CloneUninstantiated(new_owner, trail); | 16219 type_args = type_args.CloneUninstantiated(new_owner, trail); |
| 16029 clone.set_arguments(type_args); | 16220 clone.set_arguments(type_args); |
| 16030 clone.SetIsFinalized(); | 16221 clone.SetIsFinalized(); |
| 16031 return clone.raw(); | 16222 return clone.raw(); |
| 16032 } | 16223 } |
| 16033 | 16224 |
| 16034 | 16225 |
| 16035 RawAbstractType* Type::Canonicalize(TrailPtr trail) const { | 16226 RawAbstractType* Type::Canonicalize(TrailPtr trail) const { |
| 16036 ASSERT(IsFinalized()); | 16227 ASSERT(IsFinalized()); |
| 16037 if (IsCanonical() || IsMalformed()) { | 16228 if (IsCanonical() || IsMalformed()) { |
| 16038 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); | 16229 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); |
| 16039 return this->raw(); | 16230 return this->raw(); |
| 16040 } | 16231 } |
| 16041 Thread* thread = Thread::Current(); | 16232 Thread* thread = Thread::Current(); |
| 16042 Zone* zone = thread->zone(); | 16233 Zone* zone = thread->zone(); |
| 16043 Isolate* isolate = thread->isolate(); | 16234 Isolate* isolate = thread->isolate(); |
| 16044 AbstractType& type = Type::Handle(zone); | 16235 AbstractType& type = Type::Handle(zone); |
| 16045 const Class& cls = Class::Handle(zone, type_class()); | 16236 const Class& cls = Class::Handle(zone, type_class()); |
| 16046 ASSERT(!cls.IsTypedefClass()); // This type should be a FunctionType. | |
| 16047 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { | 16237 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { |
| 16048 return Object::dynamic_type().raw(); | 16238 return Object::dynamic_type().raw(); |
| 16049 } | 16239 } |
| 16050 // Fast canonical lookup/registry for simple types. | 16240 // Fast canonical lookup/registry for simple types. |
| 16051 if (!cls.IsGeneric() && !cls.IsClosureClass()) { | 16241 if (!cls.IsGeneric() && !cls.IsClosureClass()) { |
| 16242 ASSERT(!IsFunctionType() || cls.IsTypedefClass()); | |
| 16052 type = cls.CanonicalType(); | 16243 type = cls.CanonicalType(); |
| 16053 if (type.IsNull()) { | 16244 if (type.IsNull()) { |
| 16054 ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate())); | 16245 ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate())); |
| 16055 // Canonicalize the type arguments of the supertype, if any. | 16246 // Canonicalize the type arguments of the supertype, if any. |
| 16056 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | 16247 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); |
| 16057 type_args = type_args.Canonicalize(trail); | 16248 type_args = type_args.Canonicalize(trail); |
| 16058 if (IsCanonical()) { | 16249 if (IsCanonical()) { |
| 16059 // Canonicalizing type_args canonicalized this type. | 16250 // Canonicalizing type_args canonicalized this type. |
| 16060 ASSERT(IsRecursive()); | 16251 ASSERT(IsRecursive()); |
| 16061 return this->raw(); | 16252 return this->raw(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16105 | 16296 |
| 16106 // Canonicalize the type arguments. | 16297 // Canonicalize the type arguments. |
| 16107 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | 16298 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); |
| 16108 // In case the type is first canonicalized at runtime, its type argument | 16299 // In case the type is first canonicalized at runtime, its type argument |
| 16109 // vector may be longer than necessary. This is not an issue. | 16300 // vector may be longer than necessary. This is not an issue. |
| 16110 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); | 16301 ASSERT(type_args.IsNull() || (type_args.Length() >= cls.NumTypeArguments())); |
| 16111 type_args = type_args.Canonicalize(trail); | 16302 type_args = type_args.Canonicalize(trail); |
| 16112 if (IsCanonical()) { | 16303 if (IsCanonical()) { |
| 16113 // Canonicalizing type_args canonicalized this type as a side effect. | 16304 // Canonicalizing type_args canonicalized this type as a side effect. |
| 16114 ASSERT(IsRecursive()); | 16305 ASSERT(IsRecursive()); |
| 16306 // Cycles via typedefs are detected and disallowed, but a function type can | |
| 16307 // be recursive due to a cycle in its type arguments. | |
| 16115 return this->raw(); | 16308 return this->raw(); |
| 16116 } | 16309 } |
| 16117 set_arguments(type_args); | 16310 set_arguments(type_args); |
| 16118 ASSERT(type_args.IsNull() || type_args.IsOld()); | 16311 ASSERT(type_args.IsNull() || type_args.IsOld()); |
| 16119 | 16312 |
| 16313 // In case of a function type, replace the actual function by a signature | |
| 16314 // function. | |
| 16315 if (IsFunctionType()) { | |
| 16316 const Function& fun = Function::Handle(zone, signature()); | |
| 16317 if (!fun.IsSignatureFunction()) { | |
| 16318 Function& sig_fun = Function::Handle(zone, | |
| 16319 Function::NewSignatureFunction(cls, TokenPosition::kNoSource)); | |
| 16320 type = fun.result_type(); | |
| 16321 type = type.Canonicalize(trail); | |
| 16322 sig_fun.set_result_type(type); | |
| 16323 const intptr_t num_params = fun.NumParameters(); | |
| 16324 sig_fun.set_num_fixed_parameters(fun.num_fixed_parameters()); | |
| 16325 sig_fun.SetNumOptionalParameters(fun.NumOptionalParameters(), | |
| 16326 fun.HasOptionalPositionalParameters()); | |
| 16327 sig_fun.set_parameter_types(Array::Handle(Array::New(num_params, | |
| 16328 Heap::kOld))); | |
| 16329 for (intptr_t i = 0; i < num_params; i++) { | |
| 16330 type = fun.ParameterTypeAt(i); | |
| 16331 type = type.Canonicalize(trail); | |
| 16332 sig_fun.SetParameterTypeAt(i, type); | |
| 16333 } | |
| 16334 sig_fun.set_parameter_names(Array::Handle(zone, fun.parameter_names())); | |
| 16335 set_signature(sig_fun); | |
| 16336 } | |
| 16337 } | |
| 16120 return cls.LookupOrAddCanonicalType(*this, index); | 16338 return cls.LookupOrAddCanonicalType(*this, index); |
| 16121 } | 16339 } |
| 16122 | 16340 |
| 16123 | 16341 |
| 16124 RawString* Type::EnumerateURIs() const { | 16342 RawString* Type::EnumerateURIs() const { |
| 16125 if (IsDynamicType() || IsVoidType()) { | 16343 if (IsDynamicType() || IsVoidType()) { |
| 16126 return Symbols::Empty().raw(); | 16344 return Symbols::Empty().raw(); |
| 16127 } | 16345 } |
| 16128 Zone* zone = Thread::Current()->zone(); | 16346 Zone* zone = Thread::Current()->zone(); |
| 16129 GrowableHandlePtrArray<const String> pieces(zone, 6); | 16347 GrowableHandlePtrArray<const String> pieces(zone, 6); |
| 16130 const Class& cls = Class::Handle(zone, type_class()); | 16348 if (IsFunctionType()) { |
| 16131 pieces.Add(Symbols::TwoSpaces()); | 16349 // The scope class and type arguments do not appear explicitly in the user |
| 16132 pieces.Add(String::Handle(zone, cls.UserVisibleName())); | 16350 // visible name. The type arguments were used to instantiate the function |
| 16133 pieces.Add(Symbols::SpaceIsFromSpace()); | 16351 // type prior to this call. |
| 16134 const Library& library = Library::Handle(zone, cls.library()); | 16352 const Function& sig_fun = Function::Handle(zone, signature()); |
| 16135 pieces.Add(String::Handle(zone, library.url())); | 16353 AbstractType& type = AbstractType::Handle(zone); |
| 16136 pieces.Add(Symbols::NewLine()); | 16354 const intptr_t num_params = sig_fun.NumParameters(); |
| 16137 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | 16355 GrowableHandlePtrArray<const String> pieces(zone, num_params + 1); |
| 16138 pieces.Add(String::Handle(zone, type_args.EnumerateURIs())); | 16356 for (intptr_t i = 0; i < num_params; i++) { |
| 16357 type = sig_fun.ParameterTypeAt(i); | |
| 16358 pieces.Add(String::Handle(zone, type.EnumerateURIs())); | |
| 16359 } | |
| 16360 // Handle result type last, since it appears last in the user visible name. | |
| 16361 type = sig_fun.result_type(); | |
| 16362 pieces.Add(String::Handle(zone, type.EnumerateURIs())); | |
| 16363 } else { | |
| 16364 const Class& cls = Class::Handle(zone, type_class()); | |
| 16365 pieces.Add(Symbols::TwoSpaces()); | |
| 16366 pieces.Add(String::Handle(zone, cls.UserVisibleName())); | |
| 16367 pieces.Add(Symbols::SpaceIsFromSpace()); | |
| 16368 const Library& library = Library::Handle(zone, cls.library()); | |
| 16369 pieces.Add(String::Handle(zone, library.url())); | |
| 16370 pieces.Add(Symbols::NewLine()); | |
| 16371 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | |
| 16372 pieces.Add(String::Handle(zone, type_args.EnumerateURIs())); | |
| 16373 } | |
| 16139 return Symbols::FromConcatAll(pieces); | 16374 return Symbols::FromConcatAll(pieces); |
| 16140 } | 16375 } |
| 16141 | 16376 |
| 16142 | 16377 |
| 16143 intptr_t Type::Hash() const { | 16378 intptr_t Type::Hash() const { |
| 16144 ASSERT(IsFinalized()); | 16379 ASSERT(IsFinalized()); |
| 16145 uint32_t result = 1; | 16380 uint32_t result = 1; |
| 16146 if (IsMalformed()) return result; | 16381 if (IsMalformed()) return result; |
| 16147 result = CombineHashes(result, Class::Handle(type_class()).id()); | 16382 result = CombineHashes(result, Class::Handle(type_class()).id()); |
| 16148 result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash()); | 16383 result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash()); |
| 16384 if (IsFunctionType()) { | |
| 16385 const Function& sig_fun = Function::Handle(signature()); | |
| 16386 AbstractType& type = AbstractType::Handle(sig_fun.result_type()); | |
| 16387 result = CombineHashes(result, type.Hash()); | |
| 16388 result = CombineHashes(result, sig_fun.NumOptionalPositionalParameters()); | |
| 16389 const intptr_t num_params = sig_fun.NumParameters(); | |
| 16390 for (intptr_t i = 0; i < num_params; i++) { | |
| 16391 type = sig_fun.ParameterTypeAt(i); | |
| 16392 result = CombineHashes(result, type.Hash()); | |
| 16393 } | |
| 16394 if (sig_fun.NumOptionalNamedParameters() > 0) { | |
| 16395 String& param_name = String::Handle(); | |
| 16396 for (intptr_t i = sig_fun.num_fixed_parameters(); i < num_params; i++) { | |
| 16397 param_name = sig_fun.ParameterNameAt(i); | |
| 16398 result = CombineHashes(result, param_name.Hash()); | |
| 16399 } | |
| 16400 } | |
| 16401 } | |
| 16149 return FinalizeHash(result); | 16402 return FinalizeHash(result); |
| 16150 } | 16403 } |
| 16151 | 16404 |
| 16152 | 16405 |
| 16153 void Type::set_type_class(const Object& value) const { | 16406 void Type::set_type_class(const Object& value) const { |
| 16154 ASSERT(!value.IsNull() && (value.IsClass() || value.IsUnresolvedClass())); | 16407 ASSERT(!value.IsNull() && (value.IsClass() || value.IsUnresolvedClass())); |
| 16155 StorePointer(&raw_ptr()->type_class_, value.raw()); | 16408 StorePointer(&raw_ptr()->type_class_, value.raw()); |
| 16156 } | 16409 } |
| 16157 | 16410 |
| 16158 | 16411 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16190 | 16443 |
| 16191 | 16444 |
| 16192 void Type::set_type_state(int8_t state) const { | 16445 void Type::set_type_state(int8_t state) const { |
| 16193 ASSERT((state >= RawType::kAllocated) && | 16446 ASSERT((state >= RawType::kAllocated) && |
| 16194 (state <= RawType::kFinalizedUninstantiated)); | 16447 (state <= RawType::kFinalizedUninstantiated)); |
| 16195 StoreNonPointer(&raw_ptr()->type_state_, state); | 16448 StoreNonPointer(&raw_ptr()->type_state_, state); |
| 16196 } | 16449 } |
| 16197 | 16450 |
| 16198 | 16451 |
| 16199 const char* Type::ToCString() const { | 16452 const char* Type::ToCString() const { |
| 16453 Zone* zone = Thread::Current()->zone(); | |
| 16200 const char* unresolved = IsResolved() ? "" : "Unresolved "; | 16454 const char* unresolved = IsResolved() ? "" : "Unresolved "; |
| 16201 const TypeArguments& type_arguments = TypeArguments::Handle(arguments()); | 16455 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); |
| 16456 const char* args_cstr = type_args.IsNull() ? "null" : type_args.ToCString(); | |
| 16457 Class& cls = Class::Handle(zone); | |
| 16202 const char* class_name; | 16458 const char* class_name; |
| 16203 if (HasResolvedTypeClass()) { | 16459 if (HasResolvedTypeClass()) { |
| 16204 class_name = String::Handle( | 16460 cls = type_class(); |
| 16205 Class::Handle(type_class()).Name()).ToCString(); | 16461 class_name = String::Handle(zone, cls.Name()).ToCString(); |
| 16206 } else { | 16462 } else { |
| 16207 class_name = UnresolvedClass::Handle(unresolved_class()).ToCString(); | 16463 class_name = UnresolvedClass::Handle(zone, unresolved_class()).ToCString(); |
| 16208 } | 16464 } |
| 16209 if (type_arguments.IsNull()) { | 16465 if (IsFunctionType()) { |
| 16210 return OS::SCreate(Thread::Current()->zone(), | 16466 const Function& sig_fun = Function::Handle(zone, signature()); |
| 16211 "%sType: class '%s'", unresolved, class_name); | 16467 const String& sig = IsFinalized() ? |
| 16468 String::Handle(zone, sig_fun.InstantiatedSignatureFrom(type_args, | |
| 16469 kInternalName)) : | |
| 16470 String::Handle(zone, sig_fun.Signature()); | |
| 16471 if (cls.IsClosureClass()) { | |
| 16472 ASSERT(type_args.IsNull()); | |
| 16473 return OS::SCreate(zone, "%sFunction Type: %s", | |
| 16474 unresolved, sig.ToCString()); | |
| 16475 } | |
| 16476 return OS::SCreate(zone, "%s Function Type: %s (class: %s, args: %s)", | |
| 16477 unresolved, | |
| 16478 sig.ToCString(), | |
| 16479 class_name, | |
| 16480 args_cstr); | |
| 16481 } | |
| 16482 if (type_args.IsNull()) { | |
| 16483 return OS::SCreate(zone, "%sType: class '%s'", unresolved, class_name); | |
| 16212 } else if (IsResolved() && IsFinalized() && IsRecursive()) { | 16484 } else if (IsResolved() && IsFinalized() && IsRecursive()) { |
| 16213 const intptr_t hash = Hash(); | 16485 const intptr_t hash = Hash(); |
| 16214 const char* args_cstr = TypeArguments::Handle(arguments()).ToCString(); | 16486 return OS::SCreate(zone, "Type: (@%p H%" Px ") class '%s', args:[%s]", |
| 16215 return OS::SCreate(Thread::Current()->zone(), | 16487 raw(), hash, class_name, args_cstr); |
| 16216 "Type: (@%p H%" Px ") class '%s', args:[%s]", | |
| 16217 raw(), hash, class_name, args_cstr); | |
| 16218 } else { | 16488 } else { |
| 16219 const char* args_cstr = TypeArguments::Handle(arguments()).ToCString(); | 16489 return OS::SCreate(zone, "%sType: class '%s', args:[%s]", |
| 16220 return OS::SCreate(Thread::Current()->zone(), | 16490 unresolved, class_name, args_cstr); |
| 16221 "%sType: class '%s', args:[%s]", unresolved, class_name, args_cstr); | |
| 16222 } | 16491 } |
| 16223 } | 16492 } |
| 16224 | 16493 |
| 16225 | 16494 |
| 16226 void FunctionType::SetIsFinalized() const { | |
| 16227 ASSERT(!IsFinalized()); | |
| 16228 if (IsInstantiated()) { | |
| 16229 set_type_state(RawFunctionType::kFinalizedInstantiated); | |
| 16230 } else { | |
| 16231 set_type_state(RawFunctionType::kFinalizedUninstantiated); | |
| 16232 } | |
| 16233 } | |
| 16234 | |
| 16235 | |
| 16236 void FunctionType::ResetIsFinalized() const { | |
| 16237 ASSERT(IsFinalized()); | |
| 16238 set_type_state(RawFunctionType::kBeingFinalized); | |
| 16239 SetIsFinalized(); | |
| 16240 } | |
| 16241 | |
| 16242 | |
| 16243 void FunctionType::SetIsBeingFinalized() const { | |
| 16244 ASSERT(IsResolved() && !IsFinalized() && !IsBeingFinalized()); | |
| 16245 set_type_state(RawFunctionType::kBeingFinalized); | |
| 16246 } | |
| 16247 | |
| 16248 | |
| 16249 bool FunctionType::IsMalformed() const { | |
| 16250 if (raw_ptr()->error_ == LanguageError::null()) { | |
| 16251 return false; | |
| 16252 } | |
| 16253 const LanguageError& type_error = LanguageError::Handle(error()); | |
| 16254 return type_error.kind() == Report::kMalformedType; | |
| 16255 } | |
| 16256 | |
| 16257 | |
| 16258 bool FunctionType::IsMalbounded() const { | |
| 16259 if (!Isolate::Current()->type_checks()) { | |
| 16260 return false; | |
| 16261 } | |
| 16262 if (raw_ptr()->error_ == LanguageError::null()) { | |
| 16263 return false; | |
| 16264 } | |
| 16265 const LanguageError& type_error = LanguageError::Handle(error()); | |
| 16266 return type_error.kind() == Report::kMalboundedType; | |
| 16267 } | |
| 16268 | |
| 16269 | |
| 16270 bool FunctionType::IsMalformedOrMalbounded() const { | |
| 16271 if (raw_ptr()->error_ == LanguageError::null()) { | |
| 16272 return false; | |
| 16273 } | |
| 16274 const LanguageError& type_error = LanguageError::Handle(error()); | |
| 16275 if (type_error.kind() == Report::kMalformedType) { | |
| 16276 return true; | |
| 16277 } | |
| 16278 ASSERT(type_error.kind() == Report::kMalboundedType); | |
| 16279 return Isolate::Current()->type_checks(); | |
| 16280 } | |
| 16281 | |
| 16282 | |
| 16283 void FunctionType::set_error(const LanguageError& value) const { | |
| 16284 StorePointer(&raw_ptr()->error_, value.raw()); | |
| 16285 } | |
| 16286 | |
| 16287 | |
| 16288 void FunctionType::SetIsResolved() const { | |
| 16289 ASSERT(!IsResolved()); | |
| 16290 set_type_state(RawFunctionType::kResolved); | |
| 16291 } | |
| 16292 | |
| 16293 | |
| 16294 bool FunctionType::IsInstantiated(TrailPtr trail) const { | |
| 16295 if (raw_ptr()->type_state_ == RawFunctionType::kFinalizedInstantiated) { | |
| 16296 return true; | |
| 16297 } | |
| 16298 if (raw_ptr()->type_state_ == RawFunctionType::kFinalizedUninstantiated) { | |
| 16299 return false; | |
| 16300 } | |
| 16301 if (arguments() == TypeArguments::null()) { | |
| 16302 return true; | |
| 16303 } | |
| 16304 const Class& scope_cls = Class::Handle(scope_class()); | |
| 16305 if (!scope_cls.IsGeneric()) { | |
| 16306 ASSERT(scope_cls.IsClosureClass() || scope_cls.IsTypedefClass()); | |
| 16307 ASSERT(arguments() == TypeArguments::null()); | |
| 16308 return true; | |
| 16309 } | |
| 16310 const TypeArguments& type_arguments = TypeArguments::Handle(arguments()); | |
| 16311 const intptr_t num_type_args = scope_cls.NumTypeArguments(); | |
| 16312 const intptr_t num_type_params = scope_cls.NumTypeParameters(); | |
| 16313 // The vector may be longer than necessary. An empty vector is handled above. | |
| 16314 ASSERT(type_arguments.Length() >= num_type_args); | |
| 16315 return | |
| 16316 (num_type_params == 0) || | |
| 16317 type_arguments.IsSubvectorInstantiated(num_type_args - num_type_params, | |
| 16318 num_type_params); | |
| 16319 } | |
| 16320 | |
| 16321 | |
| 16322 RawAbstractType* FunctionType::InstantiateFrom( | |
| 16323 const TypeArguments& instantiator_type_arguments, | |
| 16324 Error* bound_error, | |
| 16325 TrailPtr instantiation_trail, | |
| 16326 TrailPtr bound_trail, | |
| 16327 Heap::Space space) const { | |
| 16328 Zone* zone = Thread::Current()->zone(); | |
| 16329 ASSERT(IsFinalized() || IsBeingFinalized()); | |
| 16330 ASSERT(!IsInstantiated()); | |
| 16331 ASSERT(!IsMalformed()); // FunctionType cannot be malformed. | |
| 16332 // Instantiating this type with its own type arguments as instantiator can | |
| 16333 // occur during finalization and bounds checking. Return the type unchanged. | |
| 16334 if (arguments() == instantiator_type_arguments.raw()) { | |
| 16335 return raw(); | |
| 16336 } | |
| 16337 // Note that the scope class has to be resolved at this time, but not | |
| 16338 // necessarily finalized yet. We may be checking bounds at compile time or | |
| 16339 // finalizing the type argument vector of a recursive type. | |
| 16340 const Class& cls = Class::Handle(zone, scope_class()); | |
| 16341 TypeArguments& type_arguments = TypeArguments::Handle(zone, arguments()); | |
| 16342 ASSERT(type_arguments.Length() == cls.NumTypeArguments()); | |
| 16343 type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments, | |
| 16344 bound_error, | |
| 16345 instantiation_trail, | |
| 16346 bound_trail, | |
| 16347 space); | |
| 16348 // This uninstantiated type is not modified, as it can be instantiated | |
| 16349 // with different instantiators. Allocate a new instantiated version of it. | |
| 16350 const FunctionType& instantiated_type = FunctionType::Handle(zone, | |
| 16351 FunctionType::New(cls, | |
| 16352 type_arguments, | |
| 16353 Function::Handle(zone, signature()), | |
| 16354 token_pos(), | |
| 16355 space)); | |
| 16356 if (IsFinalized()) { | |
| 16357 instantiated_type.SetIsFinalized(); | |
| 16358 } else { | |
| 16359 instantiated_type.SetIsResolved(); | |
| 16360 } | |
| 16361 // Canonicalization is not part of instantiation. | |
| 16362 return instantiated_type.raw(); | |
| 16363 } | |
| 16364 | |
| 16365 | |
| 16366 bool FunctionType::IsEquivalent(const Instance& other, TrailPtr trail) const { | |
| 16367 ASSERT(!IsNull()); | |
| 16368 if (raw() == other.raw()) { | |
| 16369 return true; | |
| 16370 } | |
| 16371 if (!other.IsFunctionType()) { | |
| 16372 return false; | |
| 16373 } | |
| 16374 const FunctionType& other_type = FunctionType::Cast(other); | |
| 16375 ASSERT(IsResolved() && other_type.IsResolved()); | |
| 16376 if (IsMalformed() || other_type.IsMalformed()) { | |
| 16377 return false; | |
| 16378 } | |
| 16379 if (scope_class() != other_type.scope_class()) { | |
| 16380 return false; | |
| 16381 } | |
| 16382 if ((arguments() == other_type.arguments()) && | |
| 16383 (signature() == other_type.signature())) { | |
| 16384 return true; | |
| 16385 } | |
| 16386 if (!IsFinalized() || !other_type.IsFinalized()) { | |
| 16387 return false; | |
| 16388 } | |
| 16389 | |
| 16390 // We do not instantiate the types of the signature. This happens on demand | |
| 16391 // at runtime during a type test. | |
| 16392 // Therefore, equal function types must have equal type arguments. | |
| 16393 Thread* thread = Thread::Current(); | |
| 16394 Zone* zone = thread->zone(); | |
| 16395 const TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | |
| 16396 const TypeArguments& other_type_args = TypeArguments::Handle( | |
| 16397 zone, other_type.arguments()); | |
| 16398 if (!type_args.Equals(other_type_args)) { | |
| 16399 return false; | |
| 16400 } | |
| 16401 | |
| 16402 // Type arguments are equal. | |
| 16403 // Equal function types must have equal signature types and equal optional | |
| 16404 // named arguments. | |
| 16405 if (signature() == other_type.signature()) { | |
| 16406 return true; | |
| 16407 } | |
| 16408 const Function& sig_fun = Function::Handle(zone, signature()); | |
| 16409 const Function& other_sig_fun = Function::Handle( | |
| 16410 zone, other_type.signature()); | |
| 16411 | |
| 16412 // Compare number of function parameters. | |
| 16413 const intptr_t num_fixed_params = sig_fun.num_fixed_parameters(); | |
| 16414 const intptr_t other_num_fixed_params = other_sig_fun.num_fixed_parameters(); | |
| 16415 if (num_fixed_params != other_num_fixed_params) { | |
| 16416 return false; | |
| 16417 } | |
| 16418 const intptr_t num_opt_pos_params = sig_fun.NumOptionalPositionalParameters(); | |
| 16419 const intptr_t other_num_opt_pos_params = | |
| 16420 other_sig_fun.NumOptionalPositionalParameters(); | |
| 16421 if (num_opt_pos_params != other_num_opt_pos_params) { | |
| 16422 return false; | |
| 16423 } | |
| 16424 const intptr_t num_opt_named_params = sig_fun.NumOptionalNamedParameters(); | |
| 16425 const intptr_t other_num_opt_named_params = | |
| 16426 other_sig_fun.NumOptionalNamedParameters(); | |
| 16427 if (num_opt_named_params != other_num_opt_named_params) { | |
| 16428 return false; | |
| 16429 } | |
| 16430 const intptr_t num_ignored_params = sig_fun.NumImplicitParameters(); | |
| 16431 const intptr_t other_num_ignored_params = | |
| 16432 other_sig_fun.NumImplicitParameters(); | |
| 16433 if (num_ignored_params != other_num_ignored_params) { | |
| 16434 return false; | |
| 16435 } | |
| 16436 AbstractType& param_type = Type::Handle(zone); | |
| 16437 AbstractType& other_param_type = Type::Handle(zone); | |
| 16438 // Check the result type. | |
| 16439 param_type = sig_fun.result_type(); | |
| 16440 other_param_type = other_sig_fun.result_type(); | |
| 16441 if (!param_type.Equals(other_param_type)) { | |
| 16442 return false; | |
| 16443 } | |
| 16444 // Check the types of all parameters. | |
| 16445 const intptr_t num_params = sig_fun.NumParameters(); | |
| 16446 ASSERT(other_sig_fun.NumParameters() == num_params); | |
| 16447 for (intptr_t i = 0; i < num_params; i++) { | |
| 16448 param_type = sig_fun.ParameterTypeAt(i); | |
| 16449 other_param_type = other_sig_fun.ParameterTypeAt(i); | |
| 16450 if (!param_type.Equals(other_param_type)) { | |
| 16451 return false; | |
| 16452 } | |
| 16453 } | |
| 16454 // Check the names and types of optional named parameters. | |
| 16455 if (num_opt_named_params == 0) { | |
| 16456 return true; | |
| 16457 } | |
| 16458 for (intptr_t i = num_fixed_params; i < num_params; i++) { | |
| 16459 if (sig_fun.ParameterNameAt(i) != other_sig_fun.ParameterNameAt(i)) { | |
| 16460 return false; | |
| 16461 } | |
| 16462 } | |
| 16463 return true; | |
| 16464 } | |
| 16465 | |
| 16466 | |
| 16467 bool FunctionType::IsRecursive() const { | |
| 16468 return TypeArguments::Handle(arguments()).IsRecursive(); | |
| 16469 } | |
| 16470 | |
| 16471 | |
| 16472 RawAbstractType* FunctionType::CloneUnfinalized() const { | |
| 16473 ASSERT(IsResolved()); | |
| 16474 if (IsFinalized()) { | |
| 16475 return raw(); | |
| 16476 } | |
| 16477 ASSERT(!IsMalformed()); // Malformed types are finalized. | |
| 16478 ASSERT(!IsBeingFinalized()); // Cloning must occur prior to finalization. | |
| 16479 TypeArguments& type_args = TypeArguments::Handle(arguments()); | |
| 16480 type_args = type_args.CloneUnfinalized(); | |
| 16481 const FunctionType& clone = FunctionType::Handle( | |
| 16482 FunctionType::New(Class::Handle(scope_class()), | |
| 16483 type_args, | |
| 16484 Function::Handle(signature()), | |
| 16485 token_pos())); | |
| 16486 clone.SetIsResolved(); | |
| 16487 return clone.raw(); | |
| 16488 } | |
| 16489 | |
| 16490 | |
| 16491 RawAbstractType* FunctionType::CloneUninstantiated(const Class& new_owner, | |
| 16492 TrailPtr trail) const { | |
| 16493 ASSERT(IsFinalized()); | |
| 16494 ASSERT(!IsMalformed()); | |
| 16495 if (IsInstantiated()) { | |
| 16496 return raw(); | |
| 16497 } | |
| 16498 // We may recursively encounter a type already being cloned, because we clone | |
| 16499 // the upper bounds of its uninstantiated type arguments in the same pass. | |
| 16500 FunctionType& clone = FunctionType::Handle(); | |
| 16501 clone ^= OnlyBuddyInTrail(trail); | |
| 16502 if (!clone.IsNull()) { | |
| 16503 return clone.raw(); | |
| 16504 } | |
| 16505 clone = FunctionType::New(Class::Handle(scope_class()), | |
| 16506 TypeArguments::Handle(), | |
| 16507 Function::Handle(signature()), | |
| 16508 token_pos()); | |
| 16509 TypeArguments& type_args = TypeArguments::Handle(arguments()); | |
| 16510 // Upper bounds of uninstantiated type arguments may form a cycle. | |
| 16511 if (type_args.IsRecursive() || !type_args.IsInstantiated()) { | |
| 16512 AddOnlyBuddyToTrail(&trail, clone); | |
| 16513 } | |
| 16514 type_args = type_args.CloneUninstantiated(new_owner, trail); | |
| 16515 clone.set_arguments(type_args); | |
| 16516 clone.SetIsFinalized(); | |
| 16517 return clone.raw(); | |
| 16518 } | |
| 16519 | |
| 16520 | |
| 16521 RawAbstractType* FunctionType::Canonicalize(TrailPtr trail) const { | |
| 16522 ASSERT(IsFinalized()); | |
| 16523 if (IsCanonical() || IsMalformed()) { | |
| 16524 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); | |
| 16525 return this->raw(); | |
| 16526 } | |
| 16527 Thread* thread = Thread::Current(); | |
| 16528 Zone* zone = thread->zone(); | |
| 16529 AbstractType& type = Type::Handle(zone); | |
| 16530 const Class& scope_cls = Class::Handle(zone, type_class()); | |
| 16531 Array& canonical_types = Array::Handle(zone); | |
| 16532 canonical_types ^= scope_cls.canonical_types(); | |
| 16533 if (canonical_types.IsNull()) { | |
| 16534 canonical_types = empty_array().raw(); | |
| 16535 } | |
| 16536 intptr_t length = canonical_types.Length(); | |
| 16537 // Linear search to see whether this type is already present in the | |
| 16538 // list of canonicalized types. | |
| 16539 // TODO(asiva): Try to re-factor this lookup code to make sharing | |
| 16540 // easy between the 4 versions of this loop. | |
| 16541 intptr_t index = 1; // Slot 0 is reserved for CanonicalType(). | |
| 16542 while (index < length) { | |
| 16543 type ^= canonical_types.At(index); | |
| 16544 if (type.IsNull()) { | |
| 16545 break; | |
| 16546 } | |
| 16547 ASSERT(type.IsFinalized()); | |
| 16548 if (this->Equals(type)) { | |
| 16549 ASSERT(type.IsCanonical()); | |
| 16550 return type.raw(); | |
| 16551 } | |
| 16552 index++; | |
| 16553 } | |
| 16554 // The type was not found in the table. It is not canonical yet. | |
| 16555 | |
| 16556 // Canonicalize the type arguments. | |
| 16557 TypeArguments& type_args = TypeArguments::Handle(zone, arguments()); | |
| 16558 // In case the type is first canonicalized at runtime, its type argument | |
| 16559 // vector may be longer than necessary. This is not an issue. | |
| 16560 ASSERT(type_args.IsNull() || | |
| 16561 (type_args.Length() >= scope_cls.NumTypeArguments())); | |
| 16562 type_args = type_args.Canonicalize(trail); | |
| 16563 if (IsCanonical()) { | |
| 16564 // Canonicalizing type_args canonicalized this type as a side effect. | |
| 16565 ASSERT(IsRecursive()); | |
| 16566 // Cycles via typedefs are detected and disallowed, but a function type can | |
| 16567 // be recursive due to a cycle in its type arguments. | |
| 16568 return this->raw(); | |
| 16569 } | |
| 16570 set_arguments(type_args); | |
| 16571 | |
| 16572 // Replace the actual function by a signature function. | |
| 16573 const Function& fun = Function::Handle(zone, signature()); | |
| 16574 if (!fun.IsSignatureFunction()) { | |
| 16575 Function& sig_fun = Function::Handle(zone, | |
| 16576 Function::NewSignatureFunction(scope_cls, TokenPosition::kNoSource)); | |
| 16577 type = fun.result_type(); | |
| 16578 type = type.Canonicalize(trail); | |
| 16579 sig_fun.set_result_type(type); | |
| 16580 const intptr_t num_params = fun.NumParameters(); | |
| 16581 sig_fun.set_num_fixed_parameters(fun.num_fixed_parameters()); | |
| 16582 sig_fun.SetNumOptionalParameters(fun.NumOptionalParameters(), | |
| 16583 fun.HasOptionalPositionalParameters()); | |
| 16584 sig_fun.set_parameter_types(Array::Handle(Array::New(num_params, | |
| 16585 Heap::kOld))); | |
| 16586 for (intptr_t i = 0; i < num_params; i++) { | |
| 16587 type = fun.ParameterTypeAt(i); | |
| 16588 type = type.Canonicalize(trail); | |
| 16589 sig_fun.SetParameterTypeAt(i, type); | |
| 16590 } | |
| 16591 sig_fun.set_parameter_names(Array::Handle(zone, fun.parameter_names())); | |
| 16592 set_signature(sig_fun); | |
| 16593 } | |
| 16594 ASSERT(type_args.IsNull() || type_args.IsOld()); | |
| 16595 | |
| 16596 return scope_cls.LookupOrAddCanonicalType(*this, index); | |
| 16597 } | |
| 16598 | |
| 16599 | |
| 16600 RawString* FunctionType::EnumerateURIs() const { | |
| 16601 Zone* zone = Thread::Current()->zone(); | |
| 16602 // The scope class and type arguments do not appear explicitly in the user | |
| 16603 // visible name. The type arguments were used to instantiate the function type | |
| 16604 // prior to this call. | |
| 16605 const Function& sig_fun = Function::Handle(zone, signature()); | |
| 16606 AbstractType& type = AbstractType::Handle(zone); | |
| 16607 const intptr_t num_params = sig_fun.NumParameters(); | |
| 16608 GrowableHandlePtrArray<const String> pieces(zone, num_params + 1); | |
| 16609 for (intptr_t i = 0; i < num_params; i++) { | |
| 16610 type = sig_fun.ParameterTypeAt(i); | |
| 16611 pieces.Add(String::Handle(zone, type.EnumerateURIs())); | |
| 16612 } | |
| 16613 // Handle result type last, since it appears last in the user visible name. | |
| 16614 type = sig_fun.result_type(); | |
| 16615 pieces.Add(String::Handle(zone, type.EnumerateURIs())); | |
| 16616 return Symbols::FromConcatAll(pieces); | |
| 16617 } | |
| 16618 | |
| 16619 | |
| 16620 intptr_t FunctionType::Hash() const { | |
| 16621 ASSERT(IsFinalized()); | |
| 16622 uint32_t result = 1; | |
| 16623 if (IsMalformed()) return result; | |
| 16624 result = CombineHashes(result, Class::Handle(scope_class()).id()); | |
| 16625 result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash()); | |
| 16626 const Function& sig_fun = Function::Handle(signature()); | |
| 16627 AbstractType& type = AbstractType::Handle(sig_fun.result_type()); | |
| 16628 result = CombineHashes(result, type.Hash()); | |
| 16629 result = CombineHashes(result, sig_fun.NumOptionalPositionalParameters()); | |
| 16630 const intptr_t num_params = sig_fun.NumParameters(); | |
| 16631 for (intptr_t i = 0; i < num_params; i++) { | |
| 16632 type = sig_fun.ParameterTypeAt(i); | |
| 16633 result = CombineHashes(result, type.Hash()); | |
| 16634 } | |
| 16635 if (sig_fun.NumOptionalNamedParameters() > 0) { | |
| 16636 String& param_name = String::Handle(); | |
| 16637 for (intptr_t i = sig_fun.num_fixed_parameters(); i < num_params; i++) { | |
| 16638 param_name = sig_fun.ParameterNameAt(i); | |
| 16639 result = CombineHashes(result, param_name.Hash()); | |
| 16640 } | |
| 16641 } | |
| 16642 return FinalizeHash(result); | |
| 16643 } | |
| 16644 | |
| 16645 | |
| 16646 void FunctionType::set_scope_class(const Class& value) const { | |
| 16647 ASSERT(!value.IsNull()); | |
| 16648 StorePointer(&raw_ptr()->scope_class_, value.raw()); | |
| 16649 } | |
| 16650 | |
| 16651 | |
| 16652 void FunctionType::set_arguments(const TypeArguments& value) const { | |
| 16653 ASSERT(!IsCanonical()); | |
| 16654 StorePointer(&raw_ptr()->arguments_, value.raw()); | |
| 16655 } | |
| 16656 | |
| 16657 | |
| 16658 void FunctionType::set_signature(const Function& value) const { | |
| 16659 StorePointer(&raw_ptr()->signature_, value.raw()); | |
| 16660 } | |
| 16661 | |
| 16662 | |
| 16663 RawFunctionType* FunctionType::New(Heap::Space space) { | |
| 16664 RawObject* raw = Object::Allocate(FunctionType::kClassId, | |
| 16665 FunctionType::InstanceSize(), | |
| 16666 space); | |
| 16667 return reinterpret_cast<RawFunctionType*>(raw); | |
| 16668 } | |
| 16669 | |
| 16670 | |
| 16671 RawFunctionType* FunctionType::New(const Class& clazz, | |
| 16672 const TypeArguments& arguments, | |
| 16673 const Function& signature, | |
| 16674 TokenPosition token_pos, | |
| 16675 Heap::Space space) { | |
| 16676 const FunctionType& result = FunctionType::Handle(FunctionType::New(space)); | |
| 16677 result.set_scope_class(clazz); | |
| 16678 result.set_arguments(arguments); | |
| 16679 result.set_signature(signature); | |
| 16680 result.set_token_pos(token_pos); | |
| 16681 result.StoreNonPointer(&result.raw_ptr()->type_state_, | |
| 16682 RawFunctionType::kAllocated); | |
| 16683 return result.raw(); | |
| 16684 } | |
| 16685 | |
| 16686 | |
| 16687 void FunctionType::set_token_pos(TokenPosition token_pos) const { | |
| 16688 ASSERT(!token_pos.IsClassifying()); | |
| 16689 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); | |
| 16690 } | |
| 16691 | |
| 16692 | |
| 16693 void FunctionType::set_type_state(int8_t state) const { | |
| 16694 ASSERT((state >= RawFunctionType::kAllocated) && | |
| 16695 (state <= RawFunctionType::kFinalizedUninstantiated)); | |
| 16696 StoreNonPointer(&raw_ptr()->type_state_, state); | |
| 16697 } | |
| 16698 | |
| 16699 | |
| 16700 const char* FunctionType::ToCString() const { | |
| 16701 const char* unresolved = IsResolved() ? "" : "Unresolved "; | |
| 16702 const Class& scope_cls = Class::Handle(scope_class()); | |
| 16703 const TypeArguments& type_arguments = TypeArguments::Handle(arguments()); | |
| 16704 const Function& signature_function = Function::Handle(signature()); | |
| 16705 const String& signature_string = IsFinalized() ? | |
| 16706 String::Handle( | |
| 16707 signature_function.InstantiatedSignatureFrom(type_arguments, | |
| 16708 kInternalName)) : | |
| 16709 String::Handle(signature_function.Signature()); | |
| 16710 if (scope_cls.IsClosureClass()) { | |
| 16711 ASSERT(arguments() == TypeArguments::null()); | |
| 16712 return OS::SCreate( | |
| 16713 Thread::Current()->zone(), | |
| 16714 "%sFunctionType: %s", unresolved, signature_string.ToCString()); | |
| 16715 } | |
| 16716 const char* class_name = String::Handle(scope_cls.Name()).ToCString(); | |
| 16717 const char* args_cstr = | |
| 16718 type_arguments.IsNull() ? "null" : type_arguments.ToCString(); | |
| 16719 return OS::SCreate( | |
| 16720 Thread::Current()->zone(), | |
| 16721 "%s FunctionType: %s (scope_cls: %s, args: %s)", | |
| 16722 unresolved, | |
| 16723 signature_string.ToCString(), | |
| 16724 class_name, | |
| 16725 args_cstr); | |
| 16726 } | |
| 16727 | |
| 16728 | |
| 16729 bool TypeRef::IsInstantiated(TrailPtr trail) const { | 16495 bool TypeRef::IsInstantiated(TrailPtr trail) const { |
| 16730 if (TestAndAddToTrail(&trail)) { | 16496 if (TestAndAddToTrail(&trail)) { |
| 16731 return true; | 16497 return true; |
| 16732 } | 16498 } |
| 16733 return AbstractType::Handle(type()).IsInstantiated(trail); | 16499 return AbstractType::Handle(type()).IsInstantiated(trail); |
| 16734 } | 16500 } |
| 16735 | 16501 |
| 16736 | 16502 |
| 16737 bool TypeRef::IsEquivalent(const Instance& other, TrailPtr trail) const { | 16503 bool TypeRef::IsEquivalent(const Instance& other, TrailPtr trail) const { |
| 16738 if (raw() == other.raw()) { | 16504 if (raw() == other.raw()) { |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17290 } | 17056 } |
| 17291 } | 17057 } |
| 17292 return instantiated_bounded_type.raw(); | 17058 return instantiated_bounded_type.raw(); |
| 17293 } | 17059 } |
| 17294 | 17060 |
| 17295 | 17061 |
| 17296 RawAbstractType* BoundedType::CloneUnfinalized() const { | 17062 RawAbstractType* BoundedType::CloneUnfinalized() const { |
| 17297 if (IsFinalized()) { | 17063 if (IsFinalized()) { |
| 17298 return raw(); | 17064 return raw(); |
| 17299 } | 17065 } |
| 17300 AbstractType& bounded_type = AbstractType::Handle(type()); | 17066 const AbstractType& bounded_type = AbstractType::Handle(type()); |
| 17301 | 17067 const AbstractType& bounded_type_clone = |
| 17302 bounded_type = bounded_type.CloneUnfinalized(); | 17068 AbstractType::Handle(bounded_type.CloneUnfinalized()); |
| 17069 if (bounded_type_clone.raw() == bounded_type.raw()) { | |
| 17070 return raw(); | |
| 17071 } | |
| 17303 // No need to clone bound or type parameter, as they are not part of the | 17072 // No need to clone bound or type parameter, as they are not part of the |
| 17304 // finalization state of this bounded type. | 17073 // finalization state of this bounded type. |
| 17305 return BoundedType::New(bounded_type, | 17074 return BoundedType::New(bounded_type, |
| 17306 AbstractType::Handle(bound()), | 17075 AbstractType::Handle(bound()), |
| 17307 TypeParameter::Handle(type_parameter())); | 17076 TypeParameter::Handle(type_parameter())); |
| 17308 } | 17077 } |
| 17309 | 17078 |
| 17310 | 17079 |
| 17311 RawAbstractType* BoundedType::CloneUninstantiated( | 17080 RawAbstractType* BoundedType::CloneUninstantiated( |
| 17312 const Class& new_owner, TrailPtr trail) const { | 17081 const Class& new_owner, TrailPtr trail) const { |
| (...skipping 4648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21961 return UserTag::null(); | 21730 return UserTag::null(); |
| 21962 } | 21731 } |
| 21963 | 21732 |
| 21964 | 21733 |
| 21965 const char* UserTag::ToCString() const { | 21734 const char* UserTag::ToCString() const { |
| 21966 const String& tag_label = String::Handle(label()); | 21735 const String& tag_label = String::Handle(label()); |
| 21967 return tag_label.ToCString(); | 21736 return tag_label.ToCString(); |
| 21968 } | 21737 } |
| 21969 | 21738 |
| 21970 } // namespace dart | 21739 } // namespace dart |
| OLD | NEW |