Add constructor and destructor to demangle_parse_info
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. 2017-01-10 Tom Tromey <tom@tromey.com> * 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.
This commit is contained in:
parent
1ac32117f7
commit
c8b23b3f89
5 changed files with 52 additions and 79 deletions
|
@ -1,3 +1,26 @@
|
|||
2017-01-10 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2017-01-10 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* top.c (prevent_dont_repeat): Change return type.
|
||||
|
|
|
@ -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<demangle_parse_info>
|
||||
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<demangle_parse_info> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info>
|
||||
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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info> 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<demangle_parse_info> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,10 @@ struct using_direct;
|
|||
|
||||
struct demangle_parse_info
|
||||
{
|
||||
demangle_parse_info ();
|
||||
|
||||
~demangle_parse_info ();
|
||||
|
||||
/* The memory used during the parse. */
|
||||
struct demangle_info *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<demangle_parse_info> 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;
|
||||
|
|
|
@ -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<demangle_parse_info> 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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue