| 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 6015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6026 ((num_fixed_params - num_ignored_params + num_opt_pos_params) < | 6026 ((num_fixed_params - num_ignored_params + num_opt_pos_params) < |
| 6027 (other_num_fixed_params - other_num_ignored_params + | 6027 (other_num_fixed_params - other_num_ignored_params + |
| 6028 other_num_opt_pos_params)) || | 6028 other_num_opt_pos_params)) || |
| 6029 (num_opt_named_params < other_num_opt_named_params)) { | 6029 (num_opt_named_params < other_num_opt_named_params)) { |
| 6030 return false; | 6030 return false; |
| 6031 } | 6031 } |
| 6032 // Check the result type. | 6032 // Check the result type. |
| 6033 AbstractType& other_res_type = AbstractType::Handle(other.result_type()); | 6033 AbstractType& other_res_type = AbstractType::Handle(other.result_type()); |
| 6034 if (!other_res_type.IsInstantiated()) { | 6034 if (!other_res_type.IsInstantiated()) { |
| 6035 other_res_type = other_res_type.InstantiateFrom(other_type_arguments, | 6035 other_res_type = other_res_type.InstantiateFrom(other_type_arguments, |
| 6036 bound_error); | 6036 bound_error, |
| 6037 NULL, NULL, space); |
| 6037 ASSERT((bound_error == NULL) || bound_error->IsNull()); | 6038 ASSERT((bound_error == NULL) || bound_error->IsNull()); |
| 6038 } | 6039 } |
| 6039 if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) { | 6040 if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) { |
| 6040 AbstractType& res_type = AbstractType::Handle(result_type()); | 6041 AbstractType& res_type = AbstractType::Handle(result_type()); |
| 6041 if (!res_type.IsInstantiated()) { | 6042 if (!res_type.IsInstantiated()) { |
| 6042 res_type = res_type.InstantiateFrom(type_arguments, bound_error); | 6043 res_type = res_type.InstantiateFrom(type_arguments, bound_error, |
| 6044 NULL, NULL, space); |
| 6043 ASSERT((bound_error == NULL) || bound_error->IsNull()); | 6045 ASSERT((bound_error == NULL) || bound_error->IsNull()); |
| 6044 } | 6046 } |
| 6045 if (res_type.IsVoidType()) { | 6047 if (res_type.IsVoidType()) { |
| 6046 return false; | 6048 return false; |
| 6047 } | 6049 } |
| 6048 if (test_kind == kIsSubtypeOf) { | 6050 if (test_kind == kIsSubtypeOf) { |
| 6049 if (!res_type.IsSubtypeOf(other_res_type, bound_error) && | 6051 if (!res_type.IsSubtypeOf(other_res_type, bound_error, NULL, space) && |
| 6050 !other_res_type.IsSubtypeOf(res_type, bound_error)) { | 6052 !other_res_type.IsSubtypeOf(res_type, bound_error, NULL, space)) { |
| 6051 return false; | 6053 return false; |
| 6052 } | 6054 } |
| 6053 } else { | 6055 } else { |
| 6054 ASSERT(test_kind == kIsMoreSpecificThan); | 6056 ASSERT(test_kind == kIsMoreSpecificThan); |
| 6055 if (!res_type.IsMoreSpecificThan(other_res_type, bound_error)) { | 6057 if (!res_type.IsMoreSpecificThan(other_res_type, bound_error, |
| 6058 NULL, space)) { |
| 6056 return false; | 6059 return false; |
| 6057 } | 6060 } |
| 6058 } | 6061 } |
| 6059 } | 6062 } |
| 6060 // Check the types of fixed and optional positional parameters. | 6063 // Check the types of fixed and optional positional parameters. |
| 6061 for (intptr_t i = 0; i < (other_num_fixed_params - other_num_ignored_params + | 6064 for (intptr_t i = 0; i < (other_num_fixed_params - other_num_ignored_params + |
| 6062 other_num_opt_pos_params); i++) { | 6065 other_num_opt_pos_params); i++) { |
| 6063 if (!TestParameterType(test_kind, | 6066 if (!TestParameterType(test_kind, |
| 6064 i + num_ignored_params, i + other_num_ignored_params, | 6067 i + num_ignored_params, i + other_num_ignored_params, |
| 6065 type_arguments, other, other_type_arguments, | 6068 type_arguments, other, other_type_arguments, |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6414 // Hide implicit parameters. | 6417 // Hide implicit parameters. |
| 6415 i = NumImplicitParameters(); | 6418 i = NumImplicitParameters(); |
| 6416 } | 6419 } |
| 6417 String& name = String::Handle(zone); | 6420 String& name = String::Handle(zone); |
| 6418 while (i < num_fixed_params) { | 6421 while (i < num_fixed_params) { |
| 6419 param_type = ParameterTypeAt(i); | 6422 param_type = ParameterTypeAt(i); |
| 6420 ASSERT(!param_type.IsNull()); | 6423 ASSERT(!param_type.IsNull()); |
| 6421 if (instantiate && | 6424 if (instantiate && |
| 6422 param_type.IsFinalized() && | 6425 param_type.IsFinalized() && |
| 6423 !param_type.IsInstantiated()) { | 6426 !param_type.IsInstantiated()) { |
| 6424 param_type = param_type.InstantiateFrom(instantiator, NULL); | 6427 param_type = param_type.InstantiateFrom(instantiator, NULL, |
| 6428 NULL, NULL, Heap::kNew); |
| 6425 } | 6429 } |
| 6426 name = param_type.BuildName(name_visibility); | 6430 name = param_type.BuildName(name_visibility); |
| 6427 pieces->Add(name); | 6431 pieces->Add(name); |
| 6428 if (i != (num_params - 1)) { | 6432 if (i != (num_params - 1)) { |
| 6429 pieces->Add(Symbols::CommaSpace()); | 6433 pieces->Add(Symbols::CommaSpace()); |
| 6430 } | 6434 } |
| 6431 i++; | 6435 i++; |
| 6432 } | 6436 } |
| 6433 if (num_opt_params > 0) { | 6437 if (num_opt_params > 0) { |
| 6434 if (num_opt_pos_params > 0) { | 6438 if (num_opt_pos_params > 0) { |
| 6435 pieces->Add(Symbols::LBracket()); | 6439 pieces->Add(Symbols::LBracket()); |
| 6436 } else { | 6440 } else { |
| 6437 pieces->Add(Symbols::LBrace()); | 6441 pieces->Add(Symbols::LBrace()); |
| 6438 } | 6442 } |
| 6439 for (intptr_t i = num_fixed_params; i < num_params; i++) { | 6443 for (intptr_t i = num_fixed_params; i < num_params; i++) { |
| 6440 // The parameter name of an optional positional parameter does not need | 6444 // The parameter name of an optional positional parameter does not need |
| 6441 // to be part of the signature, since it is not used. | 6445 // to be part of the signature, since it is not used. |
| 6442 if (num_opt_named_params > 0) { | 6446 if (num_opt_named_params > 0) { |
| 6443 name = ParameterNameAt(i); | 6447 name = ParameterNameAt(i); |
| 6444 pieces->Add(name); | 6448 pieces->Add(name); |
| 6445 pieces->Add(Symbols::ColonSpace()); | 6449 pieces->Add(Symbols::ColonSpace()); |
| 6446 } | 6450 } |
| 6447 param_type = ParameterTypeAt(i); | 6451 param_type = ParameterTypeAt(i); |
| 6448 if (instantiate && | 6452 if (instantiate && |
| 6449 param_type.IsFinalized() && | 6453 param_type.IsFinalized() && |
| 6450 !param_type.IsInstantiated()) { | 6454 !param_type.IsInstantiated()) { |
| 6451 param_type = param_type.InstantiateFrom(instantiator, NULL); | 6455 param_type = param_type.InstantiateFrom(instantiator, NULL, |
| 6456 NULL, NULL, Heap::kNew); |
| 6452 } | 6457 } |
| 6453 ASSERT(!param_type.IsNull()); | 6458 ASSERT(!param_type.IsNull()); |
| 6454 name = param_type.BuildName(name_visibility); | 6459 name = param_type.BuildName(name_visibility); |
| 6455 pieces->Add(name); | 6460 pieces->Add(name); |
| 6456 if (i != (num_params - 1)) { | 6461 if (i != (num_params - 1)) { |
| 6457 pieces->Add(Symbols::CommaSpace()); | 6462 pieces->Add(Symbols::CommaSpace()); |
| 6458 } | 6463 } |
| 6459 } | 6464 } |
| 6460 if (num_opt_pos_params > 0) { | 6465 if (num_opt_pos_params > 0) { |
| 6461 pieces->Add(Symbols::RBracket()); | 6466 pieces->Add(Symbols::RBracket()); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6539 } | 6544 } |
| 6540 } | 6545 } |
| 6541 pieces.Add(Symbols::LParen()); | 6546 pieces.Add(Symbols::LParen()); |
| 6542 BuildSignatureParameters(instantiate, | 6547 BuildSignatureParameters(instantiate, |
| 6543 name_visibility, | 6548 name_visibility, |
| 6544 instantiator, | 6549 instantiator, |
| 6545 &pieces); | 6550 &pieces); |
| 6546 pieces.Add(Symbols::RParenArrow()); | 6551 pieces.Add(Symbols::RParenArrow()); |
| 6547 AbstractType& res_type = AbstractType::Handle(zone, result_type()); | 6552 AbstractType& res_type = AbstractType::Handle(zone, result_type()); |
| 6548 if (instantiate && res_type.IsFinalized() && !res_type.IsInstantiated()) { | 6553 if (instantiate && res_type.IsFinalized() && !res_type.IsInstantiated()) { |
| 6549 res_type = res_type.InstantiateFrom(instantiator, NULL); | 6554 res_type = res_type.InstantiateFrom(instantiator, NULL, |
| 6555 NULL, NULL, Heap::kNew); |
| 6550 } | 6556 } |
| 6551 name = res_type.BuildName(name_visibility); | 6557 name = res_type.BuildName(name_visibility); |
| 6552 pieces.Add(name); | 6558 pieces.Add(name); |
| 6553 return Symbols::FromConcatAll(pieces); | 6559 return Symbols::FromConcatAll(pieces); |
| 6554 } | 6560 } |
| 6555 | 6561 |
| 6556 | 6562 |
| 6557 bool Function::HasInstantiatedSignature() const { | 6563 bool Function::HasInstantiatedSignature() const { |
| 6558 AbstractType& type = AbstractType::Handle(result_type()); | 6564 AbstractType& type = AbstractType::Handle(result_type()); |
| 6559 if (!type.IsInstantiated()) { | 6565 if (!type.IsInstantiated()) { |
| (...skipping 7628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14188 const Class& cls = Class::Handle(zone, clazz()); | 14194 const Class& cls = Class::Handle(zone, clazz()); |
| 14189 if (cls.IsClosureClass()) { | 14195 if (cls.IsClosureClass()) { |
| 14190 if (other.IsObjectType() || other.IsDartFunctionType()) { | 14196 if (other.IsObjectType() || other.IsDartFunctionType()) { |
| 14191 return true; | 14197 return true; |
| 14192 } | 14198 } |
| 14193 Function& other_signature = Function::Handle(zone); | 14199 Function& other_signature = Function::Handle(zone); |
| 14194 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); | 14200 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); |
| 14195 // Note that we may encounter a bound error in checked mode. | 14201 // Note that we may encounter a bound error in checked mode. |
| 14196 if (!other.IsInstantiated()) { | 14202 if (!other.IsInstantiated()) { |
| 14197 const AbstractType& instantiated_other = AbstractType::Handle( | 14203 const AbstractType& instantiated_other = AbstractType::Handle( |
| 14198 zone, other.InstantiateFrom(other_instantiator, bound_error)); | 14204 zone, other.InstantiateFrom(other_instantiator, bound_error, |
| 14205 NULL, NULL, Heap::kOld)); |
| 14199 if ((bound_error != NULL) && !bound_error->IsNull()) { | 14206 if ((bound_error != NULL) && !bound_error->IsNull()) { |
| 14200 ASSERT(Isolate::Current()->flags().type_checks()); | 14207 ASSERT(Isolate::Current()->flags().type_checks()); |
| 14201 return false; | 14208 return false; |
| 14202 } | 14209 } |
| 14203 if (instantiated_other.IsDynamicType() || | 14210 if (instantiated_other.IsDynamicType() || |
| 14204 instantiated_other.IsObjectType() || | 14211 instantiated_other.IsObjectType() || |
| 14205 instantiated_other.IsDartFunctionType()) { | 14212 instantiated_other.IsDartFunctionType()) { |
| 14206 return true; | 14213 return true; |
| 14207 } | 14214 } |
| 14208 if (!instantiated_other.IsFunctionType()) { | 14215 if (!instantiated_other.IsFunctionType()) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14240 // Also, an optimization reuses the type argument vector of the instantiator | 14247 // Also, an optimization reuses the type argument vector of the instantiator |
| 14241 // of generic instances when its layout is compatible. | 14248 // of generic instances when its layout is compatible. |
| 14242 ASSERT(type_arguments.IsNull() || | 14249 ASSERT(type_arguments.IsNull() || |
| 14243 (type_arguments.Length() >= cls.NumTypeArguments())); | 14250 (type_arguments.Length() >= cls.NumTypeArguments())); |
| 14244 } | 14251 } |
| 14245 Class& other_class = Class::Handle(zone); | 14252 Class& other_class = Class::Handle(zone); |
| 14246 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); | 14253 TypeArguments& other_type_arguments = TypeArguments::Handle(zone); |
| 14247 AbstractType& instantiated_other = AbstractType::Handle(zone, other.raw()); | 14254 AbstractType& instantiated_other = AbstractType::Handle(zone, other.raw()); |
| 14248 // Note that we may encounter a bound error in checked mode. | 14255 // Note that we may encounter a bound error in checked mode. |
| 14249 if (!other.IsInstantiated()) { | 14256 if (!other.IsInstantiated()) { |
| 14250 instantiated_other = other.InstantiateFrom(other_instantiator, bound_error); | 14257 instantiated_other = other.InstantiateFrom(other_instantiator, bound_error, |
| 14258 NULL, NULL, Heap::kOld); |
| 14251 if ((bound_error != NULL) && !bound_error->IsNull()) { | 14259 if ((bound_error != NULL) && !bound_error->IsNull()) { |
| 14252 ASSERT(Isolate::Current()->flags().type_checks()); | 14260 ASSERT(Isolate::Current()->flags().type_checks()); |
| 14253 return false; | 14261 return false; |
| 14254 } | 14262 } |
| 14255 if (instantiated_other.IsTypeRef()) { | 14263 if (instantiated_other.IsTypeRef()) { |
| 14256 instantiated_other = TypeRef::Cast(instantiated_other).type(); | 14264 instantiated_other = TypeRef::Cast(instantiated_other).type(); |
| 14257 } | 14265 } |
| 14258 if (instantiated_other.IsDynamicType()) { | 14266 if (instantiated_other.IsDynamicType()) { |
| 14259 return true; | 14267 return true; |
| 14260 } | 14268 } |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14994 } | 15002 } |
| 14995 } | 15003 } |
| 14996 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); | 15004 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); |
| 14997 // We may be checking bounds at finalization time and can encounter | 15005 // We may be checking bounds at finalization time and can encounter |
| 14998 // a still unfinalized bound. Finalizing the bound here may lead to cycles. | 15006 // a still unfinalized bound. Finalizing the bound here may lead to cycles. |
| 14999 if (!bound.IsFinalized()) { | 15007 if (!bound.IsFinalized()) { |
| 15000 return false; // TODO(regis): Return "maybe after instantiation". | 15008 return false; // TODO(regis): Return "maybe after instantiation". |
| 15001 } | 15009 } |
| 15002 // The current bound_trail cannot be used, because operands are swapped and | 15010 // The current bound_trail cannot be used, because operands are swapped and |
| 15003 // the test is different anyway (more specific vs. subtype). | 15011 // the test is different anyway (more specific vs. subtype). |
| 15004 if (bound.IsMoreSpecificThan(other, bound_error, NULL)) { | 15012 if (bound.IsMoreSpecificThan(other, bound_error, NULL, space)) { |
| 15005 return true; | 15013 return true; |
| 15006 } | 15014 } |
| 15007 return false; // TODO(regis): We should return "maybe after instantiation". | 15015 return false; // TODO(regis): We should return "maybe after instantiation". |
| 15008 } | 15016 } |
| 15009 if (other.IsTypeParameter()) { | 15017 if (other.IsTypeParameter()) { |
| 15010 return false; // TODO(regis): We should return "maybe after instantiation". | 15018 return false; // TODO(regis): We should return "maybe after instantiation". |
| 15011 } | 15019 } |
| 15012 const Class& type_cls = Class::Handle(zone, type_class()); | 15020 const Class& type_cls = Class::Handle(zone, type_class()); |
| 15013 // Function types cannot be handled by Class::TypeTest(). | 15021 // Function types cannot be handled by Class::TypeTest(). |
| 15014 const bool other_is_dart_function_type = other.IsDartFunctionType(); | 15022 const bool other_is_dart_function_type = other.IsDartFunctionType(); |
| (...skipping 1680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16695 if (instantiated_bounded_type.Equals(bounded_type) && | 16703 if (instantiated_bounded_type.Equals(bounded_type) && |
| 16696 instantiated_upper_bound.Equals(upper_bound)) { | 16704 instantiated_upper_bound.Equals(upper_bound)) { |
| 16697 return bounded_type.raw(); | 16705 return bounded_type.raw(); |
| 16698 } | 16706 } |
| 16699 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); | 16707 const TypeParameter& type_param = TypeParameter::Handle(type_parameter()); |
| 16700 if (instantiated_bounded_type.IsBeingFinalized() || | 16708 if (instantiated_bounded_type.IsBeingFinalized() || |
| 16701 instantiated_upper_bound.IsBeingFinalized() || | 16709 instantiated_upper_bound.IsBeingFinalized() || |
| 16702 (!type_param.CheckBound(instantiated_bounded_type, | 16710 (!type_param.CheckBound(instantiated_bounded_type, |
| 16703 instantiated_upper_bound, | 16711 instantiated_upper_bound, |
| 16704 bound_error, | 16712 bound_error, |
| 16705 bound_trail) && | 16713 bound_trail, |
| 16714 space) && |
| 16706 bound_error->IsNull())) { | 16715 bound_error->IsNull())) { |
| 16707 // We cannot determine yet whether the bounded_type is below the | 16716 // We cannot determine yet whether the bounded_type is below the |
| 16708 // upper_bound, because one or both of them is still being finalized or | 16717 // upper_bound, because one or both of them is still being finalized or |
| 16709 // uninstantiated. | 16718 // uninstantiated. |
| 16710 ASSERT(instantiated_bounded_type.IsBeingFinalized() || | 16719 ASSERT(instantiated_bounded_type.IsBeingFinalized() || |
| 16711 instantiated_upper_bound.IsBeingFinalized() || | 16720 instantiated_upper_bound.IsBeingFinalized() || |
| 16712 !instantiated_bounded_type.IsInstantiated() || | 16721 !instantiated_bounded_type.IsInstantiated() || |
| 16713 !instantiated_upper_bound.IsInstantiated()); | 16722 !instantiated_upper_bound.IsInstantiated()); |
| 16714 // Postpone bound check by returning a new BoundedType with unfinalized | 16723 // Postpone bound check by returning a new BoundedType with unfinalized |
| 16715 // or partially instantiated bounded_type and upper_bound, but keeping | 16724 // or partially instantiated bounded_type and upper_bound, but keeping |
| (...skipping 4692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21408 return UserTag::null(); | 21417 return UserTag::null(); |
| 21409 } | 21418 } |
| 21410 | 21419 |
| 21411 | 21420 |
| 21412 const char* UserTag::ToCString() const { | 21421 const char* UserTag::ToCString() const { |
| 21413 const String& tag_label = String::Handle(label()); | 21422 const String& tag_label = String::Handle(label()); |
| 21414 return tag_label.ToCString(); | 21423 return tag_label.ToCString(); |
| 21415 } | 21424 } |
| 21416 | 21425 |
| 21417 } // namespace dart | 21426 } // namespace dart |
| OLD | NEW |