From patchwork Wed May 3 22:46:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 20250 Received: (qmail 52130 invoked by alias); 3 May 2017 22:46:39 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 52030 invoked by uid 89); 3 May 2017 22:46:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=TRY X-HELO: gproxy8.mail.unifiedlayer.com Received: from gproxy8-pub.mail.unifiedlayer.com (HELO gproxy8.mail.unifiedlayer.com) (67.222.33.93) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 03 May 2017 22:46:35 +0000 Received: from CMOut01 (unknown [10.0.90.82]) by gproxy8.mail.unifiedlayer.com (Postfix) with ESMTP id 0BC661AB11E for ; Wed, 3 May 2017 16:46:37 -0600 (MDT) Received: from box522.bluehost.com ([74.220.219.122]) by CMOut01 with id Fyma1v0032f2jeq01ymdMJ; Wed, 03 May 2017 16:46:37 -0600 X-Authority-Analysis: v=2.2 cv=K+5SJ2eI c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=tJ8p9aeEuA8A:10 a=zstS-IiYAAAA:8 a=mBD2auCVj-hJSk_blYkA:9 a=r2IBmOSBpqL7W9t8:21 a=AJb7Jkz5m-LzCVag:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 75-166-63-71.hlrn.qwest.net ([75.166.63.71]:53090 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1d632X-00051x-Oq; Wed, 03 May 2017 16:46:33 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 10/23] Remove make_cleanup_restore_current_language Date: Wed, 3 May 2017 16:46:13 -0600 Message-Id: <20170503224626.2818-11-tom@tromey.com> In-Reply-To: <20170503224626.2818-1-tom@tromey.com> References: <20170503224626.2818-1-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1d632X-00051x-Oq X-Source-Sender: 75-166-63-71.hlrn.qwest.net (bapiya.Home) [75.166.63.71]:53090 X-Source-Auth: tom+tromey.com X-Email-Count: 17 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This patch replaces make_cleanup_restore_current_language with an RAII class that saves the current language, and restores it when the object is destroyed. 2017-05-02 Tom Tromey * 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 save_language. * mi/mi-main.c (mi_cmd_execute): Use save_language. * language.h (save_language): New class. --- gdb/ChangeLog | 10 ++++++++++ gdb/language.h | 25 +++++++++++++++++++++++++ gdb/mi/mi-main.c | 6 ++---- gdb/parse.c | 22 +++++++--------------- gdb/utils.c | 22 ---------------------- gdb/utils.h | 2 -- 6 files changed, 44 insertions(+), 43 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 50d8794..1c3b738 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2017-05-02 Tom Tromey + * 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 save_language. + * mi/mi-main.c (mi_cmd_execute): Use save_language. + * language.h (save_language): New class. + +2017-05-02 Tom Tromey + * source.c (get_filename_and_charpos, forward_search_command) (reverse_search_command): Use fd_closer. * procfs.c (load_syscalls, proc_get_LDT_entry) diff --git a/gdb/language.h b/gdb/language.h index 58bcbe8..f543da5 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -609,4 +609,29 @@ void default_get_string (struct value *value, gdb_byte **buffer, int *length, void c_get_string (struct value *value, gdb_byte **buffer, int *length, struct type **char_type, const char **charset); +/* Save the current language and restore it upon destruction. */ + +class save_language +{ +public: + + explicit save_language (enum language new_lang) + : m_lang (current_language->la_language) + { + set_language (new_lang); + } + + ~save_language () + { + set_language (m_lang); + } + + save_language (const save_language &) = delete; + save_language &operator= (const save_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 cb68fd6..aa44876 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2242,11 +2242,9 @@ mi_cmd_execute (struct mi_parse *parse) error (_("Invalid frame id: %d"), frame); } + gdb::optional lang_saver; if (parse->language != language_unknown) - { - make_cleanup_restore_current_language (); - set_language (parse->language); - } + lang_saver.emplace (parse->language); current_context = parse; diff --git a/gdb/parse.c b/gdb/parse.c index 3dd7075..84fce19 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -50,6 +50,7 @@ #include "objfiles.h" #include "user-regs.h" #include +#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,8 +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 (); - set_language (lang->la_language); + + save_language lang_saver (lang->la_language); TRY { @@ -1250,7 +1251,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 +1275,11 @@ parse_expression (const char *string) expression_up parse_expression_with_language (const char *string, enum language lang) { - struct cleanup *old_chain = NULL; - + gdb::optional lang_saver; if (current_language->la_language != lang) - { - old_chain = make_cleanup_restore_current_language (); - set_language (lang); - } - - expression_up expr = parse_expression (string); + lang_saver.emplace (lang); - 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 bffce78..1a66896 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -307,28 +307,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 7afb3c5..1f01bdd 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -91,8 +91,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 {