From 55af06a70e769f4dae10d919f9ea10a802a4aac7 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 6 Apr 2023 09:05:58 -0600 Subject: [PATCH] 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 --- gdb/extension-priv.h | 5 +++-- gdb/extension.c | 6 +++--- gdb/extension.h | 4 ++-- gdb/python/python.c | 10 ++++++---- gdb/typeprint.c | 13 +++++-------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/gdb/extension-priv.h b/gdb/extension-priv.h index 23a9f646d12..3442302a0be 100644 --- a/gdb/extension-priv.h +++ b/gdb/extension-priv.h @@ -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 *prettied_type); /* Called after a type has been printed to give the type pretty-printer mechanism an opportunity to clean up. */ diff --git a/gdb/extension.c b/gdb/extension.c index 4ac6e0b6732..65f3bab32a7 100644 --- a/gdb/extension.c +++ b/gdb/extension.c @@ -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 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 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; diff --git a/gdb/extension.h b/gdb/extension.h index ab83f9c6a28..2b0445133d3 100644 --- a/gdb/extension.h +++ b/gdb/extension.h @@ -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 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, diff --git a/gdb/python/python.c b/gdb/python/python.c index b295ff88743..ea51766ec3e 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -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 *); 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 *prettied_type) { PyObject *printers_obj = (PyObject *) ext_printers->py_type_printers; gdb::unique_xmalloc_ptr 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; } diff --git a/gdb/typeprint.c b/gdb/typeprint.c index f59a7c4f107..06ecd2c4776 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -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 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; } -- 2.30.2