Make varobj::children an std::vector
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 22 Nov 2017 20:08:06 +0000 (15:08 -0500)
committerSimon Marchi <simon.marchi@ericsson.com>
Wed, 22 Nov 2017 20:08:06 +0000 (15:08 -0500)
This patch makes the children field of varobj an std::vector, and
updates the fallout.

One note is that varobj::parent must be made non-const.  The reason is
that when a child deletes itself, it modifies its writes NULL to its
slot in its parent's children vector.  With the VEC, the const didn't
made the parent's children vector content const, only the pointer to it,
but with std::vector, even the content is.

gdb/ChangeLog:

* varobj.h (struct varobj) <parent>: Remove const.
<children>: Change type to std::vector.
(varobj_list_children): Return std::vector const reference.
(varobj_restrict_range): Change parameter type to std::vector
const reference.
* varobj.c (varobj_has_more): Adjust.
(varobj_restrict_range): Change parameter type to std::vector
const reference and adjust.
(install_dynamic_child): Adjust.
(update_dynamic_varobj_children): Adjust.
(varobj_list_children): Return std::vector const reference and
adjust.
(varobj_add_child): Adjust.
(update_type_if_necessary): Adjust.
(varobj_update): Adjust.
(delete_variable_1): Adjust.
* ada-varobj.c (ada_value_has_mutated): Adjust.
* mi/mi-cmd-var.c (mi_cmd_var_list_children): Adjust.

gdb/ChangeLog
gdb/ada-varobj.c
gdb/mi/mi-cmd-var.c
gdb/varobj.c
gdb/varobj.h

index 5dccc138fd3f2f1a4744e79ea1ca5ec3fa48f3a1..d136e8d8fe264c4a93902286eda33a3e950564fe 100644 (file)
@@ -1,3 +1,24 @@
+2017-11-22  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * varobj.h (struct varobj) <parent>: Remove const.
+       <children>: Change type to std::vector.
+       (varobj_list_children): Return std::vector const reference.
+       (varobj_restrict_range): Change parameter type to std::vector
+       const reference.
+       * varobj.c (varobj_has_more): Adjust.
+       (varobj_restrict_range): Change parameter type to std::vector
+       const reference and adjust.
+       (install_dynamic_child): Adjust.
+       (update_dynamic_varobj_children): Adjust.
+       (varobj_list_children): Return std::vector const reference and
+       adjust.
+       (varobj_add_child): Adjust.
+       (update_type_if_necessary): Adjust.
+       (varobj_update): Adjust.
+       (delete_variable_1): Adjust.
+       * ada-varobj.c (ada_value_has_mutated): Adjust.
+       * mi/mi-cmd-var.c (mi_cmd_var_list_children): Adjust.
+
 2017-11-22  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * varobj.h (struct varobj): Add constructor and destructor,
index 34d9c7b342635b99088847c7f7bd34eebf047c48..8e38c16943c73c114b1971035c0e75769d8c8ab3 100644 (file)
@@ -959,7 +959,6 @@ static int
 ada_value_has_mutated (const struct varobj *var, struct value *new_val,
                       struct type *new_type)
 {
-  int i;
   int from = -1;
   int to = -1;
 
@@ -983,10 +982,10 @@ ada_value_has_mutated (const struct varobj *var, struct value *new_val,
      has mutated or not. So just assume it hasn't.  */
 
   varobj_restrict_range (var->children, &from, &to);
-  for (i = from; i < to; i++)
+  for (int i = from; i < to; i++)
     if (ada_varobj_get_name_of_child (new_val, new_type,
                                      var->name.c_str (), i)
-       != VEC_index (varobj_p, var->children, i)->name)
+       != var->children[i]->name)
       return 1;
 
   return 0;
index 0215b1a8f518a14847b921c1da6e5ca21d095bcc..084cc38d288ba4654a514ad72263b8fdb88c6ea7 100644 (file)
@@ -352,10 +352,7 @@ mi_cmd_var_list_children (const char *command, char **argv, int argc)
 {
   struct ui_out *uiout = current_uiout;
   struct varobj *var;  
-  VEC(varobj_p) *children;
-  struct varobj *child;
   enum print_values print_values;
-  int ix;
   int from, to;
 
   if (argc < 1 || argc > 4)
@@ -379,7 +376,9 @@ mi_cmd_var_list_children (const char *command, char **argv, int argc)
       to = -1;
     }
 
-  children = varobj_list_children (var, &from, &to);
+  const std::vector<varobj *> &children
+    = varobj_list_children (var, &from, &to);
+
   uiout->field_int ("numchild", to - from);
   if (argc == 2 || argc == 4)
     print_values = mi_parse_print_values (argv[0]);
@@ -401,13 +400,11 @@ mi_cmd_var_list_children (const char *command, char **argv, int argc)
        tuple_emitter.emplace (uiout, "children");
       else
        list_emitter.emplace (uiout, "children");
-      for (ix = from;
-          ix < to && VEC_iterate (varobj_p, children, ix, child);
-          ++ix)
+      for (int ix = from; ix < to && ix < children.size (); ix++)
        {
          ui_out_emit_tuple child_emitter (uiout, "child");
 
-         print_varobj (child, print_values, 1 /* print expression */);
+         print_varobj (children[ix], print_values, 1 /* print expression */);
        }
     }
 
index 2bc7fcd82acf23bd9afa28897233af1349b85ae4..363ebec5709d7da59cc19ac3b508f6b47d9c97cc 100644 (file)
@@ -558,9 +558,10 @@ varobj_get_display_hint (const struct varobj *var)
 int
 varobj_has_more (const struct varobj *var, int to)
 {
-  if (VEC_length (varobj_p, var->children) > to)
+  if (var->children.size () > to)
     return 1;
-  return ((to == -1 || VEC_length (varobj_p, var->children) == to)
+
+  return ((to == -1 || var->children.size () == to)
          && (var->dynamic->saved_item != NULL));
 }
 
@@ -602,19 +603,22 @@ varobj_get_frozen (const struct varobj *var)
    used.  */
 
 void
-varobj_restrict_range (VEC (varobj_p) *children, int *from, int *to)
+varobj_restrict_range (const std::vector<varobj *> &children,
+                      int *from, int *to)
 {
+  int len = children.size ();
+
   if (*from < 0 || *to < 0)
     {
       *from = 0;
-      *to = VEC_length (varobj_p, children);
+      *to = len;
     }
   else
     {
-      if (*from > VEC_length (varobj_p, children))
-       *from = VEC_length (varobj_p, children);
-      if (*to > VEC_length (varobj_p, children))
-       *to = VEC_length (varobj_p, children);
+      if (*from > len)
+       *from = len;
+      if (*to > len)
+       *to = len;
       if (*from > *to)
        *from = *to;
     }
@@ -633,7 +637,7 @@ install_dynamic_child (struct varobj *var,
                       int index,
                       struct varobj_item *item)
 {
-  if (VEC_length (varobj_p, var->children) < index + 1)
+  if (var->children.size () < index + 1)
     {
       /* There's no child yet.  */
       struct varobj *child = varobj_add_child (var, item);
@@ -646,7 +650,7 @@ install_dynamic_child (struct varobj *var,
     }
   else
     {
-      varobj_p existing = VEC_index (varobj_p, var->children, index);
+      varobj *existing = var->children[index];
       int type_updated = update_type_if_necessary (existing, item->value);
 
       if (type_updated)
@@ -735,7 +739,7 @@ update_dynamic_varobj_children (struct varobj *var,
        return 0;
     }
   else
-    i = VEC_length (varobj_p, var->children);
+    i = var->children.size ();
 
   /* We ask for one extra child, so that MI can report whether there
      are more children.  */
@@ -789,22 +793,21 @@ update_dynamic_varobj_children (struct varobj *var,
        }
     }
 
-  if (i < VEC_length (varobj_p, var->children))
+  if (i < var->children.size ())
     {
-      int j;
-
       *cchanged = 1;
-      for (j = i; j < VEC_length (varobj_p, var->children); ++j)
-       varobj_delete (VEC_index (varobj_p, var->children, j), 0);
-      VEC_truncate (varobj_p, var->children, i);
+      for (int j = i; j < var->children.size (); ++j)
+       varobj_delete (var->children[j], 0);
+
+      var->children.resize (i);
     }
 
   /* If there are fewer children than requested, note that the list of
      children changed.  */
-  if (to >= 0 && VEC_length (varobj_p, var->children) < to)
+  if (to >= 0 && var->children.size () < to)
     *cchanged = 1;
 
-  var->num_children = VEC_length (varobj_p, var->children);
+  var->num_children = var->children.size ();
 
   return 1;
 }
@@ -833,10 +836,10 @@ varobj_get_num_children (struct varobj *var)
 /* Creates a list of the immediate children of a variable object;
    the return code is the number of such children or -1 on error.  */
 
-VEC (varobj_p)*
+const std::vector<varobj *> &
 varobj_list_children (struct varobj *var, int *from, int *to)
 {
-  int i, children_changed;
+  int children_changed;
 
   var->dynamic->children_requested = 1;
 
@@ -860,21 +863,18 @@ varobj_list_children (struct varobj *var, int *from, int *to)
 
   /* If we're called when the list of children is not yet initialized,
      allocate enough elements in it.  */
-  while (VEC_length (varobj_p, var->children) < var->num_children)
-    VEC_safe_push (varobj_p, var->children, NULL);
+  while (var->children.size () < var->num_children)
+    var->children.push_back (NULL);
 
-  for (i = 0; i < var->num_children; i++)
+  for (int i = 0; i < var->num_children; i++)
     {
-      varobj_p existing = VEC_index (varobj_p, var->children, i);
-
-      if (existing == NULL)
+      if (var->children[i] == NULL)
        {
          /* Either it's the first call to varobj_list_children for
             this variable object, and the child was never created,
             or it was explicitly deleted by the client.  */
          std::string name = name_of_child (var, i);
-         existing = create_child (var, i, name);
-         VEC_replace (varobj_p, var->children, i, existing);
+         var->children[i] = create_child (var, i, name);
        }
     }
 
@@ -885,11 +885,10 @@ varobj_list_children (struct varobj *var, int *from, int *to)
 static struct varobj *
 varobj_add_child (struct varobj *var, struct varobj_item *item)
 {
-  varobj_p v = create_child_with_value (var,
-                                       VEC_length (varobj_p, var->children), 
-                                       item);
+  varobj *v = create_child_with_value (var, var->children.size (), item);
+
+  var->children.push_back (v);
 
-  VEC_safe_push (varobj_p, var->children, v);
   return v;
 }
 
@@ -1221,7 +1220,7 @@ update_type_if_necessary (struct varobj *var, struct value *new_value)
 
              /* This information may be not valid for a new type.  */
              varobj_delete (var, 1);
-             VEC_free (varobj_p, var->children);
+             var->children.clear ();
              var->num_children = -1;
              return 1;
            }
@@ -1737,9 +1736,9 @@ varobj_update (struct varobj **varp, int is_explicit)
         child is popped from the work stack first, and so
         will be added to result first.  This does not
         affect correctness, just "nicer".  */
-      for (i = VEC_length (varobj_p, v->children)-1; i >= 0; --i)
+      for (i = v->children.size () - 1; i >= 0; --i)
        {
-         varobj_p c = VEC_index (varobj_p, v->children, i);
+         varobj *c = v->children[i];
 
          /* Child may be NULL if explicitly deleted by -var-delete.  */
          if (c != NULL && !c->frozen)
@@ -1786,20 +1785,18 @@ static void
 delete_variable_1 (int *delcountp, struct varobj *var, int only_children_p,
                   int remove_from_parent_p)
 {
-  int i;
-
   /* Delete any children of this variable, too.  */
-  for (i = 0; i < VEC_length (varobj_p, var->children); ++i)
+  for (varobj *child : var->children)
     {   
-      varobj_p child = VEC_index (varobj_p, var->children, i);
-
       if (!child)
        continue;
+
       if (!remove_from_parent_p)
        child->parent = NULL;
+
       delete_variable_1 (delcountp, child, 0, only_children_p);
     }
-  VEC_free (varobj_p, var->children);
+  var->children.clear ();
 
   /* if we were called to delete only the children we are done here.  */
   if (only_children_p)
@@ -1819,9 +1816,7 @@ delete_variable_1 (int *delcountp, struct varobj *var, int only_children_p,
      expensive list search to find the element to remove when we are
      discarding the list afterwards.  */
   if ((remove_from_parent_p) && (var->parent != NULL))
-    {
-      VEC_replace (varobj_p, var->parent->children, var->index, NULL);
-    }
+    var->parent->children[var->index] = NULL;
 
   if (!var->obj_name.empty ())
     uninstall_variable (var);
index bdf748f5a02bf1dc08addb296fd559953d6406c3..ec8d62c2155196054cc63eb02497286aaf0843d7 100644 (file)
@@ -124,10 +124,10 @@ struct varobj
   int num_children = -1;
 
   /* If this object is a child, this points to its immediate parent.  */
-  const struct varobj *parent = NULL;
+  struct varobj *parent = NULL;
 
   /* Children of this object.  */
-  VEC (varobj_p) *children = NULL;
+  std::vector<varobj *> children;
 
   /* Description of the root variable.  Points to root variable for
      children.  */
@@ -280,8 +280,8 @@ extern int varobj_get_num_children (struct varobj *var);
    that was returned.  The resulting VEC will contain at least the
    children from *FROM to just before *TO; it might contain more
    children, depending on whether any more were available.  */
-extern VEC (varobj_p)* varobj_list_children (struct varobj *var,
-                                            int *from, int *to);
+extern const std::vector<varobj *> &
+  varobj_list_children (struct varobj *var, int *from, int *to);
 
 extern std::string varobj_get_type (struct varobj *var);
 
@@ -341,8 +341,8 @@ extern std::string
 extern void varobj_formatted_print_options (struct value_print_options *opts,
                                            enum varobj_display_formats format);
 
-extern void varobj_restrict_range (VEC (varobj_p) *children, int *from,
-                                  int *to);
+extern void varobj_restrict_range (const std::vector<varobj *> &children,
+                                  int *from, int *to);
 
 extern int varobj_default_is_path_expr_parent (const struct varobj *var);