static void
macro_expand_command (const char *exp, int from_tty)
{
- struct macro_scope *ms = NULL;
- char *expanded = NULL;
- struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
-
- make_cleanup (free_current_contents, &expanded);
+ gdb::unique_xmalloc_ptr<struct macro_scope> ms;
+ gdb::unique_xmalloc_ptr<char> expanded;
/* You know, when the user doesn't specify any expression, it would be
really cool if this defaulted to the last expression evaluated.
ms = default_macro_scope ();
if (ms)
{
- expanded = macro_expand (exp, standard_macro_lookup, ms);
+ expanded = macro_expand (exp, standard_macro_lookup, ms.get ());
fputs_filtered ("expands to: ", gdb_stdout);
- fputs_filtered (expanded, gdb_stdout);
+ fputs_filtered (expanded.get (), gdb_stdout);
fputs_filtered ("\n", gdb_stdout);
}
else
macro_inform_no_debuginfo ();
-
- do_cleanups (cleanup_chain);
- return;
}
static void
macro_expand_once_command (const char *exp, int from_tty)
{
- struct macro_scope *ms = NULL;
- char *expanded = NULL;
- struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
- make_cleanup (free_current_contents, &expanded);
+ gdb::unique_xmalloc_ptr<struct macro_scope> ms;
+ gdb::unique_xmalloc_ptr<char> expanded;
/* You know, when the user doesn't specify any expression, it would be
really cool if this defaulted to the last expression evaluated.
ms = default_macro_scope ();
if (ms)
{
- expanded = macro_expand_once (exp, standard_macro_lookup, ms);
+ expanded = macro_expand_once (exp, standard_macro_lookup, ms.get ());
fputs_filtered ("expands to: ", gdb_stdout);
- fputs_filtered (expanded, gdb_stdout);
+ fputs_filtered (expanded.get (), gdb_stdout);
fputs_filtered ("\n", gdb_stdout);
}
else
macro_inform_no_debuginfo ();
-
- do_cleanups (cleanup_chain);
- return;
}
/* Outputs the include path of a macro starting at FILE and LINE to STREAM.
static void
info_macro_command (const char *args, int from_tty)
{
- struct macro_scope *ms = NULL;
- struct cleanup *cleanup_chain;
+ gdb::unique_xmalloc_ptr<struct macro_scope> ms;
const char *name;
int show_all_macros_named = 0;
const char *arg_start = args;
e.g. Scheme's (defmacro ->foo () "bar\n") */
processing_args = 0;
else
- {
- error (_("Unrecognized option '%.*s' to info macro command. "
- "Try \"help info macro\"."),
- int (p - arg_start), arg_start);
- }
+ report_unrecognized_option_error ("info macro", arg_start);
- arg_start = skip_spaces (p);
+ arg_start = skip_spaces (p);
}
name = arg_start;
"whose definition you want to see."));
ms = default_macro_scope ();
- cleanup_chain = make_cleanup (free_current_contents, &ms);
if (! ms)
macro_inform_no_debuginfo ();
show_pp_source_pos (gdb_stdout, ms->file, ms->line);
}
}
-
- do_cleanups (cleanup_chain);
}
/* Implementation of the "info macros" command. */
static void
info_macros_command (const char *args, int from_tty)
{
- struct macro_scope *ms = NULL;
- struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &ms);
+ gdb::unique_xmalloc_ptr<struct macro_scope> ms;
if (args == NULL)
ms = default_macro_scope ();
macro_inform_no_debuginfo ();
else
macro_for_each_in_scope (ms->file, ms->line, print_macro_definition);
-
- do_cleanups (cleanup_chain);
}
\f
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)
skip_ws (&exp);
macro_define_object (macro_main (macro_user_macros), -1, name, exp);
}
-
- do_cleanups (cleanup_chain);
}