From 3513a6bb20ef286e303367d4ef4963b5dab877cb Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 23 May 2018 21:05:52 -0600 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/cp-name-parser.y | 22 +++++++++------------- gdb/cp-support.h | 2 +- gdb/python/py-type.c | 4 ++-- 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 + + * 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 * 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 -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 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 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 cp_demangled_name_to_comp - (const char *demangled_name, const char **errmsg); + (const char *demangled_name, std::string *errmsg); extern gdb::unique_xmalloc_ptr 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 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; -- 2.7.4