From 84f27c6fcbbf580434c7d56e68fa42fe7cf7ccb9 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 6 Feb 2018 12:25:00 -0700 Subject: [PATCH] Remove cleanups from macro_define_command This removes cleanups from macro_define_command, by introducing a new struct temporary_macro_definition that cleans up after itself. 2018-02-08 Tom Tromey * macrocmd.c (struct temporary_macro_definition): New. (macro_define_command): Use temporary_macro_definition. Remove cleanups. (free_macro_definition_ptr): Remove. --- gdb/ChangeLog | 7 +++++++ gdb/macrocmd.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cf0dfc31b33..ec219be2ae9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2018-02-08 Tom Tromey + + * macrocmd.c (struct temporary_macro_definition): New. + (macro_define_command): Use temporary_macro_definition. Remove + cleanups. + (free_macro_definition_ptr): Remove. + 2018-02-08 Tom Tromey * macroexp.c (maybe_expand): Use std::string. diff --git a/gdb/macrocmd.c b/gdb/macrocmd.c index 13fd95d7daf..e6cf921a1b5 100644 --- a/gdb/macrocmd.c +++ b/gdb/macrocmd.c @@ -324,35 +324,37 @@ extract_identifier (const char **expp, int is_parameter) return result; } -/* Helper function to clean up a temporarily-constructed macro object. - This assumes that the contents were all allocated with xmalloc. */ -static void -free_macro_definition_ptr (void *ptr) +struct temporary_macro_definition : public macro_definition { - int i; - struct macro_definition *loc = (struct macro_definition *) ptr; - - for (i = 0; i < loc->argc; ++i) - xfree ((char *) loc->argv[i]); - xfree ((char *) loc->argv); - /* Note that the 'replacement' field is not allocated. */ -} + temporary_macro_definition () + { + table = nullptr; + kind = macro_object_like; + argc = 0; + argv = nullptr; + replacement = nullptr; + } + + ~temporary_macro_definition () + { + int i; + + for (i = 0; i < argc; ++i) + xfree ((char *) argv[i]); + xfree ((char *) argv); + /* Note that the 'replacement' field is not allocated. */ + } +}; static void macro_define_command (const char *exp, int from_tty) { - struct macro_definition new_macro; + temporary_macro_definition new_macro; char *name = NULL; - struct cleanup *cleanup_chain; if (!exp) error (_("usage: macro define NAME[(ARGUMENT-LIST)] [REPLACEMENT-LIST]")); - cleanup_chain = make_cleanup (free_macro_definition_ptr, &new_macro); - make_cleanup (free_current_contents, &name); - - memset (&new_macro, 0, sizeof (struct macro_definition)); - skip_ws (&exp); name = extract_identifier (&exp, 0); if (! name) @@ -415,8 +417,6 @@ macro_define_command (const char *exp, int from_tty) skip_ws (&exp); macro_define_object (macro_main (macro_user_macros), -1, name, exp); } - - do_cleanups (cleanup_chain); } -- 2.30.2