Change varobj_dynamic::child_iter to unique_ptr
authorTom Tromey <tom@tromey.com>
Fri, 11 Dec 2020 16:33:36 +0000 (09:33 -0700)
committerTom Tromey <tom@tromey.com>
Fri, 11 Dec 2020 16:33:40 +0000 (09:33 -0700)
This changes varobj_dynamic::child_iter to be a unique_ptr, removing
some manual management.

gdb/ChangeLog
2020-12-11  Tom Tromey  <tom@tromey.com>

* varobj.c (struct varobj_dynamic) <child_iter>: Now unique_ptr.
(varobj_get_iterator): Return unique_ptr.
(update_dynamic_varobj_children, install_visualizer)
(varobj::~varobj): Update.
* python/python-internal.h (py_varobj_get_iterator): Return
unique_ptr.
* python/py-varobj.c (py_varobj_get_iterator): Return unique_ptr.

gdb/ChangeLog
gdb/python/py-varobj.c
gdb/python/python-internal.h
gdb/varobj.c

index 6e6fcfb7be3b94b7e7f6c91c7e73ca1020257537..dc369546d1f39c802f888db14a84287a27d117e9 100644 (file)
@@ -1,3 +1,13 @@
+2020-12-11  Tom Tromey  <tom@tromey.com>
+
+       * varobj.c (struct varobj_dynamic) <child_iter>: Now unique_ptr.
+       (varobj_get_iterator): Return unique_ptr.
+       (update_dynamic_varobj_children, install_visualizer)
+       (varobj::~varobj): Update.
+       * python/python-internal.h (py_varobj_get_iterator): Return
+       unique_ptr.
+       * python/py-varobj.c (py_varobj_get_iterator): Return unique_ptr.
+
 2020-12-11  Tom Tromey  <tom@tromey.com>
 
        * varobj.c (struct varobj_dynamic) <saved_item>: Now unique_ptr.
index c3fb2e96a9c11e5161f013762d9afbecf9c8c129..dfc9e2baf6ce642cadb8560b359969bd03be7bb5 100644 (file)
@@ -133,7 +133,7 @@ py_varobj_iter::py_varobj_iter (struct varobj *var, gdbpy_ref<> &&pyiter)
 /* Return a new pretty-printed varobj iterator suitable to iterate
    over VAR's children.  */
 
-struct varobj_iter *
+std::unique_ptr<varobj_iter>
 py_varobj_get_iterator (struct varobj *var, PyObject *printer)
 {
   gdbpy_enter_varobj enter_py (var);
@@ -156,5 +156,6 @@ py_varobj_get_iterator (struct varobj *var, PyObject *printer)
       error (_("Could not get children iterator"));
     }
 
-  return new py_varobj_iter (var, std::move (iter));
+  return std::unique_ptr<varobj_iter> (new py_varobj_iter (var,
+                                                          std::move (iter)));
 }
index 3fdfedefbea1fb5fe8740c11975f4fdf6618383a..f7e1edc5b28073de37bce7ec8b8f0062e7e98c26 100644 (file)
@@ -754,8 +754,8 @@ int gdb_pymodule_addobject (PyObject *module, const char *name,
 
 struct varobj_iter;
 struct varobj;
-struct varobj_iter *py_varobj_get_iterator (struct varobj *var,
-                                           PyObject *printer);
+std::unique_ptr<varobj_iter> py_varobj_get_iterator (struct varobj *var,
+                                                    PyObject *printer);
 
 /* Deleter for Py_buffer unique_ptr specialization.  */
 
index 92bb60fd9d84593fd61dc7261e93bde66b1a45bc..53e33b5d377f73c376c5e211d233a1c2bfd737f6 100644 (file)
@@ -124,7 +124,7 @@ struct varobj_dynamic
 
   /* The iterator returned by the printer's 'children' method, or NULL
      if not available.  */
-  struct varobj_iter *child_iter = NULL;
+  std::unique_ptr<varobj_iter> child_iter;
 
   /* We request one extra item from the iterator, so that we can
      report to the caller whether there are more items than we have
@@ -660,7 +660,7 @@ dynamic_varobj_has_child_method (const struct varobj *var)
 /* A factory for creating dynamic varobj's iterators.  Returns an
    iterator object suitable for iterating over VAR's children.  */
 
-static struct varobj_iter *
+static std::unique_ptr<varobj_iter>
 varobj_get_iterator (struct varobj *var)
 {
 #if HAVE_PYTHON
@@ -701,7 +701,6 @@ update_dynamic_varobj_children (struct varobj *var,
 
   if (update_children || var->dynamic->child_iter == NULL)
     {
-      delete var->dynamic->child_iter;
       var->dynamic->child_iter = varobj_get_iterator (var);
 
       varobj_clear_saved_item (var->dynamic);
@@ -735,8 +734,7 @@ update_dynamic_varobj_children (struct varobj *var,
       if (item == NULL)
        {
          /* Iteration is done.  Remove iterator from VAR.  */
-         delete var->dynamic->child_iter;
-         var->dynamic->child_iter = NULL;
+         var->dynamic->child_iter.reset (nullptr);
          break;
        }
       /* We don't want to push the extra child on any report list.  */
@@ -1064,8 +1062,7 @@ install_visualizer (struct varobj_dynamic *var, PyObject *constructor,
   Py_XDECREF (var->pretty_printer);
   var->pretty_printer = visualizer;
 
-  delete var->child_iter;
-  var->child_iter = NULL;
+  var->child_iter.reset (nullptr);
 }
 
 /* Install the default visualizer for VAR.  */
@@ -1875,7 +1872,6 @@ varobj::~varobj ()
     }
 #endif
 
-  delete var->dynamic->child_iter;
   varobj_clear_saved_item (var->dynamic);
 
   if (is_root_p (var))