diff --git a/src/core/lib/channel/channel_args.cc b/src/core/lib/channel/channel_args.cc index 95010e332f0..80ac7f7569c 100644 --- a/src/core/lib/channel/channel_args.cc +++ b/src/core/lib/channel/channel_args.cc @@ -280,25 +280,35 @@ absl::optional ChannelArgs::GetBool(absl::string_view name) const { } } -std::string ChannelArgs::Value::ToString() const { - if (rep_.c_vtable() == &int_vtable_) { - return std::to_string(reinterpret_cast(rep_.c_pointer())); - } +absl::string_view ChannelArgs::Value::ToString( + std::list& backing_strings) const { if (rep_.c_vtable() == &string_vtable_) { - return std::string( - static_cast(rep_.c_pointer())->as_string_view()); + return static_cast(rep_.c_pointer())->as_string_view(); + } + if (rep_.c_vtable() == &int_vtable_) { + backing_strings.emplace_back( + std::to_string(reinterpret_cast(rep_.c_pointer()))); + return backing_strings.back(); } - return absl::StrFormat("%p", rep_.c_pointer()); + backing_strings.emplace_back(absl::StrFormat("%p", rep_.c_pointer())); + return backing_strings.back(); } std::string ChannelArgs::ToString() const { - std::vector arg_strings; - args_.ForEach( - [&arg_strings](const RefCountedStringValue& key, const Value& value) { - arg_strings.push_back( - absl::StrCat(key.as_string_view(), "=", value.ToString())); - }); - return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}"); + std::vector strings; + std::list backing_strings; + strings.push_back("{"); + bool first = true; + args_.ForEach([&strings, &first, &backing_strings]( + const RefCountedStringValue& key, const Value& value) { + if (!first) strings.push_back(", "); + first = false; + strings.push_back(key.as_string_view()); + strings.push_back("="); + strings.push_back(value.ToString(backing_strings)); + }); + strings.push_back("}"); + return absl::StrJoin(strings, ""); } ChannelArgs ChannelArgs::UnionWith(ChannelArgs other) const { diff --git a/src/core/lib/channel/channel_args.h b/src/core/lib/channel/channel_args.h index 2c10d955127..c6fc539587d 100644 --- a/src/core/lib/channel/channel_args.h +++ b/src/core/lib/channel/channel_args.h @@ -345,7 +345,7 @@ class ChannelArgs { return &rep_; } - std::string ToString() const; + absl::string_view ToString(std::list& backing) const; grpc_arg MakeCArg(const char* name) const;