Remove cleanups from macro_define_command
authorTom Tromey <tom@tromey.com>
Tue, 6 Feb 2018 19:25:00 +0000 (12:25 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 8 Feb 2018 18:46:56 +0000 (11:46 -0700)
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.

gdb/ChangeLog
gdb/macrocmd.c

index cf0dfc3..ec219be 100644 (file)
@@ -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>
index 13fd95d..e6cf921 100644 (file)
@@ -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);
 }