diff options
author | Tom Tromey <tromey@adacore.com> | 2023-04-06 09:05:58 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-04-06 10:01:10 -0600 |
commit | 55af06a70e769f4dae10d919f9ea10a802a4aac7 (patch) | |
tree | f87f2cd16480f7b402139e864a0fafaf22b926ef | |
parent | b4f767131f75179df4f47fc40e177f2607fb1003 (diff) | |
download | gdb-55af06a70e769f4dae10d919f9ea10a802a4aac7.zip gdb-55af06a70e769f4dae10d919f9ea10a802a4aac7.tar.gz gdb-55af06a70e769f4dae10d919f9ea10a802a4aac7.tar.bz2 |
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>
-rw-r--r-- | gdb/extension-priv.h | 5 | ||||
-rw-r--r-- | gdb/extension.c | 6 | ||||
-rw-r--r-- | gdb/extension.h | 4 | ||||
-rw-r--r-- | gdb/python/python.c | 10 | ||||
-rw-r--r-- | gdb/typeprint.c | 13 |
5 files changed, 19 insertions, 19 deletions
diff --git a/gdb/extension-priv.h b/gdb/extension-priv.h index 23a9f64..3442302 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<char> *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 4ac6e0b..65f3bab 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<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; diff --git a/gdb/extension.h b/gdb/extension.h index ab83f9c..2b04451 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<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, diff --git a/gdb/python/python.c b/gdb/python/python.c index b295ff8..ea51766 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<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; } diff --git a/gdb/typeprint.c b/gdb/typeprint.c index f59a7c4..06ecd2c 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<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; } |