Replace clear_hook_in_cleanup with scoped_restore_hook_in

This removes clear_hook_in_cleanup in favor of a scoped_restore-like
class.  scoped_restore itself can't be used because hook_in is a
bitfield.

ChangeLog
2017-09-11  Tom Tromey  <tom@tromey.com>

	* cli/cli-script.c (class scoped_restore_hook_in): New.
	(clear_hook_in_cleanup): Remove.
	(execute_cmd_pre_hook, execute_cmd_post_hook): Use
	scoped_restore_hook_in.
This commit is contained in:
Tom Tromey 2017-08-13 14:44:08 -06:00
parent be0d7abb5e
commit a9921622de
2 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2017-09-11 Tom Tromey <tom@tromey.com>
* cli/cli-script.c (class scoped_restore_hook_in): New.
(clear_hook_in_cleanup): Remove.
(execute_cmd_pre_hook, execute_cmd_post_hook): Use
scoped_restore_hook_in.
2017-09-11 Tom Tromey <tom@tromey.com>
* cli/cli-script.c (restore_interp): Remove.

View File

@ -340,23 +340,36 @@ print_command_lines (struct ui_out *uiout, struct command_line *cmd,
/* Handle pre-post hooks. */
static void
clear_hook_in_cleanup (void *data)
class scoped_restore_hook_in
{
struct cmd_list_element *c = (struct cmd_list_element *) data;
public:
c->hook_in = 0; /* Allow hook to work again once it is complete. */
}
scoped_restore_hook_in (struct cmd_list_element *c)
: m_cmd (c)
{
}
~scoped_restore_hook_in ()
{
m_cmd->hook_in = 0;
}
scoped_restore_hook_in (const scoped_restore_hook_in &) = delete;
scoped_restore_hook_in &operator= (const scoped_restore_hook_in &) = delete;
private:
struct cmd_list_element *m_cmd;
};
void
execute_cmd_pre_hook (struct cmd_list_element *c)
{
if ((c->hook_pre) && (!c->hook_in))
{
struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c);
scoped_restore_hook_in restore_hook (c);
c->hook_in = 1; /* Prevent recursive hooking. */
execute_user_command (c->hook_pre, (char *) 0);
do_cleanups (cleanups);
}
}
@ -365,11 +378,9 @@ execute_cmd_post_hook (struct cmd_list_element *c)
{
if ((c->hook_post) && (!c->hook_in))
{
struct cleanup *cleanups = make_cleanup (clear_hook_in_cleanup, c);
scoped_restore_hook_in restore_hook (c);
c->hook_in = 1; /* Prevent recursive hooking. */
execute_user_command (c->hook_post, (char *) 0);
do_cleanups (cleanups);
}
}