[3/6] gdb: Remove a cleanup from find_overload_match

Message ID d49a538b7df2b6f1352439e6d33003b3d0ee065d.1546382416.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess Jan. 1, 2019, 10:45 p.m. UTC
  This patch changes cp-support.c:cp_func_name to return a
'gdb::unique_xmalloc_ptr<char>' instead of a 'char *'.  This allows a
cleanup to be removed from valops.c:find_overload_match.

gdb/ChangeLog:

	* compile/compile-cplus-types.c
	(compile_cplus_instance::decl_name): Handle changes to
	cp_func_name.
	* cp-support.c (cp_func_name): Update header comment, update
	return type.
	* cp-support.h (cp_func_name): Update return type in declaration.
	* valops.c (find_overload_match): Move temp_func local to top
	level of function and change its type.  Use temp_func to hold and
	delete temporary string obtained from cp_func_name.
---
 gdb/ChangeLog                     | 12 ++++++++++++
 gdb/compile/compile-cplus-types.c |  4 ++--
 gdb/cp-support.c                  |  9 ++++-----
 gdb/cp-support.h                  |  2 +-
 gdb/valops.c                      | 10 ++++------
 5 files changed, 23 insertions(+), 14 deletions(-)
  

Comments

Tom Tromey Jan. 2, 2019, 3:12 p.m. UTC | #1
>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:

Andrew> This patch changes cp-support.c:cp_func_name to return a
Andrew> 'gdb::unique_xmalloc_ptr<char>' instead of a 'char *'.  This allows a
Andrew> cleanup to be removed from valops.c:find_overload_match.

Andrew> gdb/ChangeLog:

Andrew> 	* compile/compile-cplus-types.c
Andrew> 	(compile_cplus_instance::decl_name): Handle changes to
Andrew> 	cp_func_name.
Andrew> 	* cp-support.c (cp_func_name): Update header comment, update
Andrew> 	return type.
Andrew> 	* cp-support.h (cp_func_name): Update return type in declaration.
Andrew> 	* valops.c (find_overload_match): Move temp_func local to top
Andrew> 	level of function and change its type.  Use temp_func to hold and
Andrew> 	delete temporary string obtained from cp_func_name.

Thank you.  This is ok.

Tom
  

Patch

diff --git a/gdb/compile/compile-cplus-types.c b/gdb/compile/compile-cplus-types.c
index 3de0d8eee8c..910a874550d 100644
--- a/gdb/compile/compile-cplus-types.c
+++ b/gdb/compile/compile-cplus-types.c
@@ -63,9 +63,9 @@  compile_cplus_instance::decl_name (const char *natural)
   if (natural == nullptr)
     return nullptr;
 
-  char *name = cp_func_name (natural);
+  gdb::unique_xmalloc_ptr<char> name = cp_func_name (natural);
   if (name != nullptr)
-    return gdb::unique_xmalloc_ptr<char> (name);
+    return name;
 
   return gdb::unique_xmalloc_ptr<char> (xstrdup (natural));
 }
diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index 2024f87c44d..489bcca2b8d 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -808,10 +808,9 @@  method_name_from_physname (const char *physname)
 /* If FULL_NAME is the demangled name of a C++ function (including an
    arg list, possibly including namespace/class qualifications),
    return a new string containing only the function name (without the
-   arg list/class qualifications).  Otherwise, return NULL.  The
-   caller is responsible for freeing the memory in question.  */
+   arg list/class qualifications).  Otherwise, return NULL.  */
 
-char *
+gdb::unique_xmalloc_ptr<char>
 cp_func_name (const char *full_name)
 {
   gdb::unique_xmalloc_ptr<char> ret;
@@ -820,14 +819,14 @@  cp_func_name (const char *full_name)
 
   info = cp_demangled_name_to_comp (full_name, NULL);
   if (!info)
-    return NULL;
+    return nullptr;
 
   ret_comp = unqualified_name_from_comp (info->tree);
 
   if (ret_comp != NULL)
     ret = cp_comp_to_string (ret_comp, 10);
 
-  return ret.release ();
+  return ret;
 }
 
 /* Helper for cp_remove_params.  DEMANGLED_NAME is the name of a
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index 32fafe4a5a7..2677e1bfcaf 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -96,7 +96,7 @@  extern unsigned int cp_find_first_component (const char *name);
 
 extern unsigned int cp_entire_prefix_len (const char *name);
 
-extern char *cp_func_name (const char *full_name);
+extern gdb::unique_xmalloc_ptr<char> cp_func_name (const char *full_name);
 
 extern gdb::unique_xmalloc_ptr<char> cp_remove_params
   (const char *demanged_name);
diff --git a/gdb/valops.c b/gdb/valops.c
index caf31629482..1a9d6a6f958 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -2520,6 +2520,7 @@  find_overload_match (gdb::array_view<value *> args,
 
   const char *obj_type_name = NULL;
   const char *func_name = NULL;
+  gdb::unique_xmalloc_ptr<char> temp_func;
   enum oload_classification match_quality;
   enum oload_classification method_match_quality = INCOMPATIBLE;
   enum oload_classification src_method_match_quality = INCOMPATIBLE;
@@ -2666,20 +2667,17 @@  find_overload_match (gdb::array_view<value *> args,
               && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym)))
 	      == TYPE_CODE_FUNC)
             {
-	      char *temp_func;
-
 	      temp_func = cp_func_name (qualified_name);
 
 	      /* If cp_func_name did not remove anything, the name of the
 	         symbol did not include scope or argument types - it was
 	         probably a C-style function.  */
-	      if (temp_func)
+	      if (temp_func != nullptr)
 		{
-		  make_cleanup (xfree, temp_func);
-		  if (strcmp (temp_func, qualified_name) == 0)
+		  if (strcmp (temp_func.get (), qualified_name) == 0)
 		    func_name = NULL;
 		  else
-		    func_name = temp_func;
+		    func_name = temp_func.get ();
 		}
             }
         }