From 987b670356322ba4d493f441855bf5dc8d946e9f Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Mon, 23 Nov 2020 21:45:35 -0500 Subject: [PATCH] change and rename gmp_string_asprintf to return an std::string 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_printf): Rename from gmp_string_asprintf. Change return type to std::string. Update all callers. * gmp-utils.c (gmp_string_printf): Likewise. --- gdb/ChangeLog | 6 ++++++ gdb/gdbtypes.c | 2 +- gdb/gmp-utils.c | 17 ++++++++++++----- gdb/gmp-utils.h | 10 ++++------ gdb/typeprint.c | 5 ++--- gdb/valprint.c | 4 ++-- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bd74aa55e5b..2cb64da1fdd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-11-24 Joel Brobecker + + * gmp-utils.h (gmp_string_printf): Rename from gmp_string_asprintf. + Change return type to std::string. Update all callers. + * gmp-utils.c (gmp_string_printf): Likewise. + 2020-11-24 Joel Brobecker * unittests/gmp-utils-selftests.c (write_fp_test): Use mpq_set_si diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index e6f70bbe2d3..3879eebd894 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -4927,7 +4927,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 db92e57316c..44fe156d32d 100644 --- a/gdb/gmp-utils.c +++ b/gdb/gmp-utils.c @@ -19,17 +19,24 @@ /* See gmp-utils.h. */ -gdb::unique_xmalloc_ptr -gmp_string_asprintf (const char *fmt, ...) +std::string +gmp_string_printf (const char *fmt, ...) { va_list vp; - char *buf; va_start (vp, fmt); - gmp_vasprintf (&buf, fmt, vp); + int size = gmp_vsnprintf (NULL, 0, fmt, vp); va_end (vp); - return gdb::unique_xmalloc_ptr (buf); + std::string str (size, '\0'); + + /* C++11 and later guarantee std::string uses contiguous memory and + always includes the terminating '\0'. */ + va_start (vp, fmt); + gmp_vsprintf (&str[0], fmt, vp); + va_end (vp); + + return str; } /* See gmp-utils.h. */ diff --git a/gdb/gmp-utils.h b/gdb/gmp-utils.h index 1214b645367..59965e504c5 100644 --- a/gdb/gmp-utils.h +++ b/gdb/gmp-utils.h @@ -29,9 +29,9 @@ #include #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 gmp_string_asprintf (const char *fmt, ...); +std::string gmp_string_printf (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 str () const - { return gmp_string_asprintf ("%Zd", val); } + std::string str () const { return gmp_string_printf ("%Zd", val); } /* The destructor. */ ~gdb_mpz () { mpz_clear (val); } @@ -163,8 +162,7 @@ struct gdb_mpq } /* Return a string representing VAL as " / ". */ - gdb::unique_xmalloc_ptr str () const - { return gmp_string_asprintf ("%Qd", val); } + std::string str () const { return gmp_string_printf ("%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 f947faf315f..0dd3b1c4821 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 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 38ae0bdf0e2..b102ff4b571 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 str = gmp_string_asprintf (fmt, f.val); - fprintf_filtered (stream, "%s", str.get ()); + std::string str = gmp_string_printf (fmt, f.val); + fprintf_filtered (stream, "%s", str.c_str ()); } } -- 2.30.2