Remove a static buffer from cp-name-parser.y
authorTom Tromey <tom@tromey.com>
Thu, 24 May 2018 03:05:52 +0000 (21:05 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 1 Jun 2018 16:46:47 +0000 (10:46 -0600)
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.

gdb/ChangeLog
gdb/cp-name-parser.y
gdb/cp-support.h
gdb/python/py-type.c

index f83e6aa65574171ae3311cc7345d640734ee0e55..960545b0476e54983573b096c6c82c7b82d14170 100644 (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>
 
        * ada-lex.l: Include "diagnostics.h" instead of
index ebae56261b31b9f7f9426a8f75d4065edbd0a57d..3e1c9d9e6f0f211f390df58dfcd6e782a055eb6d 100644 (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,
    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;
        }
index 44725818e9d935cde06d7e2498c6004e6a5a0710..e2460de5fb838c7e483f8c20a2ce937e76e6241d 100644 (file)
@@ -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);
index dd8c0aa9dcb471a1a03ebf4568f725a66e153b42..c7cad2e66288c0d22244687066919db386475182 100644 (file)
@@ -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;