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.
This commit is contained in:
parent
4fbb7ccebe
commit
987b670356
6 changed files with 27 additions and 17 deletions
|
@ -1,3 +1,9 @@
|
|||
2020-11-24 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* 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 <brobecker@adacore.com>
|
||||
|
||||
* unittests/gmp-utils-selftests.c (write_fp_test): Use mpq_set_si
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -19,17 +19,24 @@
|
|||
|
||||
/* See gmp-utils.h. */
|
||||
|
||||
gdb::unique_xmalloc_ptr<char>
|
||||
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<char> (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. */
|
||||
|
|
|
@ -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_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<char> 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 "<numerator> / <denominator>". */
|
||||
gdb::unique_xmalloc_ptr<char> 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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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_printf (fmt, f.val);
|
||||
fprintf_filtered (stream, "%s", str.c_str ());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue