Use unique_xmalloc_ptr in apply_ext_lang_type_printers
This changes apply_ext_lang_type_printers to use unique_xmalloc_ptr, removing some manual memory management. Regression tested on x86-64 Fedora 36. Approved-By: Simon Marchi <simon.marchi@efficios.com>
This commit is contained in:
parent
b4f767131f
commit
55af06a70e
@ -137,7 +137,7 @@ struct extension_language_ops
|
||||
struct ext_lang_type_printers *);
|
||||
|
||||
/* Try to pretty-print TYPE. If successful the pretty-printed type is
|
||||
stored in *PRETTIED_TYPE, and the caller must free it.
|
||||
stored in *PRETTIED_TYPE.
|
||||
Returns EXT_LANG_RC_OK upon success, EXT_LANG_RC_NOP if the type
|
||||
is not recognized, and EXT_LANG_RC_ERROR if an error was encountered.
|
||||
This function has a bit of a funny name, since it actually applies
|
||||
@ -146,7 +146,8 @@ struct extension_language_ops
|
||||
enum ext_lang_rc (*apply_type_printers)
|
||||
(const struct extension_language_defn *,
|
||||
const struct ext_lang_type_printers *,
|
||||
struct type *, char **prettied_type);
|
||||
struct type *,
|
||||
gdb::unique_xmalloc_ptr<char> *prettied_type);
|
||||
|
||||
/* Called after a type has been printed to give the type pretty-printer
|
||||
mechanism an opportunity to clean up. */
|
||||
|
@ -418,13 +418,13 @@ ext_lang_type_printers::ext_lang_type_printers ()
|
||||
returning the result of the first one that succeeds.
|
||||
If there was an error, or if no printer succeeds, then NULL is returned. */
|
||||
|
||||
char *
|
||||
gdb::unique_xmalloc_ptr<char>
|
||||
apply_ext_lang_type_printers (struct ext_lang_type_printers *printers,
|
||||
struct type *type)
|
||||
{
|
||||
for (const struct extension_language_defn *extlang : extension_languages)
|
||||
{
|
||||
char *result = NULL;
|
||||
gdb::unique_xmalloc_ptr<char> result;
|
||||
enum ext_lang_rc rc;
|
||||
|
||||
if (extlang->ops == nullptr
|
||||
@ -435,7 +435,7 @@ apply_ext_lang_type_printers (struct ext_lang_type_printers *printers,
|
||||
switch (rc)
|
||||
{
|
||||
case EXT_LANG_RC_OK:
|
||||
gdb_assert (result != NULL);
|
||||
gdb_assert (result != nullptr);
|
||||
return result;
|
||||
case EXT_LANG_RC_ERROR:
|
||||
return NULL;
|
||||
|
@ -282,8 +282,8 @@ extern void eval_ext_lang_from_control_command (struct command_line *cmd);
|
||||
|
||||
extern void auto_load_ext_lang_scripts_for_objfile (struct objfile *);
|
||||
|
||||
extern char *apply_ext_lang_type_printers (struct ext_lang_type_printers *,
|
||||
struct type *);
|
||||
extern gdb::unique_xmalloc_ptr<char> apply_ext_lang_type_printers
|
||||
(struct ext_lang_type_printers *, struct type *);
|
||||
|
||||
extern int apply_ext_lang_val_pretty_printer
|
||||
(struct value *value, struct ui_file *stream, int recurse,
|
||||
|
@ -112,7 +112,8 @@ static void gdbpy_start_type_printers (const struct extension_language_defn *,
|
||||
struct ext_lang_type_printers *);
|
||||
static enum ext_lang_rc gdbpy_apply_type_printers
|
||||
(const struct extension_language_defn *,
|
||||
const struct ext_lang_type_printers *, struct type *, char **);
|
||||
const struct ext_lang_type_printers *, struct type *,
|
||||
gdb::unique_xmalloc_ptr<char> *);
|
||||
static void gdbpy_free_type_printers (const struct extension_language_defn *,
|
||||
struct ext_lang_type_printers *);
|
||||
static void gdbpy_set_quit_flag (const struct extension_language_defn *);
|
||||
@ -1700,7 +1701,7 @@ gdbpy_start_type_printers (const struct extension_language_defn *extlang,
|
||||
|
||||
/* If TYPE is recognized by some type printer, store in *PRETTIED_TYPE
|
||||
a newly allocated string holding the type's replacement name, and return
|
||||
EXT_LANG_RC_OK. The caller is responsible for freeing the string.
|
||||
EXT_LANG_RC_OK.
|
||||
If there's a Python error return EXT_LANG_RC_ERROR.
|
||||
Otherwise, return EXT_LANG_RC_NOP.
|
||||
This is the extension_language_ops.apply_type_printers "method". */
|
||||
@ -1708,7 +1709,8 @@ gdbpy_start_type_printers (const struct extension_language_defn *extlang,
|
||||
static enum ext_lang_rc
|
||||
gdbpy_apply_type_printers (const struct extension_language_defn *extlang,
|
||||
const struct ext_lang_type_printers *ext_printers,
|
||||
struct type *type, char **prettied_type)
|
||||
struct type *type,
|
||||
gdb::unique_xmalloc_ptr<char> *prettied_type)
|
||||
{
|
||||
PyObject *printers_obj = (PyObject *) ext_printers->py_type_printers;
|
||||
gdb::unique_xmalloc_ptr<char> result;
|
||||
@ -1763,7 +1765,7 @@ gdbpy_apply_type_printers (const struct extension_language_defn *extlang,
|
||||
return EXT_LANG_RC_ERROR;
|
||||
}
|
||||
|
||||
*prettied_type = result.release ();
|
||||
*prettied_type = std::move (result);
|
||||
return EXT_LANG_RC_OK;
|
||||
}
|
||||
|
||||
|
@ -309,7 +309,6 @@ const char *
|
||||
typedef_hash_table::find_global_typedef (const struct type_print_options *flags,
|
||||
struct type *t)
|
||||
{
|
||||
char *applied;
|
||||
void **slot;
|
||||
struct decl_field tf, *new_tf;
|
||||
|
||||
@ -334,14 +333,12 @@ typedef_hash_table::find_global_typedef (const struct type_print_options *flags,
|
||||
|
||||
*slot = new_tf;
|
||||
|
||||
applied = apply_ext_lang_type_printers (flags->global_printers, t);
|
||||
gdb::unique_xmalloc_ptr<char> applied
|
||||
= apply_ext_lang_type_printers (flags->global_printers, t);
|
||||
|
||||
if (applied != NULL)
|
||||
{
|
||||
new_tf->name = obstack_strdup (&flags->global_typedefs->m_storage,
|
||||
applied);
|
||||
xfree (applied);
|
||||
}
|
||||
if (applied != nullptr)
|
||||
new_tf->name = obstack_strdup (&flags->global_typedefs->m_storage,
|
||||
applied.get ());
|
||||
|
||||
return new_tf->name;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user