This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Remove cleanups from macro_define_command


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=84f27c6fcbbf580434c7d56e68fa42fe7cf7ccb9

commit 84f27c6fcbbf580434c7d56e68fa42fe7cf7ccb9
Author: Tom Tromey <tom@tromey.com>
Date:   Tue Feb 6 12:25:00 2018 -0700

    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  <tom@tromey.com>
    
    	* macrocmd.c (struct temporary_macro_definition): New.
    	(macro_define_command): Use temporary_macro_definition.  Remove
    	cleanups.
    	(free_macro_definition_ptr): Remove.

Diff:
---
 gdb/ChangeLog  |  7 +++++++
 gdb/macrocmd.c | 42 +++++++++++++++++++++---------------------
 2 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index cf0dfc3..ec219be 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 2018-02-08  Tom Tromey  <tom@tromey.com>
 
+	* 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  <tom@tromey.com>
+
 	* macroexp.c (maybe_expand): Use std::string.
 
 2018-02-08  Tom Tromey  <tom@tromey.com>
diff --git a/gdb/macrocmd.c b/gdb/macrocmd.c
index 13fd95d..e6cf921 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);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]