| 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 5852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5863 const char* Function::ToQualifiedCString() const { | 5863 const char* Function::ToQualifiedCString() const { |
| 5864 char* chars = NULL; | 5864 char* chars = NULL; |
| 5865 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, | 5865 ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false, |
| 5866 kQualifiedFunctionLibKindLibUrl); | 5866 kQualifiedFunctionLibKindLibUrl); |
| 5867 return chars; | 5867 return chars; |
| 5868 } | 5868 } |
| 5869 | 5869 |
| 5870 | 5870 |
| 5871 bool Function::HasCompatibleParametersWith(const Function& other, | 5871 bool Function::HasCompatibleParametersWith(const Function& other, |
| 5872 Error* bound_error) const { | 5872 Error* bound_error) const { |
| 5873 ASSERT(FLAG_error_on_bad_override); | 5873 ASSERT(Isolate::Current()->ErrorOnBadOverrideEnabled()); |
| 5874 ASSERT((bound_error != NULL) && bound_error->IsNull()); | 5874 ASSERT((bound_error != NULL) && bound_error->IsNull()); |
| 5875 // Check that this function's signature type is a subtype of the other | 5875 // Check that this function's signature type is a subtype of the other |
| 5876 // function's signature type. | 5876 // function's signature type. |
| 5877 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), | 5877 if (!TypeTest(kIsSubtypeOf, Object::null_type_arguments(), |
| 5878 other, Object::null_type_arguments(), bound_error)) { | 5878 other, Object::null_type_arguments(), bound_error)) { |
| 5879 // For more informative error reporting, use the location of the other | 5879 // For more informative error reporting, use the location of the other |
| 5880 // function here, since the caller will use the location of this function. | 5880 // function here, since the caller will use the location of this function. |
| 5881 *bound_error = LanguageError::NewFormatted( | 5881 *bound_error = LanguageError::NewFormatted( |
| 5882 *bound_error, // A bound error if non null. | 5882 *bound_error, // A bound error if non null. |
| 5883 Script::Handle(other.script()), | 5883 Script::Handle(other.script()), |
| (...skipping 7668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13552 ASSERT(type_arguments.IsNull() || | 13552 ASSERT(type_arguments.IsNull() || |
| 13553 (type_arguments.Length() >= cls.NumTypeArguments())); | 13553 (type_arguments.Length() >= cls.NumTypeArguments())); |
| 13554 } | 13554 } |
| 13555 Class& other_class = Class::Handle(isolate); | 13555 Class& other_class = Class::Handle(isolate); |
| 13556 TypeArguments& other_type_arguments = TypeArguments::Handle(isolate); | 13556 TypeArguments& other_type_arguments = TypeArguments::Handle(isolate); |
| 13557 // Note that we may encounter a bound error in checked mode. | 13557 // Note that we may encounter a bound error in checked mode. |
| 13558 if (!other.IsInstantiated()) { | 13558 if (!other.IsInstantiated()) { |
| 13559 const AbstractType& instantiated_other = AbstractType::Handle( | 13559 const AbstractType& instantiated_other = AbstractType::Handle( |
| 13560 isolate, other.InstantiateFrom(other_instantiator, bound_error)); | 13560 isolate, other.InstantiateFrom(other_instantiator, bound_error)); |
| 13561 if ((bound_error != NULL) && !bound_error->IsNull()) { | 13561 if ((bound_error != NULL) && !bound_error->IsNull()) { |
| 13562 ASSERT(FLAG_enable_type_checks); | 13562 ASSERT(Isolate::Current()->TypeChecksEnabled()); |
| 13563 return false; | 13563 return false; |
| 13564 } | 13564 } |
| 13565 other_class = instantiated_other.type_class(); | 13565 other_class = instantiated_other.type_class(); |
| 13566 other_type_arguments = instantiated_other.arguments(); | 13566 other_type_arguments = instantiated_other.arguments(); |
| 13567 } else { | 13567 } else { |
| 13568 other_class = other.type_class(); | 13568 other_class = other.type_class(); |
| 13569 other_type_arguments = other.arguments(); | 13569 other_type_arguments = other.arguments(); |
| 13570 } | 13570 } |
| 13571 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, | 13571 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, |
| 13572 bound_error); | 13572 bound_error); |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14221 // more specific than test. | 14221 // more specific than test. |
| 14222 ASSERT(test_kind == kIsMoreSpecificThan); | 14222 ASSERT(test_kind == kIsMoreSpecificThan); |
| 14223 return false; | 14223 return false; |
| 14224 } | 14224 } |
| 14225 // In case the type checked in a type test is malbounded, the code generator | 14225 // In case the type checked in a type test is malbounded, the code generator |
| 14226 // may compile a throw instead of a run time call performing the type check. | 14226 // may compile a throw instead of a run time call performing the type check. |
| 14227 // However, in checked mode, a function type may include malbounded result | 14227 // However, in checked mode, a function type may include malbounded result |
| 14228 // type and/or malbounded parameter types, which will then be encountered here | 14228 // type and/or malbounded parameter types, which will then be encountered here |
| 14229 // at run time. | 14229 // at run time. |
| 14230 if (IsMalbounded()) { | 14230 if (IsMalbounded()) { |
| 14231 ASSERT(FLAG_enable_type_checks); | 14231 ASSERT(Isolate::Current()->TypeChecksEnabled()); |
| 14232 if ((bound_error != NULL) && bound_error->IsNull()) { | 14232 if ((bound_error != NULL) && bound_error->IsNull()) { |
| 14233 *bound_error = error(); | 14233 *bound_error = error(); |
| 14234 } | 14234 } |
| 14235 return false; | 14235 return false; |
| 14236 } | 14236 } |
| 14237 if (other.IsMalbounded()) { | 14237 if (other.IsMalbounded()) { |
| 14238 ASSERT(FLAG_enable_type_checks); | 14238 ASSERT(Isolate::Current()->TypeChecksEnabled()); |
| 14239 if ((bound_error != NULL) && bound_error->IsNull()) { | 14239 if ((bound_error != NULL) && bound_error->IsNull()) { |
| 14240 *bound_error = other.error(); | 14240 *bound_error = other.error(); |
| 14241 } | 14241 } |
| 14242 return false; | 14242 return false; |
| 14243 } | 14243 } |
| 14244 if (IsBoundedType() || other.IsBoundedType()) { | 14244 if (IsBoundedType() || other.IsBoundedType()) { |
| 14245 if (Equals(other)) { | 14245 if (Equals(other)) { |
| 14246 return true; | 14246 return true; |
| 14247 } | 14247 } |
| 14248 return false; // TODO(regis): We should return "maybe after instantiation". | 14248 return false; // TODO(regis): We should return "maybe after instantiation". |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14435 bool Type::IsMalformed() const { | 14435 bool Type::IsMalformed() const { |
| 14436 if (raw_ptr()->error_ == LanguageError::null()) { | 14436 if (raw_ptr()->error_ == LanguageError::null()) { |
| 14437 return false; | 14437 return false; |
| 14438 } | 14438 } |
| 14439 const LanguageError& type_error = LanguageError::Handle(error()); | 14439 const LanguageError& type_error = LanguageError::Handle(error()); |
| 14440 return type_error.kind() == Report::kMalformedType; | 14440 return type_error.kind() == Report::kMalformedType; |
| 14441 } | 14441 } |
| 14442 | 14442 |
| 14443 | 14443 |
| 14444 bool Type::IsMalbounded() const { | 14444 bool Type::IsMalbounded() const { |
| 14445 if (!FLAG_enable_type_checks) { | 14445 if (!Isolate::Current()->TypeChecksEnabled()) { |
| 14446 return false; | 14446 return false; |
| 14447 } | 14447 } |
| 14448 if (raw_ptr()->error_ == LanguageError::null()) { | 14448 if (raw_ptr()->error_ == LanguageError::null()) { |
| 14449 return false; | 14449 return false; |
| 14450 } | 14450 } |
| 14451 const LanguageError& type_error = LanguageError::Handle(error()); | 14451 const LanguageError& type_error = LanguageError::Handle(error()); |
| 14452 return type_error.kind() == Report::kMalboundedType; | 14452 return type_error.kind() == Report::kMalboundedType; |
| 14453 } | 14453 } |
| 14454 | 14454 |
| 14455 | 14455 |
| 14456 bool Type::IsMalformedOrMalbounded() const { | 14456 bool Type::IsMalformedOrMalbounded() const { |
| 14457 if (raw_ptr()->error_ == LanguageError::null()) { | 14457 if (raw_ptr()->error_ == LanguageError::null()) { |
| 14458 return false; | 14458 return false; |
| 14459 } | 14459 } |
| 14460 const LanguageError& type_error = LanguageError::Handle(error()); | 14460 const LanguageError& type_error = LanguageError::Handle(error()); |
| 14461 if (type_error.kind() == Report::kMalformedType) { | 14461 if (type_error.kind() == Report::kMalformedType) { |
| 14462 return true; | 14462 return true; |
| 14463 } | 14463 } |
| 14464 ASSERT(type_error.kind() == Report::kMalboundedType); | 14464 ASSERT(type_error.kind() == Report::kMalboundedType); |
| 14465 return FLAG_enable_type_checks; | 14465 return Isolate::Current()->TypeChecksEnabled(); |
| 14466 } | 14466 } |
| 14467 | 14467 |
| 14468 | 14468 |
| 14469 void Type::set_error(const LanguageError& value) const { | 14469 void Type::set_error(const LanguageError& value) const { |
| 14470 StorePointer(&raw_ptr()->error_, value.raw()); | 14470 StorePointer(&raw_ptr()->error_, value.raw()); |
| 14471 } | 14471 } |
| 14472 | 14472 |
| 14473 | 14473 |
| 14474 void Type::set_is_resolved() const { | 14474 void Type::set_is_resolved() const { |
| 14475 ASSERT(!IsResolved()); | 14475 ASSERT(!IsResolved()); |
| (...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15432 const TypeArguments& instantiator_type_arguments, | 15432 const TypeArguments& instantiator_type_arguments, |
| 15433 Error* bound_error, | 15433 Error* bound_error, |
| 15434 GrowableObjectArray* trail) const { | 15434 GrowableObjectArray* trail) const { |
| 15435 ASSERT(IsFinalized()); | 15435 ASSERT(IsFinalized()); |
| 15436 AbstractType& bounded_type = AbstractType::Handle(type()); | 15436 AbstractType& bounded_type = AbstractType::Handle(type()); |
| 15437 if (!bounded_type.IsInstantiated()) { | 15437 if (!bounded_type.IsInstantiated()) { |
| 15438 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, | 15438 bounded_type = bounded_type.InstantiateFrom(instantiator_type_arguments, |
| 15439 bound_error, | 15439 bound_error, |
| 15440 trail); | 15440 trail); |
| 15441 } | 15441 } |
| 15442 if (FLAG_enable_type_checks && | 15442 if ((Isolate::Current()->TypeChecksEnabled()) && |
| 15443 (bound_error != NULL) && bound_error->IsNull()) { | 15443 (bound_error != NULL) && bound_error->IsNull()) { |
| 15444 AbstractType& upper_bound = AbstractType::Handle(bound()); | 15444 AbstractType& upper_bound = AbstractType::Handle(bound()); |
| 15445 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); | 15445 ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType()); |
| 15446 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); | 15446 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); |
| 15447 if (!upper_bound.IsInstantiated()) { | 15447 if (!upper_bound.IsInstantiated()) { |
| 15448 upper_bound = upper_bound.InstantiateFrom(instantiator_type_arguments, | 15448 upper_bound = upper_bound.InstantiateFrom(instantiator_type_arguments, |
| 15449 bound_error, | 15449 bound_error, |
| 15450 trail); | 15450 trail); |
| 15451 } | 15451 } |
| 15452 if (bound_error->IsNull()) { | 15452 if (bound_error->IsNull()) { |
| (...skipping 5112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20565 return tag_label.ToCString(); | 20565 return tag_label.ToCString(); |
| 20566 } | 20566 } |
| 20567 | 20567 |
| 20568 | 20568 |
| 20569 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 20569 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 20570 Instance::PrintJSONImpl(stream, ref); | 20570 Instance::PrintJSONImpl(stream, ref); |
| 20571 } | 20571 } |
| 20572 | 20572 |
| 20573 | 20573 |
| 20574 } // namespace dart | 20574 } // namespace dart |
| OLD | NEW |