Chromium Code Reviews| Index: runtime/vm/object.cc |
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
| index dddddfb9de4ed94c1d5d25cc1ce9f3cd62fe2a85..8f309311a0ae47e75251f14248f31baa21b4016c 100644 |
| --- a/runtime/vm/object.cc |
| +++ b/runtime/vm/object.cc |
| @@ -6477,12 +6477,10 @@ RawFunction* Function::ImplicitClosureFunction() const { |
| RawString* Function::UserVisibleFormalParameters() const { |
| - const GrowableObjectArray& pieces = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + GrowableArray<const String*> pieces(4); |
|
koda
2015/08/26 17:37:06
Nit, but wouldn't 3 or 5 make more sense? E.g.,
{f
srdjan
2015/08/26 19:43:55
Set to 5 and added comment.
|
| const TypeArguments& instantiator = TypeArguments::Handle(); |
| - BuildSignatureParameters(false, kUserVisibleName, instantiator, pieces); |
| - const Array& strings = Array::Handle(Array::MakeArray(pieces)); |
| - return String::ConcatAll(strings); |
| + BuildSignatureParameters(false, kUserVisibleName, instantiator, &pieces); |
| + return Symbols::FromConcatAll(pieces); |
| } |
| @@ -6490,15 +6488,17 @@ void Function::BuildSignatureParameters( |
| bool instantiate, |
| NameVisibility name_visibility, |
| const TypeArguments& instantiator, |
| - const GrowableObjectArray& pieces) const { |
| - AbstractType& param_type = AbstractType::Handle(); |
| + GrowableArray<const String*>* pieces) const { |
| + Thread* thread = Thread::Current(); |
| + Zone* zone = thread->zone(); |
| + |
| + AbstractType& param_type = AbstractType::Handle(zone); |
| const intptr_t num_params = NumParameters(); |
| const intptr_t num_fixed_params = num_fixed_parameters(); |
| const intptr_t num_opt_pos_params = NumOptionalPositionalParameters(); |
| const intptr_t num_opt_named_params = NumOptionalNamedParameters(); |
| const intptr_t num_opt_params = num_opt_pos_params + num_opt_named_params; |
| ASSERT((num_fixed_params + num_opt_params) == num_params); |
| - String& name = String::Handle(); |
| intptr_t i = 0; |
| if (name_visibility == kUserVisibleName) { |
| // Hide implicit parameters. |
| @@ -6510,42 +6510,44 @@ void Function::BuildSignatureParameters( |
| if (instantiate && !param_type.IsInstantiated()) { |
| param_type = param_type.InstantiateFrom(instantiator, NULL); |
| } |
| - name = param_type.BuildName(name_visibility); |
| - pieces.Add(name); |
| + const String& name = |
| + String::ZoneHandle(zone, param_type.BuildName(name_visibility)); |
| + pieces->Add(&name); |
| if (i != (num_params - 1)) { |
| - pieces.Add(Symbols::CommaSpace()); |
| + pieces->Add(&Symbols::CommaSpace()); |
| } |
| i++; |
| } |
| if (num_opt_params > 0) { |
| if (num_opt_pos_params > 0) { |
| - pieces.Add(Symbols::LBracket()); |
| + pieces->Add(&Symbols::LBracket()); |
| } else { |
| - pieces.Add(Symbols::LBrace()); |
| + pieces->Add(&Symbols::LBrace()); |
| } |
| for (intptr_t i = num_fixed_params; i < num_params; i++) { |
| // The parameter name of an optional positional parameter does not need |
| // to be part of the signature, since it is not used. |
| if (num_opt_named_params > 0) { |
| - name = ParameterNameAt(i); |
| - pieces.Add(name); |
| - pieces.Add(Symbols::ColonSpace()); |
| + const String& name = String::ZoneHandle(zone, ParameterNameAt(i)); |
| + pieces->Add(&name); |
| + pieces->Add(&Symbols::ColonSpace()); |
| } |
| param_type = ParameterTypeAt(i); |
| if (instantiate && !param_type.IsInstantiated()) { |
| param_type = param_type.InstantiateFrom(instantiator, NULL); |
| } |
| ASSERT(!param_type.IsNull()); |
| - name = param_type.BuildName(name_visibility); |
| - pieces.Add(name); |
| + const String& name = |
| + String::ZoneHandle(zone, param_type.BuildName(name_visibility)); |
| + pieces->Add(&name); |
| if (i != (num_params - 1)) { |
| - pieces.Add(Symbols::CommaSpace()); |
| + pieces->Add(&Symbols::CommaSpace()); |
| } |
| } |
| if (num_opt_pos_params > 0) { |
| - pieces.Add(Symbols::RBracket()); |
| + pieces->Add(&Symbols::RBracket()); |
| } else { |
| - pieces.Add(Symbols::RBrace()); |
| + pieces->Add(&Symbols::RBrace()); |
| } |
| } |
| } |
| @@ -6586,56 +6588,58 @@ RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const { |
| RawString* Function::BuildSignature(bool instantiate, |
| NameVisibility name_visibility, |
| const TypeArguments& instantiator) const { |
| - const GrowableObjectArray& pieces = |
| - GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| - String& name = String::Handle(); |
| + Thread* thread = Thread::Current(); |
| + Zone* zone = thread->zone(); |
| + GrowableArray<const String*> pieces(zone, 4); |
|
koda
2015/08/26 17:37:06
Ditto about choosing most common case as default.
srdjan
2015/08/26 19:43:55
Here it is not that clear/typical ('(dynamic) => d
|
| if (!instantiate && !is_static() && (name_visibility == kInternalName)) { |
| // Prefix the signature with its signature class and type parameters, if any |
| // (e.g. "Map<K, V>(K) => bool"). In case of a function type alias, the |
| // signature class name is the alias name. |
| // The signature of static functions cannot be type parameterized. |
| - const Class& function_class = Class::Handle(Owner()); |
| + const Class& function_class = Class::Handle(zone, Owner()); |
| ASSERT(!function_class.IsNull()); |
| const TypeArguments& type_parameters = TypeArguments::Handle( |
| - function_class.type_parameters()); |
| + zone, function_class.type_parameters()); |
| if (!type_parameters.IsNull()) { |
| - const String& function_class_name = String::Handle(function_class.Name()); |
| - pieces.Add(function_class_name); |
| + const String& function_class_name = |
| + String::ZoneHandle(zone, function_class.Name()); |
| + pieces.Add(&function_class_name); |
| const intptr_t num_type_parameters = type_parameters.Length(); |
| - pieces.Add(Symbols::LAngleBracket()); |
| - TypeParameter& type_parameter = TypeParameter::Handle(); |
| - AbstractType& bound = AbstractType::Handle(); |
| + pieces.Add(&Symbols::LAngleBracket()); |
| + TypeParameter& type_parameter = TypeParameter::Handle(zone); |
| + AbstractType& bound = AbstractType::Handle(zone); |
| for (intptr_t i = 0; i < num_type_parameters; i++) { |
| type_parameter ^= type_parameters.TypeAt(i); |
| - name = type_parameter.name(); |
| - pieces.Add(name); |
| + const String& name = String::ZoneHandle(zone, type_parameter.name()); |
| + pieces.Add(&name); |
| bound = type_parameter.bound(); |
| if (!bound.IsNull() && !bound.IsObjectType()) { |
| - pieces.Add(Symbols::SpaceExtendsSpace()); |
| - name = bound.BuildName(name_visibility); |
| - pieces.Add(name); |
| + pieces.Add(&Symbols::SpaceExtendsSpace()); |
| + const String& name = |
| + String::ZoneHandle(zone, bound.BuildName(name_visibility)); |
| + pieces.Add(&name); |
| } |
| if (i < num_type_parameters - 1) { |
| - pieces.Add(Symbols::CommaSpace()); |
| + pieces.Add(&Symbols::CommaSpace()); |
| } |
| } |
| - pieces.Add(Symbols::RAngleBracket()); |
| + pieces.Add(&Symbols::RAngleBracket()); |
| } |
| } |
| - pieces.Add(Symbols::LParen()); |
| + pieces.Add(&Symbols::LParen()); |
| BuildSignatureParameters(instantiate, |
| name_visibility, |
| instantiator, |
| - pieces); |
| - pieces.Add(Symbols::RParenArrow()); |
| - AbstractType& res_type = AbstractType::Handle(result_type()); |
| + &pieces); |
| + pieces.Add(&Symbols::RParenArrow()); |
| + AbstractType& res_type = AbstractType::Handle(zone, result_type()); |
| if (instantiate && !res_type.IsInstantiated()) { |
| res_type = res_type.InstantiateFrom(instantiator, NULL); |
| } |
| - name = res_type.BuildName(name_visibility); |
| - pieces.Add(name); |
| - const Array& strings = Array::Handle(Array::MakeArray(pieces)); |
| - return Symbols::New(String::Handle(String::ConcatAll(strings))); |
| + const String& name = |
| + String::ZoneHandle(zone, res_type.BuildName(name_visibility)); |
| + pieces.Add(&name); |
| + return Symbols::FromConcatAll(pieces); |
| } |