diff options
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/language.h | 26 | ||||
-rw-r--r-- | gdb/mi/mi-main.c | 3 | ||||
-rw-r--r-- | gdb/parse.c | 18 | ||||
-rw-r--r-- | gdb/utils.c | 22 | ||||
-rw-r--r-- | gdb/utils.h | 2 |
6 files changed, 47 insertions, 36 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ffdccb8..d8dcb9f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2017-08-03 Tom Tromey <tom@tromey.com> + * utils.h (make_cleanup_restore_current_language): Remove. + * utils.c (do_restore_current_language) + (make_cleanup_restore_current_language): Remove. + * parse.c (parse_exp_in_context_1) + (parse_expression_with_language): Use + scoped_restore_current_language. + * mi/mi-main.c (mi_cmd_execute): Use + scoped_restore_current_language. + * language.h (scoped_restore_current_language): New class. + +2017-08-03 Tom Tromey <tom@tromey.com> + * compile/compile.c (cleanup_unlink_file): Remove. (compile_to_object): Use gdb::unlinker. (eval_compile_command): Likewise. diff --git a/gdb/language.h b/gdb/language.h index f4852c1..57e48bd 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -633,4 +633,30 @@ extern const struct language_defn opencl_language_defn; extern const struct language_defn pascal_language_defn; extern const struct language_defn rust_language_defn; +/* Save the current language and restore it upon destruction. */ + +class scoped_restore_current_language +{ +public: + + explicit scoped_restore_current_language () + : m_lang (current_language->la_language) + { + } + + ~scoped_restore_current_language () + { + set_language (m_lang); + } + + scoped_restore_current_language (const scoped_restore_current_language &) + = delete; + scoped_restore_current_language &operator= + (const scoped_restore_current_language &) = delete; + +private: + + enum language m_lang; +}; + #endif /* defined (LANGUAGE_H) */ diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 53289bb..a4c6ec9 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2243,9 +2243,10 @@ mi_cmd_execute (struct mi_parse *parse) error (_("Invalid frame id: %d"), frame); } + gdb::optional<scoped_restore_current_language> lang_saver; if (parse->language != language_unknown) { - make_cleanup_restore_current_language (); + lang_saver.emplace (); set_language (parse->language); } diff --git a/gdb/parse.c b/gdb/parse.c index 3dd7075..abf59d7 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -50,6 +50,7 @@ #include "objfiles.h" #include "user-regs.h" #include <algorithm> +#include "common/gdb_optional.h" /* Standard set of definitions for printing, dumping, prefixifying, * and evaluating expressions. */ @@ -1136,7 +1137,7 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, const struct block *block, int comma, int void_context_p, int *out_subexp) { - struct cleanup *old_chain, *inner_chain; + struct cleanup *old_chain; const struct language_defn *lang = NULL; struct parser_state ps; int subexp; @@ -1214,7 +1215,8 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, to the value matching SELECTED_FRAME as set by get_current_arch. */ initialize_expout (&ps, 10, lang, get_current_arch ()); - inner_chain = make_cleanup_restore_current_language (); + + scoped_restore_current_language lang_saver; set_language (lang->la_language); TRY @@ -1250,7 +1252,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, if (expressiondebug) dump_prefix_expression (ps.expout, gdb_stdlog); - do_cleanups (inner_chain); discard_cleanups (old_chain); *stringptr = lexptr; @@ -1275,19 +1276,14 @@ parse_expression (const char *string) expression_up parse_expression_with_language (const char *string, enum language lang) { - struct cleanup *old_chain = NULL; - + gdb::optional<scoped_restore_current_language> lang_saver; if (current_language->la_language != lang) { - old_chain = make_cleanup_restore_current_language (); + lang_saver.emplace (); set_language (lang); } - expression_up expr = parse_expression (string); - - if (old_chain != NULL) - do_cleanups (old_chain); - return expr; + return parse_expression (string); } /* Parse STRING as an expression. If parsing ends in the middle of a diff --git a/gdb/utils.c b/gdb/utils.c index c6b5423..ae7ad59 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -286,28 +286,6 @@ make_cleanup_free_so (struct so_list *so) return make_cleanup (do_free_so, so); } -/* Helper for make_cleanup_restore_current_language. */ - -static void -do_restore_current_language (void *p) -{ - enum language saved_lang = (enum language) (uintptr_t) p; - - set_language (saved_lang); -} - -/* Remember the current value of CURRENT_LANGUAGE and make it restored when - the cleanup is run. */ - -struct cleanup * -make_cleanup_restore_current_language (void) -{ - enum language saved_lang = current_language->la_language; - - return make_cleanup (do_restore_current_language, - (void *) (uintptr_t) saved_lang); -} - /* Helper function for make_cleanup_clear_parser_state. */ static void diff --git a/gdb/utils.h b/gdb/utils.h index a6709c0..63cc475 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -113,8 +113,6 @@ extern struct cleanup *make_cleanup_value_free (struct value *); struct so_list; extern struct cleanup *make_cleanup_free_so (struct so_list *so); -extern struct cleanup *make_cleanup_restore_current_language (void); - /* A deleter for a hash table. */ struct htab_deleter { |