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/become.h" | 10 #include "vm/become.h" |
(...skipping 6507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6518 return true; | 6518 return true; |
6519 } | 6519 } |
6520 | 6520 |
6521 | 6521 |
6522 RawFunction* Function::InstantiateSignatureFrom( | 6522 RawFunction* Function::InstantiateSignatureFrom( |
6523 const TypeArguments& instantiator_type_arguments, | 6523 const TypeArguments& instantiator_type_arguments, |
6524 const TypeArguments& function_type_arguments, | 6524 const TypeArguments& function_type_arguments, |
6525 Heap::Space space) const { | 6525 Heap::Space space) const { |
6526 Zone* zone = Thread::Current()->zone(); | 6526 Zone* zone = Thread::Current()->zone(); |
6527 const Object& owner = Object::Handle(zone, RawOwner()); | 6527 const Object& owner = Object::Handle(zone, RawOwner()); |
| 6528 const Function& parent = Function::Handle(zone, parent_function()); |
6528 ASSERT(!HasInstantiatedSignature()); | 6529 ASSERT(!HasInstantiatedSignature()); |
6529 Function& sig = Function::Handle( | 6530 Function& sig = Function::Handle( |
6530 zone, | 6531 zone, Function::NewSignatureFunction(owner, parent, |
6531 Function::NewSignatureFunction(owner, TokenPosition::kNoSource, space)); | 6532 TokenPosition::kNoSource, space)); |
6532 sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters())); | 6533 sig.set_type_parameters(TypeArguments::Handle(zone, type_parameters())); |
6533 AbstractType& type = AbstractType::Handle(zone, result_type()); | 6534 AbstractType& type = AbstractType::Handle(zone, result_type()); |
6534 if (!type.IsInstantiated()) { | 6535 if (!type.IsInstantiated()) { |
6535 type = | 6536 type = |
6536 type.InstantiateFrom(instantiator_type_arguments, | 6537 type.InstantiateFrom(instantiator_type_arguments, |
6537 function_type_arguments, NULL, NULL, NULL, space); | 6538 function_type_arguments, NULL, NULL, NULL, space); |
6538 } | 6539 } |
6539 sig.set_result_type(type); | 6540 sig.set_result_type(type); |
6540 const intptr_t num_params = NumParameters(); | 6541 const intptr_t num_params = NumParameters(); |
6541 sig.set_num_fixed_parameters(num_fixed_parameters()); | 6542 sig.set_num_fixed_parameters(num_fixed_parameters()); |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6912 /* is_const = */ false, | 6913 /* is_const = */ false, |
6913 /* is_abstract = */ false, | 6914 /* is_abstract = */ false, |
6914 /* is_external = */ false, | 6915 /* is_external = */ false, |
6915 /* is_native = */ false, parent_owner, token_pos)); | 6916 /* is_native = */ false, parent_owner, token_pos)); |
6916 result.set_parent_function(parent); | 6917 result.set_parent_function(parent); |
6917 return result.raw(); | 6918 return result.raw(); |
6918 } | 6919 } |
6919 | 6920 |
6920 | 6921 |
6921 RawFunction* Function::NewSignatureFunction(const Object& owner, | 6922 RawFunction* Function::NewSignatureFunction(const Object& owner, |
| 6923 const Function& parent, |
6922 TokenPosition token_pos, | 6924 TokenPosition token_pos, |
6923 Heap::Space space) { | 6925 Heap::Space space) { |
6924 const Function& result = Function::Handle(Function::New( | 6926 const Function& result = Function::Handle(Function::New( |
6925 Symbols::AnonymousSignature(), RawFunction::kSignatureFunction, | 6927 Symbols::AnonymousSignature(), RawFunction::kSignatureFunction, |
6926 /* is_static = */ false, | 6928 /* is_static = */ false, |
6927 /* is_const = */ false, | 6929 /* is_const = */ false, |
6928 /* is_abstract = */ false, | 6930 /* is_abstract = */ false, |
6929 /* is_external = */ false, | 6931 /* is_external = */ false, |
6930 /* is_native = */ false, | 6932 /* is_native = */ false, |
6931 owner, // Same as function type scope class. | 6933 owner, // Same as function type scope class. |
6932 token_pos, space)); | 6934 token_pos, space)); |
| 6935 result.set_parent_function(parent); |
6933 result.set_is_reflectable(false); | 6936 result.set_is_reflectable(false); |
6934 result.set_is_visible(false); | 6937 result.set_is_visible(false); |
6935 result.set_is_debuggable(false); | 6938 result.set_is_debuggable(false); |
6936 return result.raw(); | 6939 return result.raw(); |
6937 } | 6940 } |
6938 | 6941 |
6939 | 6942 |
6940 RawFunction* Function::NewEvalFunction(const Class& owner, | 6943 RawFunction* Function::NewEvalFunction(const Class& owner, |
6941 const Script& script, | 6944 const Script& script, |
6942 bool is_static) { | 6945 bool is_static) { |
(...skipping 9865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16808 if (IsTypeParameter()) { | 16811 if (IsTypeParameter()) { |
16809 const TypeParameter& type_param = TypeParameter::Cast(*this); | 16812 const TypeParameter& type_param = TypeParameter::Cast(*this); |
16810 if (other.IsTypeParameter()) { | 16813 if (other.IsTypeParameter()) { |
16811 const TypeParameter& other_type_param = TypeParameter::Cast(other); | 16814 const TypeParameter& other_type_param = TypeParameter::Cast(other); |
16812 if (type_param.Equals(other_type_param)) { | 16815 if (type_param.Equals(other_type_param)) { |
16813 return true; | 16816 return true; |
16814 } | 16817 } |
16815 // TODO(regis): Should we update TypeParameter::IsEquivalent() instead? | 16818 // TODO(regis): Should we update TypeParameter::IsEquivalent() instead? |
16816 if (type_param.IsFunctionTypeParameter() && | 16819 if (type_param.IsFunctionTypeParameter() && |
16817 other_type_param.IsFunctionTypeParameter() && | 16820 other_type_param.IsFunctionTypeParameter() && |
16818 type_param.IsFinalized() && other_type_param.IsFinalized() && | 16821 type_param.IsFinalized() && other_type_param.IsFinalized()) { |
16819 (type_param.index() == other_type_param.index())) { | 16822 // To be compatible, the function type parameters should be declared at |
16820 return true; | 16823 // the same position in the generic function. Their index therefore |
| 16824 // needs adjustement before comparison. |
| 16825 // Example: 'foo<F>(bar<B>(B b)) { }' and 'baz<Z>(Z z) { }', baz can be |
| 16826 // assigned to bar, although B has index 1 and Z index 0. |
| 16827 const Function& sig_fun = |
| 16828 Function::Handle(zone, type_param.parameterized_function()); |
| 16829 const Function& other_sig_fun = |
| 16830 Function::Handle(zone, other_type_param.parameterized_function()); |
| 16831 const int offset = sig_fun.NumParentTypeParameters(); |
| 16832 const int other_offset = other_sig_fun.NumParentTypeParameters(); |
| 16833 if (type_param.index() - offset == |
| 16834 other_type_param.index() - other_offset) { |
| 16835 return true; |
| 16836 } |
16821 } | 16837 } |
16822 } | 16838 } |
16823 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); | 16839 const AbstractType& bound = AbstractType::Handle(zone, type_param.bound()); |
16824 // We may be checking bounds at finalization time and can encounter | 16840 // We may be checking bounds at finalization time and can encounter |
16825 // a still unfinalized bound. Finalizing the bound here may lead to cycles. | 16841 // a still unfinalized bound. Finalizing the bound here may lead to cycles. |
16826 if (!bound.IsFinalized()) { | 16842 if (!bound.IsFinalized()) { |
16827 return false; // TODO(regis): Return "maybe after instantiation". | 16843 return false; // TODO(regis): Return "maybe after instantiation". |
16828 } | 16844 } |
16829 // The current bound_trail cannot be used, because operands are swapped and | 16845 // The current bound_trail cannot be used, because operands are swapped and |
16830 // the test is different anyway (more specific vs. subtype). | 16846 // the test is different anyway (more specific vs. subtype). |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17438 Type::New(Class::Handle(zone, type_class()), type_args, token_pos())); | 17454 Type::New(Class::Handle(zone, type_class()), type_args, token_pos())); |
17439 // Preserve the bound error if any. | 17455 // Preserve the bound error if any. |
17440 if (IsMalbounded()) { | 17456 if (IsMalbounded()) { |
17441 const LanguageError& bound_error = LanguageError::Handle(zone, error()); | 17457 const LanguageError& bound_error = LanguageError::Handle(zone, error()); |
17442 clone.set_error(bound_error); | 17458 clone.set_error(bound_error); |
17443 } | 17459 } |
17444 // Clone the signature if this type represents a function type. | 17460 // Clone the signature if this type represents a function type. |
17445 Function& fun = Function::Handle(zone, signature()); | 17461 Function& fun = Function::Handle(zone, signature()); |
17446 if (!fun.IsNull()) { | 17462 if (!fun.IsNull()) { |
17447 const Class& owner = Class::Handle(zone, fun.Owner()); | 17463 const Class& owner = Class::Handle(zone, fun.Owner()); |
17448 Function& fun_clone = Function::Handle( | 17464 const Function& parent = Function::Handle(zone, fun.parent_function()); |
17449 zone, Function::NewSignatureFunction(owner, TokenPosition::kNoSource)); | 17465 Function& fun_clone = |
| 17466 Function::Handle(zone, Function::NewSignatureFunction( |
| 17467 owner, parent, TokenPosition::kNoSource)); |
17450 const TypeArguments& type_params = | 17468 const TypeArguments& type_params = |
17451 TypeArguments::Handle(zone, fun.type_parameters()); | 17469 TypeArguments::Handle(zone, fun.type_parameters()); |
17452 if (!type_params.IsNull()) { | 17470 if (!type_params.IsNull()) { |
17453 const intptr_t num_type_params = type_params.Length(); | 17471 const intptr_t num_type_params = type_params.Length(); |
17454 const TypeArguments& type_params_clone = | 17472 const TypeArguments& type_params_clone = |
17455 TypeArguments::Handle(zone, TypeArguments::New(num_type_params)); | 17473 TypeArguments::Handle(zone, TypeArguments::New(num_type_params)); |
17456 TypeParameter& type_param = TypeParameter::Handle(zone); | 17474 TypeParameter& type_param = TypeParameter::Handle(zone); |
17457 for (intptr_t i = 0; i < num_type_params; i++) { | 17475 for (intptr_t i = 0; i < num_type_params; i++) { |
17458 type_param ^= type_params.TypeAt(i); | 17476 type_param ^= type_params.TypeAt(i); |
17459 type_param ^= type_param.CloneUnfinalized(); | 17477 type_param ^= type_param.CloneUnfinalized(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17506 if (IsMalbounded()) { | 17524 if (IsMalbounded()) { |
17507 const LanguageError& bound_error = LanguageError::Handle(zone, error()); | 17525 const LanguageError& bound_error = LanguageError::Handle(zone, error()); |
17508 clone.set_error(bound_error); | 17526 clone.set_error(bound_error); |
17509 } | 17527 } |
17510 // Clone the signature if this type represents a function type. | 17528 // Clone the signature if this type represents a function type. |
17511 const Function& fun = Function::Handle(zone, signature()); | 17529 const Function& fun = Function::Handle(zone, signature()); |
17512 if (!fun.IsNull()) { | 17530 if (!fun.IsNull()) { |
17513 ASSERT(type_cls.IsTypedefClass() || type_cls.IsClosureClass()); | 17531 ASSERT(type_cls.IsTypedefClass() || type_cls.IsClosureClass()); |
17514 // If the scope class is not a typedef and if it is generic, it must be the | 17532 // If the scope class is not a typedef and if it is generic, it must be the |
17515 // mixin class, set it to the new owner. | 17533 // mixin class, set it to the new owner. |
| 17534 const Function& parent = Function::Handle(zone, fun.parent_function()); |
| 17535 // TODO(regis): Is it safe to reuse the parent function with the old owner? |
17516 Function& fun_clone = Function::Handle( | 17536 Function& fun_clone = Function::Handle( |
17517 zone, | 17537 zone, Function::NewSignatureFunction(new_owner, parent, |
17518 Function::NewSignatureFunction(new_owner, TokenPosition::kNoSource)); | 17538 TokenPosition::kNoSource)); |
17519 const TypeArguments& type_params = | 17539 const TypeArguments& type_params = |
17520 TypeArguments::Handle(zone, fun.type_parameters()); | 17540 TypeArguments::Handle(zone, fun.type_parameters()); |
17521 if (!type_params.IsNull()) { | 17541 if (!type_params.IsNull()) { |
17522 const intptr_t num_type_params = type_params.Length(); | 17542 const intptr_t num_type_params = type_params.Length(); |
17523 const TypeArguments& type_params_clone = | 17543 const TypeArguments& type_params_clone = |
17524 TypeArguments::Handle(zone, TypeArguments::New(num_type_params)); | 17544 TypeArguments::Handle(zone, TypeArguments::New(num_type_params)); |
17525 TypeParameter& type_param = TypeParameter::Handle(zone); | 17545 TypeParameter& type_param = TypeParameter::Handle(zone); |
17526 for (intptr_t i = 0; i < num_type_params; i++) { | 17546 for (intptr_t i = 0; i < num_type_params; i++) { |
17527 type_param ^= type_params.TypeAt(i); | 17547 type_param ^= type_params.TypeAt(i); |
17528 type_param ^= type_param.CloneUninstantiated(new_owner, trail); | 17548 type_param ^= type_param.CloneUninstantiated(new_owner, trail); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17653 return this->raw(); | 17673 return this->raw(); |
17654 } | 17674 } |
17655 set_arguments(type_args); | 17675 set_arguments(type_args); |
17656 ASSERT(type_args.IsNull() || type_args.IsOld()); | 17676 ASSERT(type_args.IsNull() || type_args.IsOld()); |
17657 | 17677 |
17658 // In case of a function type, replace the actual function by a signature | 17678 // In case of a function type, replace the actual function by a signature |
17659 // function. | 17679 // function. |
17660 if (IsFunctionType()) { | 17680 if (IsFunctionType()) { |
17661 const Function& fun = Function::Handle(zone, signature()); | 17681 const Function& fun = Function::Handle(zone, signature()); |
17662 if (!fun.IsSignatureFunction()) { | 17682 if (!fun.IsSignatureFunction()) { |
17663 Function& sig_fun = Function::Handle( | 17683 // In case of a generic function, the function type parameters in the |
17664 zone, | 17684 // signature will still refer to the original function. This should not |
17665 Function::NewSignatureFunction(cls, TokenPosition::kNoSource)); | 17685 // be a problem, since they are finalized and the indices remain |
| 17686 // unchanged. |
| 17687 const Function& parent = Function::Handle(zone, fun.parent_function()); |
| 17688 Function& sig_fun = |
| 17689 Function::Handle(zone, Function::NewSignatureFunction( |
| 17690 cls, parent, TokenPosition::kNoSource)); |
17666 sig_fun.set_type_parameters( | 17691 sig_fun.set_type_parameters( |
17667 TypeArguments::Handle(zone, fun.type_parameters())); | 17692 TypeArguments::Handle(zone, fun.type_parameters())); |
| 17693 ASSERT(fun.HasGenericParent() == sig_fun.HasGenericParent()); |
| 17694 ASSERT(fun.IsGeneric() == sig_fun.IsGeneric()); |
17668 type = fun.result_type(); | 17695 type = fun.result_type(); |
17669 type = type.Canonicalize(trail); | 17696 type = type.Canonicalize(trail); |
17670 sig_fun.set_result_type(type); | 17697 sig_fun.set_result_type(type); |
17671 const intptr_t num_params = fun.NumParameters(); | 17698 const intptr_t num_params = fun.NumParameters(); |
17672 sig_fun.set_num_fixed_parameters(fun.num_fixed_parameters()); | 17699 sig_fun.set_num_fixed_parameters(fun.num_fixed_parameters()); |
17673 sig_fun.SetNumOptionalParameters(fun.NumOptionalParameters(), | 17700 sig_fun.SetNumOptionalParameters(fun.NumOptionalParameters(), |
17674 fun.HasOptionalPositionalParameters()); | 17701 fun.HasOptionalPositionalParameters()); |
17675 sig_fun.set_parameter_types( | 17702 sig_fun.set_parameter_types( |
17676 Array::Handle(Array::New(num_params, Heap::kOld))); | 17703 Array::Handle(Array::New(num_params, Heap::kOld))); |
17677 for (intptr_t i = 0; i < num_params; i++) { | 17704 for (intptr_t i = 0; i < num_params; i++) { |
(...skipping 5772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23450 return UserTag::null(); | 23477 return UserTag::null(); |
23451 } | 23478 } |
23452 | 23479 |
23453 | 23480 |
23454 const char* UserTag::ToCString() const { | 23481 const char* UserTag::ToCString() const { |
23455 const String& tag_label = String::Handle(label()); | 23482 const String& tag_label = String::Handle(label()); |
23456 return tag_label.ToCString(); | 23483 return tag_label.ToCString(); |
23457 } | 23484 } |
23458 | 23485 |
23459 } // namespace dart | 23486 } // namespace dart |
OLD | NEW |