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 6459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6470 signature_class, signature_type, ClassFinalizer::kCanonicalize); | 6470 signature_class, signature_type, ClassFinalizer::kCanonicalize); |
6471 } | 6471 } |
6472 ASSERT(closure_function.signature_class() == signature_class.raw()); | 6472 ASSERT(closure_function.signature_class() == signature_class.raw()); |
6473 set_implicit_closure_function(closure_function); | 6473 set_implicit_closure_function(closure_function); |
6474 ASSERT(closure_function.IsImplicitClosureFunction()); | 6474 ASSERT(closure_function.IsImplicitClosureFunction()); |
6475 return closure_function.raw(); | 6475 return closure_function.raw(); |
6476 } | 6476 } |
6477 | 6477 |
6478 | 6478 |
6479 RawString* Function::UserVisibleFormalParameters() const { | 6479 RawString* Function::UserVisibleFormalParameters() const { |
6480 const GrowableObjectArray& pieces = | 6480 // Typically 3, 5,.. elements in 'pieces', e.g.: |
6481 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 6481 // '_LoadRequest', CommaSpace, '_LoadError'. |
| 6482 GrowableArray<const String*> pieces(5); |
6482 const TypeArguments& instantiator = TypeArguments::Handle(); | 6483 const TypeArguments& instantiator = TypeArguments::Handle(); |
6483 BuildSignatureParameters(false, kUserVisibleName, instantiator, pieces); | 6484 BuildSignatureParameters(false, kUserVisibleName, instantiator, &pieces); |
6484 const Array& strings = Array::Handle(Array::MakeArray(pieces)); | 6485 return Symbols::FromConcatAll(pieces); |
6485 return String::ConcatAll(strings); | |
6486 } | 6486 } |
6487 | 6487 |
6488 | 6488 |
6489 void Function::BuildSignatureParameters( | 6489 void Function::BuildSignatureParameters( |
6490 bool instantiate, | 6490 bool instantiate, |
6491 NameVisibility name_visibility, | 6491 NameVisibility name_visibility, |
6492 const TypeArguments& instantiator, | 6492 const TypeArguments& instantiator, |
6493 const GrowableObjectArray& pieces) const { | 6493 GrowableArray<const String*>* pieces) const { |
6494 AbstractType& param_type = AbstractType::Handle(); | 6494 Thread* thread = Thread::Current(); |
| 6495 Zone* zone = thread->zone(); |
| 6496 |
| 6497 AbstractType& param_type = AbstractType::Handle(zone); |
6495 const intptr_t num_params = NumParameters(); | 6498 const intptr_t num_params = NumParameters(); |
6496 const intptr_t num_fixed_params = num_fixed_parameters(); | 6499 const intptr_t num_fixed_params = num_fixed_parameters(); |
6497 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); | 6500 const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); |
6498 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); | 6501 const intptr_t num_opt_named_params = NumOptionalNamedParameters(); |
6499 const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params; | 6502 const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params; |
6500 ASSERT((num_fixed_params + num_opt_params) == num_params); | 6503 ASSERT((num_fixed_params + num_opt_params) == num_params); |
6501 String& name = String::Handle(); | |
6502 intptr_t i = 0; | 6504 intptr_t i = 0; |
6503 if (name_visibility == kUserVisibleName) { | 6505 if (name_visibility == kUserVisibleName) { |
6504 // Hide implicit parameters. | 6506 // Hide implicit parameters. |
6505 i = NumImplicitParameters(); | 6507 i = NumImplicitParameters(); |
6506 } | 6508 } |
6507 while (i < num_fixed_params) { | 6509 while (i < num_fixed_params) { |
6508 param_type = ParameterTypeAt(i); | 6510 param_type = ParameterTypeAt(i); |
6509 ASSERT(!param_type.IsNull()); | 6511 ASSERT(!param_type.IsNull()); |
6510 if (instantiate && !param_type.IsInstantiated()) { | 6512 if (instantiate && !param_type.IsInstantiated()) { |
6511 param_type = param_type.InstantiateFrom(instantiator, NULL); | 6513 param_type = param_type.InstantiateFrom(instantiator, NULL); |
6512 } | 6514 } |
6513 name = param_type.BuildName(name_visibility); | 6515 const String& name = |
6514 pieces.Add(name); | 6516 String::ZoneHandle(zone, param_type.BuildName(name_visibility)); |
| 6517 pieces->Add(&name); |
6515 if (i != (num_params - 1)) { | 6518 if (i != (num_params - 1)) { |
6516 pieces.Add(Symbols::CommaSpace()); | 6519 pieces->Add(&Symbols::CommaSpace()); |
6517 } | 6520 } |
6518 i++; | 6521 i++; |
6519 } | 6522 } |
6520 if (num_opt_params > 0) { | 6523 if (num_opt_params > 0) { |
6521 if (num_opt_pos_params > 0) { | 6524 if (num_opt_pos_params > 0) { |
6522 pieces.Add(Symbols::LBracket()); | 6525 pieces->Add(&Symbols::LBracket()); |
6523 } else { | 6526 } else { |
6524 pieces.Add(Symbols::LBrace()); | 6527 pieces->Add(&Symbols::LBrace()); |
6525 } | 6528 } |
6526 for (intptr_t i = num_fixed_params; i < num_params; i++) { | 6529 for (intptr_t i = num_fixed_params; i < num_params; i++) { |
6527 // The parameter name of an optional positional parameter does not need | 6530 // The parameter name of an optional positional parameter does not need |
6528 // to be part of the signature, since it is not used. | 6531 // to be part of the signature, since it is not used. |
6529 if (num_opt_named_params > 0) { | 6532 if (num_opt_named_params > 0) { |
6530 name = ParameterNameAt(i); | 6533 const String& name = String::ZoneHandle(zone, ParameterNameAt(i)); |
6531 pieces.Add(name); | 6534 pieces->Add(&name); |
6532 pieces.Add(Symbols::ColonSpace()); | 6535 pieces->Add(&Symbols::ColonSpace()); |
6533 } | 6536 } |
6534 param_type = ParameterTypeAt(i); | 6537 param_type = ParameterTypeAt(i); |
6535 if (instantiate && !param_type.IsInstantiated()) { | 6538 if (instantiate && !param_type.IsInstantiated()) { |
6536 param_type = param_type.InstantiateFrom(instantiator, NULL); | 6539 param_type = param_type.InstantiateFrom(instantiator, NULL); |
6537 } | 6540 } |
6538 ASSERT(!param_type.IsNull()); | 6541 ASSERT(!param_type.IsNull()); |
6539 name = param_type.BuildName(name_visibility); | 6542 const String& name = |
6540 pieces.Add(name); | 6543 String::ZoneHandle(zone, param_type.BuildName(name_visibility)); |
| 6544 pieces->Add(&name); |
6541 if (i != (num_params - 1)) { | 6545 if (i != (num_params - 1)) { |
6542 pieces.Add(Symbols::CommaSpace()); | 6546 pieces->Add(&Symbols::CommaSpace()); |
6543 } | 6547 } |
6544 } | 6548 } |
6545 if (num_opt_pos_params > 0) { | 6549 if (num_opt_pos_params > 0) { |
6546 pieces.Add(Symbols::RBracket()); | 6550 pieces->Add(&Symbols::RBracket()); |
6547 } else { | 6551 } else { |
6548 pieces.Add(Symbols::RBrace()); | 6552 pieces->Add(&Symbols::RBrace()); |
6549 } | 6553 } |
6550 } | 6554 } |
6551 } | 6555 } |
6552 | 6556 |
6553 | 6557 |
6554 RawInstance* Function::ImplicitStaticClosure() const { | 6558 RawInstance* Function::ImplicitStaticClosure() const { |
6555 if (implicit_static_closure() == Instance::null()) { | 6559 if (implicit_static_closure() == Instance::null()) { |
6556 Isolate* isolate = Isolate::Current(); | 6560 Isolate* isolate = Isolate::Current(); |
6557 ObjectStore* object_store = isolate->object_store(); | 6561 ObjectStore* object_store = isolate->object_store(); |
6558 const Context& context = | 6562 const Context& context = |
(...skipping 20 matching lines...) Expand all Loading... |
6579 TypeArguments::Handle(receiver.GetTypeArguments()); | 6583 TypeArguments::Handle(receiver.GetTypeArguments()); |
6580 result.SetTypeArguments(type_arguments); | 6584 result.SetTypeArguments(type_arguments); |
6581 } | 6585 } |
6582 return result.raw(); | 6586 return result.raw(); |
6583 } | 6587 } |
6584 | 6588 |
6585 | 6589 |
6586 RawString* Function::BuildSignature(bool instantiate, | 6590 RawString* Function::BuildSignature(bool instantiate, |
6587 NameVisibility name_visibility, | 6591 NameVisibility name_visibility, |
6588 const TypeArguments& instantiator) const { | 6592 const TypeArguments& instantiator) const { |
6589 const GrowableObjectArray& pieces = | 6593 Thread* thread = Thread::Current(); |
6590 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 6594 Zone* zone = thread->zone(); |
6591 String& name = String::Handle(); | 6595 GrowableArray<const String*> pieces(zone, 4); |
6592 if (!instantiate && !is_static() && (name_visibility == kInternalName)) { | 6596 if (!instantiate && !is_static() && (name_visibility == kInternalName)) { |
6593 // Prefix the signature with its signature class and type parameters, if any | 6597 // Prefix the signature with its signature class and type parameters, if any |
6594 // (e.g. "Map<K, V>(K) => bool"). In case of a function type alias, the | 6598 // (e.g. "Map<K, V>(K) => bool"). In case of a function type alias, the |
6595 // signature class name is the alias name. | 6599 // signature class name is the alias name. |
6596 // The signature of static functions cannot be type parameterized. | 6600 // The signature of static functions cannot be type parameterized. |
6597 const Class& function_class = Class::Handle(Owner()); | 6601 const Class& function_class = Class::Handle(zone, Owner()); |
6598 ASSERT(!function_class.IsNull()); | 6602 ASSERT(!function_class.IsNull()); |
6599 const TypeArguments& type_parameters = TypeArguments::Handle( | 6603 const TypeArguments& type_parameters = TypeArguments::Handle( |
6600 function_class.type_parameters()); | 6604 zone, function_class.type_parameters()); |
6601 if (!type_parameters.IsNull()) { | 6605 if (!type_parameters.IsNull()) { |
6602 const String& function_class_name = String::Handle(function_class.Name()); | 6606 const String& function_class_name = |
6603 pieces.Add(function_class_name); | 6607 String::ZoneHandle(zone, function_class.Name()); |
| 6608 pieces.Add(&function_class_name); |
6604 const intptr_t num_type_parameters = type_parameters.Length(); | 6609 const intptr_t num_type_parameters = type_parameters.Length(); |
6605 pieces.Add(Symbols::LAngleBracket()); | 6610 pieces.Add(&Symbols::LAngleBracket()); |
6606 TypeParameter& type_parameter = TypeParameter::Handle(); | 6611 TypeParameter& type_parameter = TypeParameter::Handle(zone); |
6607 AbstractType& bound = AbstractType::Handle(); | 6612 AbstractType& bound = AbstractType::Handle(zone); |
6608 for (intptr_t i = 0; i < num_type_parameters; i++) { | 6613 for (intptr_t i = 0; i < num_type_parameters; i++) { |
6609 type_parameter ^= type_parameters.TypeAt(i); | 6614 type_parameter ^= type_parameters.TypeAt(i); |
6610 name = type_parameter.name(); | 6615 const String& name = String::ZoneHandle(zone, type_parameter.name()); |
6611 pieces.Add(name); | 6616 pieces.Add(&name); |
6612 bound = type_parameter.bound(); | 6617 bound = type_parameter.bound(); |
6613 if (!bound.IsNull() && !bound.IsObjectType()) { | 6618 if (!bound.IsNull() && !bound.IsObjectType()) { |
6614 pieces.Add(Symbols::SpaceExtendsSpace()); | 6619 pieces.Add(&Symbols::SpaceExtendsSpace()); |
6615 name = bound.BuildName(name_visibility); | 6620 const String& name = |
6616 pieces.Add(name); | 6621 String::ZoneHandle(zone, bound.BuildName(name_visibility)); |
| 6622 pieces.Add(&name); |
6617 } | 6623 } |
6618 if (i < num_type_parameters - 1) { | 6624 if (i < num_type_parameters - 1) { |
6619 pieces.Add(Symbols::CommaSpace()); | 6625 pieces.Add(&Symbols::CommaSpace()); |
6620 } | 6626 } |
6621 } | 6627 } |
6622 pieces.Add(Symbols::RAngleBracket()); | 6628 pieces.Add(&Symbols::RAngleBracket()); |
6623 } | 6629 } |
6624 } | 6630 } |
6625 pieces.Add(Symbols::LParen()); | 6631 pieces.Add(&Symbols::LParen()); |
6626 BuildSignatureParameters(instantiate, | 6632 BuildSignatureParameters(instantiate, |
6627 name_visibility, | 6633 name_visibility, |
6628 instantiator, | 6634 instantiator, |
6629 pieces); | 6635 &pieces); |
6630 pieces.Add(Symbols::RParenArrow()); | 6636 pieces.Add(&Symbols::RParenArrow()); |
6631 AbstractType& res_type = AbstractType::Handle(result_type()); | 6637 AbstractType& res_type = AbstractType::Handle(zone, result_type()); |
6632 if (instantiate && !res_type.IsInstantiated()) { | 6638 if (instantiate && !res_type.IsInstantiated()) { |
6633 res_type = res_type.InstantiateFrom(instantiator, NULL); | 6639 res_type = res_type.InstantiateFrom(instantiator, NULL); |
6634 } | 6640 } |
6635 name = res_type.BuildName(name_visibility); | 6641 const String& name = |
6636 pieces.Add(name); | 6642 String::ZoneHandle(zone, res_type.BuildName(name_visibility)); |
6637 const Array& strings = Array::Handle(Array::MakeArray(pieces)); | 6643 pieces.Add(&name); |
6638 return Symbols::New(String::Handle(String::ConcatAll(strings))); | 6644 return Symbols::FromConcatAll(pieces); |
6639 } | 6645 } |
6640 | 6646 |
6641 | 6647 |
6642 bool Function::HasInstantiatedSignature() const { | 6648 bool Function::HasInstantiatedSignature() const { |
6643 AbstractType& type = AbstractType::Handle(result_type()); | 6649 AbstractType& type = AbstractType::Handle(result_type()); |
6644 if (!type.IsInstantiated()) { | 6650 if (!type.IsInstantiated()) { |
6645 return false; | 6651 return false; |
6646 } | 6652 } |
6647 const intptr_t num_parameters = NumParameters(); | 6653 const intptr_t num_parameters = NumParameters(); |
6648 for (intptr_t i = 0; i < num_parameters; i++) { | 6654 for (intptr_t i = 0; i < num_parameters; i++) { |
(...skipping 14772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21421 return tag_label.ToCString(); | 21427 return tag_label.ToCString(); |
21422 } | 21428 } |
21423 | 21429 |
21424 | 21430 |
21425 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21431 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21426 Instance::PrintJSONImpl(stream, ref); | 21432 Instance::PrintJSONImpl(stream, ref); |
21427 } | 21433 } |
21428 | 21434 |
21429 | 21435 |
21430 } // namespace dart | 21436 } // namespace dart |
OLD | NEW |