[RFA 1/6] change gmp_string_asprintf to return an std::string

Joel Brobecker
2020-11-15T08:49:58Z

This was suggested by Simon during a code review of this package upstream.
The upside is that this makes the function's API more natural and C++.
The downside is an extra malloc, which might be the reason why we went
for using a unique_xmalloc_ptr in the first place. Since this function
is not expected to be called frequently, the API improvement might be
worth the performance impact.

gdb/ChangeLog:

* gmp-utils.h (gmp_string_asprintf): Change return type to
std::string. Update all callers.
* gmp-utils.c (gmp_string_asprintf): Likewise.
---
gdb/gdbtypes.c | 2 +-
gdb/gmp-utils.c | 6 ++++--
gdb/gmp-utils.h | 10 ++++------
gdb/typeprint.c | 5 ++---
gdb/valprint.c | 4 ++--
5 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 2f92887..1c1b0ff 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -4922,7 +4922,7 @@ static void
print_fixed_point_type_info (struct type *type, int spaces)
{
printfi_filtered (spaces + 2, "scaling factor: %s\n",
- fixed_point_scaling_factor (type).str ().get ());
+ fixed_point_scaling_factor (type).str ().c_str ());
}

static struct obstack dont_print_type_obstack;
diff --git a/gdb/gmp-utils.c b/gdb/gmp-utils.c
index db92e57..b70aaa3 100644
--- a/gdb/gmp-utils.c
+++ b/gdb/gmp-utils.c
@@ -19,7 +19,7 @@

/* See gmp-utils.h. */

-gdb::unique_xmalloc_ptr<char>
+std::string
gmp_string_asprintf (const char *fmt, ...)
{
va_list vp;
@@ -29,7 +29,9 @@ gmp_string_asprintf (const char *fmt, ...)
gmp_vasprintf (&buf, fmt, vp);
va_end (vp);

- return gdb::unique_xmalloc_ptr<char> (buf);
+ std::string result(buf);
+ xfree (buf);
+ return result;
}

/* See gmp-utils.h. */
diff --git a/gdb/gmp-utils.h b/gdb/gmp-utils.h
index 1214b64..7eed29a 100644
--- a/gdb/gmp-utils.h
+++ b/gdb/gmp-utils.h
@@ -29,9 +29,9 @@
#include <gmp.h>
#include "gdbsupport/traits.h"

-/* Same as gmp_asprintf, but returning a convenient wrapper type. */
+/* Same as gmp_asprintf, but returning an std::string. */

-gdb::unique_xmalloc_ptr<char> gmp_string_asprintf (const char *fmt, ...);
+std::string gmp_string_asprintf (const char *fmt, ...);

/* A class to make it easier to use GMP's mpz_t values within GDB. */

@@ -110,8 +110,7 @@ struct gdb_mpz
bool unsigned_p) const;

/* Return a string containing VAL. */
- gdb::unique_xmalloc_ptr<char> str () const
- { return gmp_string_asprintf ("%Zd", val); }
+ std::string str () const { return gmp_string_asprintf ("%Zd", val); }

/* The destructor. */
~gdb_mpz () { mpz_clear (val); }
@@ -163,8 +162,7 @@ struct gdb_mpq
}

/* Return a string representing VAL as "<numerator> / <denominator>". */
- gdb::unique_xmalloc_ptr<char> str () const
- { return gmp_string_asprintf ("%Qd", val); }
+ std::string str () const { return gmp_string_asprintf ("%Qd", val); }

/* Return VAL rounded to the nearest integer. */
gdb_mpz get_rounded () const;
diff --git a/gdb/typeprint.c b/gdb/typeprint.c
index f947faf..0dd3b1c 100644
--- a/gdb/typeprint.c
+++ b/gdb/typeprint.c
@@ -667,11 +667,10 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream)
void
print_type_fixed_point (struct type *type, struct ui_file *stream)
{
- gdb::unique_xmalloc_ptr<char> small_img
- = fixed_point_scaling_factor (type).str ();
+ std::string small_img = fixed_point_scaling_factor (type).str ();

fprintf_filtered (stream, "%s-byte fixed point (small = %s)",
- pulongest (TYPE_LENGTH (type)), small_img.get ());
+ pulongest (TYPE_LENGTH (type)), small_img.c_str ());
}

/* Dump details of a type specified either directly or indirectly.
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 38ae0bd..abef002 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -814,8 +814,8 @@ generic_val_print_fixed_point (struct value *val, struct ui_file *stream,
fixed_point_scaling_factor (type));

const char *fmt = TYPE_LENGTH (type) < 4 ? "%.11Fg" : "%.17Fg";
- gdb::unique_xmalloc_ptr<char> str = gmp_string_asprintf (fmt, f.val);
- fprintf_filtered (stream, "%s", str.get ());
+ std::string str = gmp_string_asprintf (fmt, f.val);
+ fprintf_filtered (stream, "%s", str.c_str ());
}
}

--
2.1.4