Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index dddddfb9de4ed94c1d5d25cc1ce9f3cd62fe2a85..9d22020b1d8ef90e9b1a3a1c948329d8e3fa5b3a 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -6477,12 +6477,12 @@ RawFunction* Function::ImplicitClosureFunction() const { |
RawString* Function::UserVisibleFormalParameters() const { |
- const GrowableObjectArray& pieces = |
- GrowableObjectArray::Handle(GrowableObjectArray::New()); |
+ // Typically 3, 5,.. elements in 'pieces', e.g.: |
+ // '_LoadRequest', CommaSpace, '_LoadError'. |
+ GrowableArray<const String*> pieces(5); |
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 +6490,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 +6512,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 +6590,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); |
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); |
} |