diff options
author | Tom Tromey <tom@tromey.com> | 2016-09-22 20:29:11 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2016-10-21 14:17:31 -0600 |
commit | b7b633e9b13fc5697af035f4504c9790c612a8c7 (patch) | |
tree | 0da81b5f31738da5c2aa84819d709a66ef9d4583 /gdb/common | |
parent | 9a1e3f003122c97d6e1822c472bcd37f59fb1a74 (diff) | |
download | gdb-b7b633e9b13fc5697af035f4504c9790c612a8c7.zip gdb-b7b633e9b13fc5697af035f4504c9790c612a8c7.tar.gz gdb-b7b633e9b13fc5697af035f4504c9790c612a8c7.tar.bz2 |
Use RAII to save and restore scalars
This patch replaces many (but not all) uses of
make_cleanup_restore_integer with a simple RAII-based template class.
It also removes the similar restore_execution_direction cleanup in
favor of this new class. Subsequent patches will replace other
similar cleanups with this class.
The class is typically instantiated using make_scoped_restore. This
allows for template argument deduction.
2016-10-21 Tom Tromey <tom@tromey.com>
* common/scoped_restore.h: New file.
* utils.h: Include scoped_restore.h.
* top.c (execute_command_to_string): Use scoped_restore.
* python/python.c (python_interactive_command): Use
scoped_restore.
(python_command, execute_gdb_command): Likewise.
* printcmd.c (do_one_display): Use scoped_restore.
* mi/mi-main.c (exec_continue): Use scoped_restore.
* mi/mi-cmd-var.c (mi_cmd_var_assign): Use scoped_restore.
* linux-fork.c (checkpoint_command): Use scoped_restore.
* infrun.c (restore_execution_direction): Remove.
(fetch_inferior_event): Use scoped_restore.
* compile/compile.c (compile_file_command): Use
scoped_restore.
(compile_code_command, compile_print_command): Likewise.
* cli/cli-script.c (execute_user_command): Use
scoped_restore.
(while_command, if_command, script_from_file): Likewise.
* arm-tdep.c (arm_insert_single_step_breakpoint): Use
scoped_restore.
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/scoped_restore.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/gdb/common/scoped_restore.h b/gdb/common/scoped_restore.h new file mode 100644 index 0000000..8c2a5b0 --- /dev/null +++ b/gdb/common/scoped_restore.h @@ -0,0 +1,99 @@ +/* scoped_restore, a simple class for saving and restoring a value + + Copyright (C) 2016 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef SCOPED_RESTORE_H +#define SCOPED_RESTORE_H + +/* Base class for scoped_restore_tmpl. */ +struct scoped_restore_base +{ +}; + +/* A convenience typedef. Users of make_scoped_restore declare the + local RAII object as having this type. */ +typedef const scoped_restore_base &scoped_restore; + +/* An RAII-based object that saves a variable's value, and then + restores it again when this object is destroyed. */ +template<typename T> +class scoped_restore_tmpl : public scoped_restore_base +{ + public: + + /* Create a new scoped_restore object that saves the current value + of *VAR. *VAR will be restored when this scoped_restore object + is destroyed. */ + scoped_restore_tmpl (T *var) + : m_saved_var (var), + m_saved_value (*var) + { + } + + /* Create a new scoped_restore object that saves the current value + of *VAR, and sets *VAR to VALUE. *VAR will be restored when this + scoped_restore object is destroyed. */ + scoped_restore_tmpl (T *var, T value) + : m_saved_var (var), + m_saved_value (*var) + { + *var = value; + } + + scoped_restore_tmpl (const scoped_restore_tmpl<T> &other) + : m_saved_var (other.m_saved_var), + m_saved_value (other.m_saved_value) + { + other.m_saved_var = NULL; + } + + ~scoped_restore_tmpl () + { + if (m_saved_var != NULL) + *m_saved_var = m_saved_value; + } + + private: + + /* No need for this. It is intentionally not defined anywhere. */ + scoped_restore_tmpl &operator= (const scoped_restore_tmpl &); + + /* The saved variable. */ + mutable T *m_saved_var; + + /* The saved value. */ + const T m_saved_value; +}; + +/* Make a scoped_restore. This is useful because it lets template + argument deduction work. */ +template<typename T> +scoped_restore_tmpl<T> make_scoped_restore (T *var) +{ + return scoped_restore_tmpl<T> (var); +} + +/* Make a scoped_restore. This is useful because it lets template + argument deduction work. */ +template<typename T> +scoped_restore_tmpl<T> make_scoped_restore (T *var, T value) +{ + return scoped_restore_tmpl<T> (var, value); +} + +#endif /* SCOPED_RESTORE_H */ |