[RFA 4/4] Use std::vector in add_using_directive

Tom Tromey tom@tromey.com
Sat Sep 9 01:06:00 GMT 2017


This changes add_using_directive to accept a std::vector and then
changes the callers.  This allows removing a cleanup.

gdb/ChangeLog
2017-09-08  Tom Tromey  <tom@tromey.com>

	* namespace.h (add_using_directive): Update.
	* namespace.c (add_using_directive): Change type of excludes to
	std::vector.
	* dwarf2read.c (read_import_statement): Use std::vector.
	(read_namespace): Update.
	* cp-namespace.c (cp_scan_for_anonymous_namespaces): Update.
---
 gdb/ChangeLog      |  9 +++++++++
 gdb/cp-namespace.c |  3 ++-
 gdb/dwarf2read.c   | 12 ++++--------
 gdb/namespace.c    | 19 ++++++++-----------
 gdb/namespace.h    |  2 +-
 5 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4f4b543..1e486d6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
 2017-09-08  Tom Tromey  <tom@tromey.com>
 
+	* namespace.h (add_using_directive): Update.
+	* namespace.c (add_using_directive): Change type of excludes to
+	std::vector.
+	* dwarf2read.c (read_import_statement): Use std::vector.
+	(read_namespace): Update.
+	* cp-namespace.c (cp_scan_for_anonymous_namespaces): Update.
+
+2017-09-08  Tom Tromey  <tom@tromey.com>
+
 	* linespec.c (create_sals_line_offset): Use gdb::def_vector.
 
 2017-09-08  Tom Tromey  <tom@tromey.com>
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index c7b5aa8..6a0266e 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -93,8 +93,9 @@ cp_scan_for_anonymous_namespaces (const struct symbol *const symbol,
 		 anonymous namespace.  So add symbols in it to the
 		 namespace given by the previous component if there is
 		 one, or to the global namespace if there isn't.  */
+	      std::vector<const char *> excludes;
 	      add_using_directive (&local_using_directives,
-				   dest, src, NULL, NULL, NULL, 1,
+				   dest, src, NULL, NULL, excludes, 1,
 				   &objfile->objfile_obstack);
 	    }
 	  /* The "+ 2" is for the "::".  */
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 201a857..8e65492 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9221,8 +9221,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
   const char *import_alias;
   const char *imported_declaration = NULL;
   const char *import_prefix;
-  VEC (const_char_ptr) *excludes = NULL;
-  struct cleanup *cleanups;
+  std::vector<const char *> excludes;
 
   import_attr = dwarf2_attr (die, DW_AT_import, cu);
   if (import_attr == NULL)
@@ -9296,8 +9295,6 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
   else
     canonical_name = imported_name;
 
-  cleanups = make_cleanup (VEC_cleanup (const_char_ptr), &excludes);
-
   if (die->tag == DW_TAG_imported_module && cu->language == language_fortran)
     for (child_die = die->child; child_die && child_die->tag;
 	 child_die = sibling_die (child_die))
@@ -9337,7 +9334,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
 	    continue;
 	  }
 
-	VEC_safe_push (const_char_ptr, excludes, imported_name);
+	excludes.push_back (imported_name);
 
 	process_die (child_die, cu);
       }
@@ -9350,8 +9347,6 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
 		       excludes,
 		       0,
 		       &objfile->objfile_obstack);
-
-  do_cleanups (cleanups);
 }
 
 /* Check for possibly missing DW_AT_comp_dir with relative .debug_line
@@ -14617,9 +14612,10 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
 	{
 	  const char *previous_prefix = determine_prefix (die, cu);
 
+	  std::vector<const char *> excludes;
 	  add_using_directive (using_directives (cu->language),
 			       previous_prefix, TYPE_NAME (type), NULL,
-			       NULL, NULL, 0, &objfile->objfile_obstack);
+			       NULL, excludes, 0, &objfile->objfile_obstack);
 	}
     }
 
diff --git a/gdb/namespace.c b/gdb/namespace.c
index 5ada813..a851ce9 100644
--- a/gdb/namespace.c
+++ b/gdb/namespace.c
@@ -39,7 +39,7 @@ add_using_directive (struct using_direct **using_directives,
 		     const char *src,
 		     const char *alias,
 		     const char *declaration,
-		     VEC (const_char_ptr) *excludes,
+		     const std::vector<const char *> &excludes,
 		     int copy_names,
 		     struct obstack *obstack)
 {
@@ -52,7 +52,6 @@ add_using_directive (struct using_direct **using_directives,
   for (current = *using_directives; current != NULL; current = current->next)
     {
       int ix;
-      const char *param;
 
       if (strcmp (current->import_src, src) != 0)
 	continue;
@@ -70,12 +69,11 @@ add_using_directive (struct using_direct **using_directives,
 	continue;
 
       /* Compare the contents of EXCLUDES.  */
-      for (ix = 0; VEC_iterate (const_char_ptr, excludes, ix, param); ix++)
+      for (ix = 0; ix < excludes.size (); ++ix)
 	if (current->excludes[ix] == NULL
-	    || strcmp (param, current->excludes[ix]) != 0)
+	    || strcmp (excludes[ix], current->excludes[ix]) != 0)
 	  break;
-      if (ix < VEC_length (const_char_ptr, excludes)
-	  || current->excludes[ix] != NULL)
+      if (ix < excludes.size () || current->excludes[ix] != NULL)
 	continue;
 
       /* Parameters exactly match CURRENT.  */
@@ -83,8 +81,7 @@ add_using_directive (struct using_direct **using_directives,
     }
 
   alloc_len = (sizeof(*newobj)
-	       + (VEC_length (const_char_ptr, excludes)
-		  * sizeof(*newobj->excludes)));
+	       + (excludes.size () * sizeof(*newobj->excludes)));
   newobj = (struct using_direct *) obstack_alloc (obstack, alloc_len);
   memset (newobj, 0, sizeof (*newobj));
 
@@ -114,9 +111,9 @@ add_using_directive (struct using_direct **using_directives,
   else
     newobj->declaration = declaration;
 
-  memcpy (newobj->excludes, VEC_address (const_char_ptr, excludes),
-	  VEC_length (const_char_ptr, excludes) * sizeof (*newobj->excludes));
-  newobj->excludes[VEC_length (const_char_ptr, excludes)] = NULL;
+  memcpy (newobj->excludes, excludes.data (),
+	  excludes.size () * sizeof (*newobj->excludes));
+  newobj->excludes[excludes.size ()] = NULL;
 
   newobj->next = *using_directives;
   *using_directives = newobj;
diff --git a/gdb/namespace.h b/gdb/namespace.h
index 75ae030..6804582 100644
--- a/gdb/namespace.h
+++ b/gdb/namespace.h
@@ -111,7 +111,7 @@ extern void add_using_directive (struct using_direct **using_directives,
 				 const char *src,
 				 const char *alias,
 				 const char *declaration,
-				 VEC (const_char_ptr) *excludes,
+				 const std::vector<const char *> &excludes,
 				 int copy_names,
                                  struct obstack *obstack);
 
-- 
2.9.4



More information about the Gdb-patches mailing list