From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8045 invoked by alias); 2 Aug 2011 20:28:46 -0000 Received: (qmail 7966 invoked by uid 22791); 2 Aug 2011 20:28:44 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 02 Aug 2011 20:28:30 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p72KSUBG007160 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 2 Aug 2011 16:28:30 -0400 Received: from host1.jankratochvil.net (ovpn-116-16.ams2.redhat.com [10.36.116.16]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p72KSSLY002354 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 2 Aug 2011 16:28:29 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p72KSRCK015174; Tue, 2 Aug 2011 22:28:27 +0200 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p72KSQTG015169; Tue, 2 Aug 2011 22:28:26 +0200 Date: Tue, 02 Aug 2011 20:28:00 -0000 From: Jan Kratochvil To: Keith Seitz Cc: gdb-patches@sourceware.org Subject: Re: [RFA] c++/12266 (again) [cp_demangled_name_parse_free-4.patch] Message-ID: <20110802202825.GA13092@host1.jankratochvil.net> References: <4E31EE1A.5040204@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4E31EE1A.5040204@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 X-SW-Source: 2011-08/txt/msg00037.txt.bz2 On Fri, 29 Jul 2011 01:17:46 +0200, Keith Seitz wrote: > diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y > index 8736777..f745a31 100644 > --- a/gdb/cp-name-parser.y > +++ b/gdb/cp-name-parser.y [...] > +/* A cleanup wrapper for cp_demangled_name_parse_free. */ > + > +static void > +do_demangled_name_parse_free_cleanup (void *data) > +{ > + struct demangle_parse_info *info = (struct demangle_parse_info *) data; > + > + cp_demangled_name_parse_free (info); > +} > + > +/* Create a cleanup for C++ name parsing. */ > + > +struct cleanup * > +make_cleanup_cp_demangled_name_parse_free (struct demangle_parse_info *info) > +{ > + return make_cleanup (do_demangled_name_parse_free_cleanup, info); > +} $ make test-cp-name-parser cp-name-parser.y:2018: undefined reference to `make_cleanup' [...] > -struct demangle_component * > +struct demangle_parse_info * > cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg) > { > static char errbuf[60]; > - struct demangle_component *result; > + struct demangle_parse_info *result; > > prev_lexptr = lexptr = demangled_name; > error_lexptr = NULL; > global_errmsg = NULL; > > - allocate_info (); > + demangle_info = allocate_info (); > + > + result = ((struct demangle_parse_info *) > + malloc (sizeof (struct demangle_parse_info))); This cast seems redundant to me. [...] > @@ -153,23 +154,29 @@ cp_canonicalize_string (const char *string) > freed when finished with the tree, or NULL if none was needed. > OPTIONS will be passed to the demangler. */ > > -static struct demangle_component * > +static struct demangle_parse_info * > mangled_name_to_comp (const char *mangled_name, int options, > void **memory, char **demangled_p) > { > - struct demangle_component *ret; > char *demangled_name; > + struct demangle_parse_info *info; > > /* If it looks like a v3 mangled name, then try to go directly > to trees. */ > if (mangled_name[0] == '_' && mangled_name[1] == 'Z') > { > + struct demangle_component *ret; > + > ret = cplus_demangle_v3_components (mangled_name, > options, memory); > if (ret) > { > + info = ((struct demangle_parse_info *) > + xmalloc (sizeof (struct demangle_parse_info))); Redundant cast. [...] > --- a/gdb/cp-support.h > +++ b/gdb/cp-support.h > @@ -46,6 +46,17 @@ struct demangle_component; > > #define CP_ANONYMOUS_NAMESPACE_LEN 21 > > +/* The result of parsing a name. */ > + > +struct demangle_parse_info > +{ > + /* The memory used during the parse. */ > + struct demangle_info *info; > + > + /* The result of the parse. */ > + struct demangle_component *tree; > +}; I guess you have been considering it but anyway: Its ->tree items can reference for s_name the original string being demangled, as you even state in some comments. Due to it it also requires later explicit handling of `free_list'. Could this struct already have the original string duplicated and this struct would track its freeing? cp_merge_demangle_parse_infos would then track all the source strings in the merged destination demangle_parse_info. Thanks, Jan