Remove a static buffer from cp-name-parser.y

This removes a static buffer from cp-name-parser.y by replacing the
fixed-sized buffer with a std::string out parameter.

gdb/ChangeLog
2018-06-01  Tom Tromey  <tom@tromey.com>

	* python/py-type.c (typy_legacy_template_argument): Update.
	* cp-support.h (cp_demangled_name_to_comp): Update.
	* cp-name-parser.y (cp_demangled_name_to_comp): Change errmsg
	parameter to be a "std::string *".
	(main): Update.
This commit is contained in:
Tom Tromey 2018-05-23 21:05:52 -06:00
parent e9cb46ab59
commit 3513a6bb20
4 changed files with 20 additions and 16 deletions

View file

@ -1,3 +1,11 @@
2018-06-01 Tom Tromey <tom@tromey.com>
* python/py-type.c (typy_legacy_template_argument): Update.
* cp-support.h (cp_demangled_name_to_comp): Update.
* cp-name-parser.y (cp_demangled_name_to_comp): Change errmsg
parameter to be a "std::string *".
(main): Update.
2018-06-01 H.J. Lu <hongjiu.lu@intel.com> 2018-06-01 H.J. Lu <hongjiu.lu@intel.com>
* ada-lex.l: Include "diagnostics.h" instead of * ada-lex.l: Include "diagnostics.h" instead of

View file

@ -2033,13 +2033,12 @@ cp_merge_demangle_parse_infos (struct demangle_parse_info *dest,
/* Convert a demangled name to a demangle_component tree. On success, /* Convert a demangled name to a demangle_component tree. On success,
a structure containing the root of the new tree is returned. On a structure containing the root of the new tree is returned. On
error, NULL is returned, and an error message will be set in error, NULL is returned, and an error message will be set in
*ERRMSG (which does not need to be freed). */ *ERRMSG. */
struct std::unique_ptr<demangle_parse_info> struct std::unique_ptr<demangle_parse_info>
cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg) cp_demangled_name_to_comp (const char *demangled_name,
std::string *errmsg)
{ {
static char errbuf[60];
prev_lexptr = lexptr = demangled_name; prev_lexptr = lexptr = demangled_name;
error_lexptr = NULL; error_lexptr = NULL;
global_errmsg = NULL; global_errmsg = NULL;
@ -2052,12 +2051,8 @@ cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
if (yyparse ()) if (yyparse ())
{ {
if (global_errmsg && errmsg) if (global_errmsg && errmsg)
{ *errmsg = string_printf ("%s, near `%s'", global_errmsg,
snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s", error_lexptr);
global_errmsg, error_lexptr);
strcat (errbuf, "'");
*errmsg = errbuf;
}
return NULL; return NULL;
} }
@ -2133,7 +2128,6 @@ main (int argc, char **argv)
char *str2, *extra_chars, c; char *str2, *extra_chars, c;
char buf[65536]; char buf[65536];
int arg; int arg;
const char *errmsg;
arg = 1; arg = 1;
if (argv[arg] && strcmp (argv[arg], "--debug") == 0) if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
@ -2160,11 +2154,12 @@ main (int argc, char **argv)
continue; continue;
} }
std::string errmsg;
std::unique_ptr<demangle_parse_info> result std::unique_ptr<demangle_parse_info> result
= cp_demangled_name_to_comp (str2, &errmsg); = cp_demangled_name_to_comp (str2, &errmsg);
if (result == NULL) if (result == NULL)
{ {
fputs (errmsg, stderr); fputs (errmsg.c_str (), stderr);
fputc ('\n', stderr); fputc ('\n', stderr);
continue; continue;
} }
@ -2181,11 +2176,12 @@ main (int argc, char **argv)
} }
else else
{ {
std::string errmsg;
std::unique_ptr<demangle_parse_info> result std::unique_ptr<demangle_parse_info> result
= cp_demangled_name_to_comp (argv[arg], &errmsg); = cp_demangled_name_to_comp (argv[arg], &errmsg);
if (result == NULL) if (result == NULL)
{ {
fputs (errmsg, stderr); fputs (errmsg.c_str (), stderr);
fputc ('\n', stderr); fputc ('\n', stderr);
return 0; return 0;
} }

View file

@ -169,7 +169,7 @@ struct type *cp_find_type_baseclass_by_name (struct type *parent_type,
/* Functions from cp-name-parser.y. */ /* Functions from cp-name-parser.y. */
extern std::unique_ptr<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); (const char *demangled_name, std::string *errmsg);
extern gdb::unique_xmalloc_ptr<char> cp_comp_to_string extern gdb::unique_xmalloc_ptr<char> cp_comp_to_string
(struct demangle_component *result, int estimated_len); (struct demangle_component *result, int estimated_len);

View file

@ -859,7 +859,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
int i; int i;
struct demangle_component *demangled; struct demangle_component *demangled;
std::unique_ptr<demangle_parse_info> info; std::unique_ptr<demangle_parse_info> info;
const char *err; std::string err;
struct type *argtype; struct type *argtype;
if (TYPE_NAME (type) == NULL) if (TYPE_NAME (type) == NULL)
@ -881,7 +881,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
if (! info) if (! info)
{ {
PyErr_SetString (PyExc_RuntimeError, err); PyErr_SetString (PyExc_RuntimeError, err.c_str ());
return NULL; return NULL;
} }
demangled = info->tree; demangled = info->tree;