aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-05-23 21:05:52 -0600
committerTom Tromey <tom@tromey.com>2018-06-01 10:46:47 -0600
commit3513a6bb20ef286e303367d4ef4963b5dab877cb (patch)
tree7bcda23d6421fa378b8ff0fdd657467a06d649a0
parente9cb46ab59ff2ea94a7fd9fa857a084d3a9b8b39 (diff)
downloadfsf-binutils-gdb-3513a6bb20ef286e303367d4ef4963b5dab877cb.zip
fsf-binutils-gdb-3513a6bb20ef286e303367d4ef4963b5dab877cb.tar.gz
fsf-binutils-gdb-3513a6bb20ef286e303367d4ef4963b5dab877cb.tar.bz2
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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/cp-name-parser.y22
-rw-r--r--gdb/cp-support.h2
-rw-r--r--gdb/python/py-type.c4
4 files changed, 20 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f83e6aa..960545b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
* ada-lex.l: Include "diagnostics.h" instead of
diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y
index ebae562..3e1c9d9 100644
--- a/gdb/cp-name-parser.y
+++ b/gdb/cp-name-parser.y
@@ -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,
a structure containing the root of the new tree is returned. On
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>
-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;
error_lexptr = NULL;
global_errmsg = NULL;
@@ -2052,12 +2051,8 @@ cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
if (yyparse ())
{
if (global_errmsg && errmsg)
- {
- snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s",
- global_errmsg, error_lexptr);
- strcat (errbuf, "'");
- *errmsg = errbuf;
- }
+ *errmsg = string_printf ("%s, near `%s'", global_errmsg,
+ error_lexptr);
return NULL;
}
@@ -2133,7 +2128,6 @@ main (int argc, char **argv)
char *str2, *extra_chars, c;
char buf[65536];
int arg;
- const char *errmsg;
arg = 1;
if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
@@ -2160,11 +2154,12 @@ main (int argc, char **argv)
continue;
}
+ std::string errmsg;
std::unique_ptr<demangle_parse_info> result
= cp_demangled_name_to_comp (str2, &errmsg);
if (result == NULL)
{
- fputs (errmsg, stderr);
+ fputs (errmsg.c_str (), stderr);
fputc ('\n', stderr);
continue;
}
@@ -2181,11 +2176,12 @@ main (int argc, char **argv)
}
else
{
+ std::string errmsg;
std::unique_ptr<demangle_parse_info> result
= cp_demangled_name_to_comp (argv[arg], &errmsg);
if (result == NULL)
{
- fputs (errmsg, stderr);
+ fputs (errmsg.c_str (), stderr);
fputc ('\n', stderr);
return 0;
}
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index 4472581..e2460de 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -169,7 +169,7 @@ struct type *cp_find_type_baseclass_by_name (struct type *parent_type,
/* Functions from cp-name-parser.y. */
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
(struct demangle_component *result, int estimated_len);
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index dd8c0aa..c7cad2e 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -859,7 +859,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
int i;
struct demangle_component *demangled;
std::unique_ptr<demangle_parse_info> info;
- const char *err;
+ std::string err;
struct type *argtype;
if (TYPE_NAME (type) == NULL)
@@ -881,7 +881,7 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
if (! info)
{
- PyErr_SetString (PyExc_RuntimeError, err);
+ PyErr_SetString (PyExc_RuntimeError, err.c_str ());
return NULL;
}
demangled = info->tree;