From patchwork Tue Nov 29 05:05:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 18030 Received: (qmail 15371 invoked by alias); 29 Nov 2016 05:06:15 -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 14808 invoked by uid 89); 29 Nov 2016 05:06:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=xfree, H*F:U*tom, 7927, 8597 X-HELO: gproxy4-pub.mail.unifiedlayer.com Received: from gproxy4-pub.mail.unifiedlayer.com (HELO gproxy4-pub.mail.unifiedlayer.com) (69.89.23.142) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Tue, 29 Nov 2016 05:06:02 +0000 Received: (qmail 26611 invoked by uid 0); 29 Nov 2016 05:06:00 -0000 Received: from unknown (HELO cmgw2) (10.0.90.83) by gproxy4.mail.unifiedlayer.com with SMTP; 29 Nov 2016 05:06:00 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw2 with id Dh5v1u00x2f2jeq01h5ydX; Mon, 28 Nov 2016 22:05:58 -0700 X-Authority-Analysis: v=2.1 cv=YNIMl32x c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=L24OOQBejmoA:10 a=zstS-IiYAAAA:8 a=UJ_ErvKaB4-GYJfw1ZIA:9 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 71-218-195-233.hlrn.qwest.net ([71.218.195.233]:46172 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1cBac9-0000aB-Cq; Mon, 28 Nov 2016 22:05:57 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 8/8] Add constructor and destructor to demangle_parse_info Date: Mon, 28 Nov 2016 22:05:46 -0700 Message-Id: <1480395946-10924-9-git-send-email-tom@tromey.com> In-Reply-To: <1480395946-10924-1-git-send-email-tom@tromey.com> References: <1480395946-10924-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1cBac9-0000aB-Cq X-Source-Sender: 71-218-195-233.hlrn.qwest.net (bapiya.Home) [71.218.195.233]:46172 X-Source-Auth: tom+tromey.com X-Email-Count: 9 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This adds a constructor and destructor to demangle_parse_info, and then changes all the users to use them. This removes make_cleanup_cp_demangled_name_parse_free and its single use. 2016-11-28 Tom Tromey * python/py-type.c (typy_legacy_template_argument): Update. * cp-support.h (struct demangle_parse_info) (demangle_parse_info, ~demangle_parse_info): Declare new members. (cp_demangled_name_to_comp): Return unique_ptr. (cp_demangled_name_parse_free) (make_cleanup_cp_demangled_name_parse_free) (cp_new_demangle_parse_info): Remove. * cp-support.c (do_demangled_name_parse_free_cleanup) (make_cleanup_cp_demangled_name_parse_free): Remove. (inspect_type, cp_canonicalize_string_full) (cp_canonicalize_string): Update. (mangled_name_to_comp): Change return type. (cp_class_name_from_physname, method_name_from_physname) (cp_func_name, cp_remove_params): Update. * cp-name-parser.y (demangle_parse_info): New constructor, from cp_new_demangle_parse_info. (~demangle_parse_info): New destructor, from cp_demangled_name_parse_free. (cp_merge_demangle_parse_infos): Update. (cp_demangled_name_to_comp): Change return type. --- gdb/ChangeLog | 23 +++++++++++++++++++++++ gdb/cp-name-parser.y | 39 ++++++++++----------------------------- gdb/cp-support.c | 52 +++++++++++++--------------------------------------- gdb/cp-support.h | 11 +++++------ gdb/python/py-type.c | 6 +----- 5 files changed, 52 insertions(+), 79 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d0d2ef6..a117997 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,28 @@ 2016-11-28 Tom Tromey + * python/py-type.c (typy_legacy_template_argument): Update. + * cp-support.h (struct demangle_parse_info) (demangle_parse_info, + ~demangle_parse_info): Declare new members. + (cp_demangled_name_to_comp): Return unique_ptr. + (cp_demangled_name_parse_free) + (make_cleanup_cp_demangled_name_parse_free) + (cp_new_demangle_parse_info): Remove. + * cp-support.c (do_demangled_name_parse_free_cleanup) + (make_cleanup_cp_demangled_name_parse_free): Remove. + (inspect_type, cp_canonicalize_string_full) + (cp_canonicalize_string): Update. + (mangled_name_to_comp): Change return type. + (cp_class_name_from_physname, method_name_from_physname) + (cp_func_name, cp_remove_params): Update. + * cp-name-parser.y (demangle_parse_info): New constructor, from + cp_new_demangle_parse_info. + (~demangle_parse_info): New destructor, from + cp_demangled_name_parse_free. + (cp_merge_demangle_parse_infos): Update. + (cp_demangled_name_to_comp): Change return type. + +2016-11-28 Tom Tromey + * python/python.c (execute_gdb_command): Use unique_xmalloc_ptr. 2016-11-28 Tom Tromey diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y index c6a5c34..6f281ab 100644 --- a/gdb/cp-name-parser.y +++ b/gdb/cp-name-parser.y @@ -1999,29 +1999,19 @@ cp_comp_to_string (struct demangle_component *result, int estimated_len) &err); } -/* A convenience function to allocate and initialize a new struct - demangled_parse_info. */ +/* Constructor for demangle_parse_info. */ -struct demangle_parse_info * -cp_new_demangle_parse_info (void) +demangle_parse_info::demangle_parse_info () +: info (NULL), + tree (NULL) { - struct demangle_parse_info *info; - - info = XNEW (struct demangle_parse_info); - info->info = NULL; - info->tree = NULL; - obstack_init (&info->obstack); - - return info; + obstack_init (&obstack); } -/* Free any memory associated with the given PARSE_INFO. */ +/* Destructor for demangle_parse_info. */ -void -cp_demangled_name_parse_free (struct demangle_parse_info *parse_info) +demangle_parse_info::~demangle_parse_info () { - struct demangle_info *info = parse_info->info; - /* Free any allocated chunks of memory for the parse. */ while (info != NULL) { @@ -2032,15 +2022,11 @@ cp_demangled_name_parse_free (struct demangle_parse_info *parse_info) } /* Free any memory allocated during typedef replacement. */ - obstack_free (&parse_info->obstack, NULL); - - /* Free the parser info. */ - free (parse_info); + obstack_free (&obstack, NULL); } /* Merge the two parse trees given by DEST and SRC. The parse tree in SRC is attached to DEST at the node represented by TARGET. - SRC is then freed. NOTE 1: Since there is no API to merge obstacks, this function does even attempt to try it. Fortunately, we do not (yet?) need this ability. @@ -2067,9 +2053,6 @@ cp_merge_demangle_parse_infos (struct demangle_parse_info *dest, /* Clear the (pointer to) SRC's parse data so that it is not freed when cp_demangled_parse_info_free is called. */ src->info = NULL; - - /* Free SRC. */ - cp_demangled_name_parse_free (src); } /* Convert a demangled name to a demangle_component tree. On success, @@ -2078,11 +2061,10 @@ cp_merge_demangle_parse_infos (struct demangle_parse_info *dest, returned, and an error message will be set in *ERRMSG (which does not need to be freed). */ -struct demangle_parse_info * +struct std::unique_ptr cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg) { static char errbuf[60]; - struct demangle_parse_info *result; prev_lexptr = lexptr = demangled_name; error_lexptr = NULL; @@ -2090,7 +2072,7 @@ cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg) demangle_info = allocate_info (); - result = cp_new_demangle_parse_info (); + std::unique_ptr result (new demangle_parse_info); result->info = demangle_info; if (yyparse ()) @@ -2102,7 +2084,6 @@ cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg) strcat (errbuf, "'"); *errmsg = errbuf; } - cp_demangled_name_parse_free (result); return NULL; } diff --git a/gdb/cp-support.c b/gdb/cp-support.c index d409b0b..a6edb3c 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -95,24 +95,6 @@ copy_string_to_obstack (struct obstack *obstack, const char *string, return (char *) obstack_copy (obstack, string, *len); } -/* 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); -} - /* Return 1 if STRING is clearly already in canonical form. This function is conservative; things which it does not recognize are assumed to be non-canonical, and the parser will sort them out @@ -209,7 +191,7 @@ inspect_type (struct demangle_parse_info *info, long len; int is_anon; struct type *type; - struct demangle_parse_info *i; + std::unique_ptr i; struct ui_file *buf; /* Get the real type of the typedef. */ @@ -272,7 +254,7 @@ inspect_type (struct demangle_parse_info *info, if (i != NULL) { /* Merge the two trees. */ - cp_merge_demangle_parse_infos (info, ret_comp, i); + cp_merge_demangle_parse_infos (info, ret_comp, i.get ()); /* Replace any newly introduced typedefs -- but not if the type is anonymous (that would lead to infinite @@ -540,22 +522,19 @@ cp_canonicalize_string_full (const char *string, { std::string ret; unsigned int estimated_len; - struct demangle_parse_info *info; + std::unique_ptr info; estimated_len = strlen (string) * 2; info = cp_demangled_name_to_comp (string, NULL); if (info != NULL) { /* Replace all the typedefs in the tree. */ - replace_typedefs (info, info->tree, finder, data); + replace_typedefs (info.get (), info->tree, finder, data); /* Convert the tree back into a string. */ ret = cp_comp_to_string (info->tree, estimated_len); gdb_assert (!ret.empty ()); - /* Free the parse information. */ - cp_demangled_name_parse_free (info); - /* Finally, compare the original string with the computed name, returning NULL if they are the same. */ if (ret == string) @@ -581,7 +560,7 @@ cp_canonicalize_string_no_typedefs (const char *string) std::string cp_canonicalize_string (const char *string) { - struct demangle_parse_info *info; + std::unique_ptr info; unsigned int estimated_len; if (cp_already_canonical (string)) @@ -593,7 +572,6 @@ cp_canonicalize_string (const char *string) estimated_len = strlen (string) * 2; std::string ret = cp_comp_to_string (info->tree, estimated_len); - cp_demangled_name_parse_free (info); if (ret.empty ()) { @@ -614,12 +592,11 @@ 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_parse_info * +static std::unique_ptr mangled_name_to_comp (const char *mangled_name, int options, void **memory, char **demangled_p) { char *demangled_name; - struct demangle_parse_info *info; /* If it looks like a v3 mangled name, then try to go directly to trees. */ @@ -631,7 +608,7 @@ mangled_name_to_comp (const char *mangled_name, int options, options, memory); if (ret) { - info = cp_new_demangle_parse_info (); + std::unique_ptr info (new demangle_parse_info); info->tree = ret; *demangled_p = NULL; return info; @@ -646,7 +623,8 @@ mangled_name_to_comp (const char *mangled_name, int options, /* If we could demangle the name, parse it to build the component tree. */ - info = cp_demangled_name_to_comp (demangled_name, NULL); + std::unique_ptr info + (cp_demangled_name_to_comp (demangled_name, NULL)); if (info == NULL) { @@ -666,7 +644,7 @@ cp_class_name_from_physname (const char *physname) void *storage = NULL; char *demangled_name = NULL, *ret; struct demangle_component *ret_comp, *prev_comp, *cur_comp; - struct demangle_parse_info *info; + std::unique_ptr info; int done; info = mangled_name_to_comp (physname, DMGL_ANSI, @@ -745,7 +723,6 @@ cp_class_name_from_physname (const char *physname) xfree (storage); xfree (demangled_name); - cp_demangled_name_parse_free (info); return ret; } @@ -815,7 +792,7 @@ method_name_from_physname (const char *physname) void *storage = NULL; char *demangled_name = NULL, *ret; struct demangle_component *ret_comp; - struct demangle_parse_info *info; + std::unique_ptr info; info = mangled_name_to_comp (physname, DMGL_ANSI, &storage, &demangled_name); @@ -832,7 +809,6 @@ method_name_from_physname (const char *physname) xfree (storage); xfree (demangled_name); - cp_demangled_name_parse_free (info); return ret; } @@ -847,7 +823,7 @@ cp_func_name (const char *full_name) { char *ret; struct demangle_component *ret_comp; - struct demangle_parse_info *info; + std::unique_ptr info; info = cp_demangled_name_to_comp (full_name, NULL); if (!info) @@ -859,7 +835,6 @@ cp_func_name (const char *full_name) if (ret_comp != NULL) ret = cp_comp_to_string (ret_comp, 10); - cp_demangled_name_parse_free (info); return ret; } @@ -872,7 +847,7 @@ cp_remove_params (const char *demangled_name) { int done = 0; struct demangle_component *ret_comp; - struct demangle_parse_info *info; + std::unique_ptr info; char *ret = NULL; if (demangled_name == NULL) @@ -905,7 +880,6 @@ cp_remove_params (const char *demangled_name) if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME) ret = cp_comp_to_string (d_left (ret_comp), 10); - cp_demangled_name_parse_free (info); return ret; } diff --git a/gdb/cp-support.h b/gdb/cp-support.h index ca7a7d4..ffccded 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -58,6 +58,10 @@ struct demangle_parse_info /* Any temporary memory used during typedef replacement. */ struct obstack obstack; + + demangle_parse_info (); + + ~demangle_parse_info (); }; @@ -135,21 +139,16 @@ struct type *cp_find_type_baseclass_by_name (struct type *parent_type, /* Functions from cp-name-parser.y. */ -extern struct demangle_parse_info *cp_demangled_name_to_comp +extern std::unique_ptr cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg); extern char *cp_comp_to_string (struct demangle_component *result, int estimated_len); -extern void cp_demangled_name_parse_free (struct demangle_parse_info *); -extern struct cleanup *make_cleanup_cp_demangled_name_parse_free - (struct demangle_parse_info *); extern void cp_merge_demangle_parse_infos (struct demangle_parse_info *, struct demangle_component *, struct demangle_parse_info *); -extern struct demangle_parse_info *cp_new_demangle_parse_info (void); - /* The list of "maint cplus" commands. */ extern struct cmd_list_element *maint_cplus_cmd_list; diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 5139c92..64b59f1 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -832,7 +832,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block, { int i; struct demangle_component *demangled; - struct demangle_parse_info *info = NULL; + std::unique_ptr info; const char *err; struct type *argtype; struct cleanup *cleanup; @@ -860,7 +860,6 @@ typy_legacy_template_argument (struct type *type, const struct block *block, return NULL; } demangled = info->tree; - cleanup = make_cleanup_cp_demangled_name_parse_free (info); /* Strip off component names. */ while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME @@ -869,7 +868,6 @@ typy_legacy_template_argument (struct type *type, const struct block *block, if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE) { - do_cleanups (cleanup); PyErr_SetString (PyExc_RuntimeError, _("Type is not a template.")); return NULL; } @@ -882,14 +880,12 @@ typy_legacy_template_argument (struct type *type, const struct block *block, if (! demangled) { - do_cleanups (cleanup); PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."), argno); return NULL; } argtype = typy_lookup_type (demangled->u.s_binary.left, block); - do_cleanups (cleanup); if (! argtype) return NULL;