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.
This commit is contained in:
Tom Tromey 2018-02-06 12:25:00 -07:00
parent 0354904bda
commit 84f27c6fcb
2 changed files with 27 additions and 20 deletions

View file

@ -1,3 +1,10 @@
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.

View 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;
temporary_macro_definition ()
{
table = nullptr;
kind = macro_object_like;
argc = 0;
argv = nullptr;
replacement = nullptr;
}
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 ()
{
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);
}