From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 82901 invoked by alias); 18 Mar 2016 19:19:00 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 82836 invoked by uid 89); 18 Mar 2016 19:19:00 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=(unknown), cooked, xxx X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 18 Mar 2016 19:18:52 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 8F28FC0586B8 for ; Fri, 18 Mar 2016 19:18:51 +0000 (UTC) Received: from cascais.lan (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2IJIYkH028091 for ; Fri, 18 Mar 2016 15:18:51 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 19/30] ada-lang.c: Introduce type_as_string and use it Date: Fri, 18 Mar 2016 19:19:00 -0000 Message-Id: <1458328714-4938-20-git-send-email-palves@redhat.com> In-Reply-To: <1458328714-4938-1-git-send-email-palves@redhat.com> References: <1458328714-4938-1-git-send-email-palves@redhat.com> X-SW-Source: 2016-03/txt/msg00356.txt.bz2 A couple wrong things here - We should not use target_terminal_ours when all we want is output. We should use target_terminal_ours_for_output instead, which preserves raw/cooked terminal modes, and SIGINT forwarding. - Most importantly, relying on stderr output immediately preceding the error/exception print isn't correct. The exception could be caught and handled, for example; MI frontends won't display the stderr part in an error dialog box. Etc. This commit introduces a type_as_string helper that allows building a full error string including type info. gdb/ChangeLog: yyyy-mm-dd Pedro Alves * ada-lang.c (type_as_string, type_as_string_and_cleanup): New functions. (ada_lookup_struct_elt_type): Use type_as_string_and_cleanup. --- gdb/ada-lang.c | 74 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index d874129..7cdb693 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -7576,6 +7576,39 @@ ada_value_struct_elt (struct value *arg, char *name, int no_err) "a value that is not a record.")); } +/* Return a string representation of type TYPE. Caller must free + result. */ + +static char * +type_as_string (struct type *type) +{ + struct ui_file *tmp_stream = mem_fileopen (); + struct cleanup *old_chain; + char *str; + + tmp_stream = mem_fileopen (); + old_chain = make_cleanup_ui_file_delete (tmp_stream); + + type_print (type, "", tmp_stream, -1); + str = ui_file_xstrdup (tmp_stream, NULL); + + do_cleanups (old_chain); + return str; +} + +/* Return a string representation of type TYPE, and install a cleanup + that releases it. */ + +static char * +type_as_string_and_cleanup (struct type *type) +{ + char *str; + + str = type_as_string (type); + make_cleanup (xfree, str); + return str; +} + /* Given a type TYPE, look up the type of the component of type named NAME. If DISPP is non-null, add its byte displacement from the beginning of a structure (pointed to by a value) of type TYPE to *DISPP (does not @@ -7616,22 +7649,15 @@ ada_lookup_struct_elt_type (struct type *type, char *name, int refok, || (TYPE_CODE (type) != TYPE_CODE_STRUCT && TYPE_CODE (type) != TYPE_CODE_UNION)) { + char *type_str; + if (noerr) return NULL; - else - { - target_terminal_ours (); - gdb_flush (gdb_stdout); - if (type == NULL) - error (_("Type (null) is not a structure or union type")); - else - { - /* XXX: type_sprint */ - fprintf_unfiltered (gdb_stderr, _("Type ")); - type_print (type, "", gdb_stderr, -1); - error (_(" is not a structure or union type")); - } - } + + type_str = (type != NULL + ? type_as_string_and_cleanup (type) + : _("(null)")); + error (_("Type %s is not a structure or union type"), type_str); } type = to_static_fixed_type (type); @@ -7701,22 +7727,10 @@ ada_lookup_struct_elt_type (struct type *type, char *name, int refok, BadName: if (!noerr) { - target_terminal_ours (); - gdb_flush (gdb_stdout); - if (name == NULL) - { - /* XXX: type_sprint */ - fprintf_unfiltered (gdb_stderr, _("Type ")); - type_print (type, "", gdb_stderr, -1); - error (_(" has no component named ")); - } - else - { - /* XXX: type_sprint */ - fprintf_unfiltered (gdb_stderr, _("Type ")); - type_print (type, "", gdb_stderr, -1); - error (_(" has no component named %s"), name); - } + char *name_str = name != NULL ? name : _(""); + + error (_("Type %s has no component named %s"), + type_as_string_and_cleanup (type), name_str); } return NULL; -- 2.5.0