| 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 5924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5935 const char* Function::ToQualifiedCString() const { | 5935 const char* Function::ToQualifiedCString() const { |
| 5936 char* chars = NULL; | 5936 char* chars = NULL; |
| 5937 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, | 5937 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, |
| 5938 kQualifiedFunctionLibKindLibUrl); | 5938 kQualifiedFunctionLibKindLibUrl); |
| 5939 return chars; | 5939 return chars; |
| 5940 } | 5940 } |
| 5941 | 5941 |
| 5942 | 5942 |
| 5943 bool Function::HasCompatibleParametersWith(const Function& other, | 5943 bool Function::HasCompatibleParametersWith(const Function& other, |
| 5944 Error* bound_error) const { | 5944 Error* bound_error) const { |
| 5945 ASSERT(Isolate::Current()->flags().error_on_bad_override()); | 5945 ASSERT(Isolate::Current()->error_on_bad_override()); |
| 5946 ASSERT((bound_error != NULL) && bound_error->IsNull()); | 5946 ASSERT((bound_error != NULL) && bound_error->IsNull()); |
| 5947 // Check that this function's signature type is a subtype of the other | 5947 // Check that this function's signature type is a subtype of the other |
| 5948 // function's signature type. | 5948 // function's signature type. |
| 5949 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), | 5949 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), |
| 5950 other, Object::null_type_arguments(), bound_error, | 5950 other, Object::null_type_arguments(), bound_error, |
| 5951 Heap::kOld)) { | 5951 Heap::kOld)) { |
| 5952 // For more informative error reporting, use the location of the other | 5952 // For more informative error reporting, use the location of the other |
| 5953 // function here, since the caller will use the location of this function. | 5953 // function here, since the caller will use the location of this function. |
| 5954 *bound_error = LanguageError::NewFormatted( | 5954 *bound_error = LanguageError::NewFormatted( |
| 5955 *bound_error, // A bound error if non null. | 5955 *bound_error, // A bound error if non null. |
| (...skipping 8273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14229 return true; | 14229 return true; |
| 14230 } | 14230 } |
| 14231 Function& other_signature = Function::Handle(zone); | 14231 Function& other_signature = Function::Handle(zone); |
| 14232 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); | 14232 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); |
| 14233 // Note that we may encounter a bound error in checked mode. | 14233 // Note that we may encounter a bound error in checked mode. |
| 14234 if (!other.IsInstantiated()) { | 14234 if (!other.IsInstantiated()) { |
| 14235 AbstractType& instantiated_other = AbstractType::Handle( | 14235 AbstractType& instantiated_other = AbstractType::Handle( |
| 14236 zone, other.InstantiateFrom(other_instantiator, bound_error, | 14236 zone, other.InstantiateFrom(other_instantiator, bound_error, |
| 14237 NULL, NULL, Heap::kOld)); | 14237 NULL, NULL, Heap::kOld)); |
| 14238 if ((bound_error != NULL) && !bound_error->IsNull()) { | 14238 if ((bound_error != NULL) && !bound_error->IsNull()) { |
| 14239 ASSERT(Isolate::Current()->flags().type_checks()); | 14239 ASSERT(Isolate::Current()->type_checks()); |
| 14240 return false; | 14240 return false; |
| 14241 } | 14241 } |
| 14242 if (instantiated_other.IsTypeRef()) { | 14242 if (instantiated_other.IsTypeRef()) { |
| 14243 instantiated_other = TypeRef::Cast(instantiated_other).type(); | 14243 instantiated_other = TypeRef::Cast(instantiated_other).type(); |
| 14244 } | 14244 } |
| 14245 if (instantiated_other.IsDynamicType() || | 14245 if (instantiated_other.IsDynamicType() || |
| 14246 instantiated_other.IsObjectType() || | 14246 instantiated_other.IsObjectType() || |
| 14247 instantiated_other.IsDartFunctionType()) { | 14247 instantiated_other.IsDartFunctionType()) { |
| 14248 return true; | 14248 return true; |
| 14249 } | 14249 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14285 (type_arguments.Length() >= cls.NumTypeArguments())); | 14285 (type_arguments.Length() >= cls.NumTypeArguments())); |
| 14286 } | 14286 } |
| 14287 Class& other_class = Class::Handle(zone); | 14287 Class& other_class = Class::Handle(zone); |
| 14288 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); | 14288 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); |
| 14289 AbstractType& instantiated_other = AbstractType::Handle(zone, other.raw()); | 14289 AbstractType& instantiated_other = AbstractType::Handle(zone, other.raw()); |
| 14290 // Note that we may encounter a bound error in checked mode. | 14290 // Note that we may encounter a bound error in checked mode. |
| 14291 if (!other.IsInstantiated()) { | 14291 if (!other.IsInstantiated()) { |
| 14292 instantiated_other = other.InstantiateFrom(other_instantiator, bound_error, | 14292 instantiated_other = other.InstantiateFrom(other_instantiator, bound_error, |
| 14293 NULL, NULL, Heap::kOld); | 14293 NULL, NULL, Heap::kOld); |
| 14294 if ((bound_error != NULL) && !bound_error->IsNull()) { | 14294 if ((bound_error != NULL) && !bound_error->IsNull()) { |
| 14295 ASSERT(Isolate::Current()->flags().type_checks()); | 14295 ASSERT(Isolate::Current()->type_checks()); |
| 14296 return false; | 14296 return false; |
| 14297 } | 14297 } |
| 14298 if (instantiated_other.IsTypeRef()) { | 14298 if (instantiated_other.IsTypeRef()) { |
| 14299 instantiated_other = TypeRef::Cast(instantiated_other).type(); | 14299 instantiated_other = TypeRef::Cast(instantiated_other).type(); |
| 14300 } | 14300 } |
| 14301 if (instantiated_other.IsDynamicType()) { | 14301 if (instantiated_other.IsDynamicType()) { |
| 14302 return true; | 14302 return true; |
| 14303 } | 14303 } |
| 14304 } | 14304 } |
| 14305 other_type_arguments = instantiated_other.arguments(); | 14305 other_type_arguments = instantiated_other.arguments(); |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14978 // more specific than test. | 14978 // more specific than test. |
| 14979 ASSERT(test_kind == kIsMoreSpecificThan); | 14979 ASSERT(test_kind == kIsMoreSpecificThan); |
| 14980 return false; | 14980 return false; |
| 14981 } | 14981 } |
| 14982 // In case the type checked in a type test is malbounded, the code generator | 14982 // In case the type checked in a type test is malbounded, the code generator |
| 14983 // may compile a throw instead of a run time call performing the type check. | 14983 // may compile a throw instead of a run time call performing the type check. |
| 14984 // However, in checked mode, a function type may include malbounded result | 14984 // However, in checked mode, a function type may include malbounded result |
| 14985 // type and/or malbounded parameter types, which will then be encountered here | 14985 // type and/or malbounded parameter types, which will then be encountered here |
| 14986 // at run time. | 14986 // at run time. |
| 14987 if (IsMalbounded()) { | 14987 if (IsMalbounded()) { |
| 14988 ASSERT(Isolate::Current()->flags().type_checks()); | 14988 ASSERT(Isolate::Current()->type_checks()); |
| 14989 if ((bound_error != NULL) && bound_error->IsNull()) { | 14989 if ((bound_error != NULL) && bound_error->IsNull()) { |
| 14990 *bound_error = error(); | 14990 *bound_error = error(); |
| 14991 } | 14991 } |
| 14992 return false; | 14992 return false; |
| 14993 } | 14993 } |
| 14994 if (other.IsMalbounded()) { | 14994 if (other.IsMalbounded()) { |
| 14995 ASSERT(Isolate::Current()->flags().type_checks()); | 14995 ASSERT(Isolate::Current()->type_checks()); |
| 14996 if ((bound_error != NULL) && bound_error->IsNull()) { | 14996 if ((bound_error != NULL) && bound_error->IsNull()) { |
| 14997 *bound_error = other.error(); | 14997 *bound_error = other.error(); |
| 14998 } | 14998 } |
| 14999 return false; | 14999 return false; |
| 15000 } | 15000 } |
| 15001 if (other.IsObjectType() || other.IsDynamicType()) { | 15001 if (other.IsObjectType() || other.IsDynamicType()) { |
| 15002 return true; | 15002 return true; |
| 15003 } | 15003 } |
| 15004 if (IsBoundedType() || other.IsBoundedType()) { | 15004 if (IsBoundedType() || other.IsBoundedType()) { |
| 15005 if (Equals(other)) { | 15005 if (Equals(other)) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15236 bool Type::IsMalformed() const { | 15236 bool Type::IsMalformed() const { |
| 15237 if (raw_ptr()->error_ == LanguageError::null()) { | 15237 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15238 return false; | 15238 return false; |
| 15239 } | 15239 } |
| 15240 const LanguageError& type_error = LanguageError::Handle(error()); | 15240 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15241 return type_error.kind() == Report::kMalformedType; | 15241 return type_error.kind() == Report::kMalformedType; |
| 15242 } | 15242 } |
| 15243 | 15243 |
| 15244 | 15244 |
| 15245 bool Type::IsMalbounded() const { | 15245 bool Type::IsMalbounded() const { |
| 15246 if (!Isolate::Current()->flags().type_checks()) { | 15246 if (!Isolate::Current()->type_checks()) { |
| 15247 return false; | 15247 return false; |
| 15248 } | 15248 } |
| 15249 if (raw_ptr()->error_ == LanguageError::null()) { | 15249 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15250 return false; | 15250 return false; |
| 15251 } | 15251 } |
| 15252 const LanguageError& type_error = LanguageError::Handle(error()); | 15252 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15253 return type_error.kind() == Report::kMalboundedType; | 15253 return type_error.kind() == Report::kMalboundedType; |
| 15254 } | 15254 } |
| 15255 | 15255 |
| 15256 | 15256 |
| 15257 bool Type::IsMalformedOrMalbounded() const { | 15257 bool Type::IsMalformedOrMalbounded() const { |
| 15258 if (raw_ptr()->error_ == LanguageError::null()) { | 15258 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15259 return false; | 15259 return false; |
| 15260 } | 15260 } |
| 15261 const LanguageError& type_error = LanguageError::Handle(error()); | 15261 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15262 if (type_error.kind() == Report::kMalformedType) { | 15262 if (type_error.kind() == Report::kMalformedType) { |
| 15263 return true; | 15263 return true; |
| 15264 } | 15264 } |
| 15265 ASSERT(type_error.kind() == Report::kMalboundedType); | 15265 ASSERT(type_error.kind() == Report::kMalboundedType); |
| 15266 return Isolate::Current()->flags().type_checks(); | 15266 return Isolate::Current()->type_checks(); |
| 15267 } | 15267 } |
| 15268 | 15268 |
| 15269 | 15269 |
| 15270 void Type::set_error(const LanguageError& value) const { | 15270 void Type::set_error(const LanguageError& value) const { |
| 15271 StorePointer(&raw_ptr()->error_, value.raw()); | 15271 StorePointer(&raw_ptr()->error_, value.raw()); |
| 15272 } | 15272 } |
| 15273 | 15273 |
| 15274 | 15274 |
| 15275 void Type::SetIsResolved() const { | 15275 void Type::SetIsResolved() const { |
| 15276 ASSERT(!IsResolved()); | 15276 ASSERT(!IsResolved()); |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15743 bool FunctionType::IsMalformed() const { | 15743 bool FunctionType::IsMalformed() const { |
| 15744 if (raw_ptr()->error_ == LanguageError::null()) { | 15744 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15745 return false; | 15745 return false; |
| 15746 } | 15746 } |
| 15747 const LanguageError& type_error = LanguageError::Handle(error()); | 15747 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15748 return type_error.kind() == Report::kMalformedType; | 15748 return type_error.kind() == Report::kMalformedType; |
| 15749 } | 15749 } |
| 15750 | 15750 |
| 15751 | 15751 |
| 15752 bool FunctionType::IsMalbounded() const { | 15752 bool FunctionType::IsMalbounded() const { |
| 15753 if (!Isolate::Current()->flags().type_checks()) { | 15753 if (!Isolate::Current()->type_checks()) { |
| 15754 return false; | 15754 return false; |
| 15755 } | 15755 } |
| 15756 if (raw_ptr()->error_ == LanguageError::null()) { | 15756 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15757 return false; | 15757 return false; |
| 15758 } | 15758 } |
| 15759 const LanguageError& type_error = LanguageError::Handle(error()); | 15759 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15760 return type_error.kind() == Report::kMalboundedType; | 15760 return type_error.kind() == Report::kMalboundedType; |
| 15761 } | 15761 } |
| 15762 | 15762 |
| 15763 | 15763 |
| 15764 bool FunctionType::IsMalformedOrMalbounded() const { | 15764 bool FunctionType::IsMalformedOrMalbounded() const { |
| 15765 if (raw_ptr()->error_ == LanguageError::null()) { | 15765 if (raw_ptr()->error_ == LanguageError::null()) { |
| 15766 return false; | 15766 return false; |
| 15767 } | 15767 } |
| 15768 const LanguageError& type_error = LanguageError::Handle(error()); | 15768 const LanguageError& type_error = LanguageError::Handle(error()); |
| 15769 if (type_error.kind() == Report::kMalformedType) { | 15769 if (type_error.kind() == Report::kMalformedType) { |
| 15770 return true; | 15770 return true; |
| 15771 } | 15771 } |
| 15772 ASSERT(type_error.kind() == Report::kMalboundedType); | 15772 ASSERT(type_error.kind() == Report::kMalboundedType); |
| 15773 return Isolate::Current()->flags().type_checks(); | 15773 return Isolate::Current()->type_checks(); |
| 15774 } | 15774 } |
| 15775 | 15775 |
| 15776 | 15776 |
| 15777 void FunctionType::set_error(const LanguageError& value) const { | 15777 void FunctionType::set_error(const LanguageError& value) const { |
| 15778 StorePointer(&raw_ptr()->error_, value.raw()); | 15778 StorePointer(&raw_ptr()->error_, value.raw()); |
| 15779 } | 15779 } |
| 15780 | 15780 |
| 15781 | 15781 |
| 15782 void FunctionType::SetIsResolved() const { | 15782 void FunctionType::SetIsResolved() const { |
| 15783 ASSERT(!IsResolved()); | 15783 ASSERT(!IsResolved()); |
| (...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16706 bounded_type.InstantiateFrom(instantiator_type_arguments, | 16706 bounded_type.InstantiateFrom(instantiator_type_arguments, |
| 16707 bound_error, | 16707 bound_error, |
| 16708 instantiation_trail, | 16708 instantiation_trail, |
| 16709 bound_trail, | 16709 bound_trail, |
| 16710 space); | 16710 space); |
| 16711 // In case types of instantiator_type_arguments are not finalized | 16711 // In case types of instantiator_type_arguments are not finalized |
| 16712 // (or instantiated), then the instantiated_bounded_type is not finalized | 16712 // (or instantiated), then the instantiated_bounded_type is not finalized |
| 16713 // (or instantiated) either. | 16713 // (or instantiated) either. |
| 16714 // Note that instantiator_type_arguments must have the final length, though. | 16714 // Note that instantiator_type_arguments must have the final length, though. |
| 16715 } | 16715 } |
| 16716 if ((Isolate::Current()->flags().type_checks()) && | 16716 if ((Isolate::Current()->type_checks()) && |
| 16717 (bound_error != NULL) && bound_error->IsNull()) { | 16717 (bound_error != NULL) && bound_error->IsNull()) { |
| 16718 AbstractType& upper_bound = AbstractType::Handle(bound()); | 16718 AbstractType& upper_bound = AbstractType::Handle(bound()); |
| 16719 ASSERT(upper_bound.IsFinalized()); | 16719 ASSERT(upper_bound.IsFinalized()); |
| 16720 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); | 16720 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); |
| 16721 AbstractType& instantiated_upper_bound = | 16721 AbstractType& instantiated_upper_bound = |
| 16722 AbstractType::Handle(upper_bound.raw()); | 16722 AbstractType::Handle(upper_bound.raw()); |
| 16723 if (!upper_bound.IsInstantiated()) { | 16723 if (!upper_bound.IsInstantiated()) { |
| 16724 instantiated_upper_bound = | 16724 instantiated_upper_bound = |
| 16725 upper_bound.InstantiateFrom(instantiator_type_arguments, | 16725 upper_bound.InstantiateFrom(instantiator_type_arguments, |
| 16726 bound_error, | 16726 bound_error, |
| (...skipping 4725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21452 return UserTag::null(); | 21452 return UserTag::null(); |
| 21453 } | 21453 } |
| 21454 | 21454 |
| 21455 | 21455 |
| 21456 const char* UserTag::ToCString() const { | 21456 const char* UserTag::ToCString() const { |
| 21457 const String& tag_label = String::Handle(label()); | 21457 const String& tag_label = String::Handle(label()); |
| 21458 return tag_label.ToCString(); | 21458 return tag_label.ToCString(); |
| 21459 } | 21459 } |
| 21460 | 21460 |
| 21461 } // namespace dart | 21461 } // namespace dart |
| OLD | NEW |