Change varobj_iter::next to return 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:39 +0000 (09:33 -0700)
This changes varobj_iter::next to return a unique_ptr.  This fits in
with the ongoing theme of trying to express these ownership transfers
via the type system.

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

* varobj.c (update_dynamic_varobj_children): Update.
* varobj-iter.h (struct varobj_iter) <next>: Change return type.
* python/py-varobj.c (struct py_varobj_iter) <next>: Change return
type.
(py_varobj_iter::next): Likewise.

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

index 53f87d9b940f8ee7e0c5b855492477aa5e13e303..d2c902cd4deca08f73bca81360f698706442aa30 100644 (file)
@@ -1,3 +1,11 @@
+2020-12-11  Tom Tromey  <tom@tromey.com>
+
+       * varobj.c (update_dynamic_varobj_children): Update.
+       * varobj-iter.h (struct varobj_iter) <next>: Change return type.
+       * python/py-varobj.c (struct py_varobj_iter) <next>: Change return
+       type.
+       (py_varobj_iter::next): Likewise.
+
 2020-12-11  Tom Tromey  <tom@tromey.com>
 
        * varobj.c (update_dynamic_varobj_children, install_visualizer)
index df6f9c5a953f2dbe642c8a08af3782841a4150e3..c3fb2e96a9c11e5161f013762d9afbecf9c8c129 100644 (file)
@@ -26,7 +26,7 @@ struct py_varobj_iter : public varobj_iter
   py_varobj_iter (struct varobj *var, gdbpy_ref<> &&pyiter);
   ~py_varobj_iter () override;
 
-  varobj_item *next () override;
+  std::unique_ptr<varobj_item> next () override;
 
 private:
 
@@ -55,7 +55,7 @@ py_varobj_iter::~py_varobj_iter ()
 /* Implementation of the 'next' method of pretty-printed varobj
    iterators.  */
 
-varobj_item *
+std::unique_ptr<varobj_item>
 py_varobj_iter::next ()
 {
   PyObject *py_v;
@@ -117,7 +117,7 @@ py_varobj_iter::next ()
   vitem->name = name;
 
   m_next_raw_index++;
-  return vitem;
+  return std::unique_ptr<varobj_item> (vitem);
 }
 
 /* Constructor of pretty-printed varobj iterators.  VAR is the varobj
index ed654190ca539e27553c1da3b1aa4596fc660001..a05f1cbf8f3f750894a30270ba95b582848861e5 100644 (file)
@@ -36,7 +36,7 @@ public:
 
   virtual ~varobj_iter () = default;
 
-  virtual varobj_item *next () = 0;
+  virtual std::unique_ptr<varobj_item> next () = 0;
 };
 
 #endif /* VAROBJ_ITER_H */
index 80de679a60799b2bc4d3ada4d56771973e719b47..e9856ea4eb39212c80339765f54bc4df89711de1 100644 (file)
@@ -719,12 +719,12 @@ update_dynamic_varobj_children (struct varobj *var,
      are more children.  */
   for (; to < 0 || i < to + 1; ++i)
     {
-      varobj_item *item;
+      std::unique_ptr<varobj_item> item;
 
       /* See if there was a leftover from last time.  */
       if (var->dynamic->saved_item != NULL)
        {
-         item = var->dynamic->saved_item;
+         item = std::unique_ptr<varobj_item> (var->dynamic->saved_item);
          var->dynamic->saved_item = NULL;
        }
       else
@@ -753,13 +753,11 @@ update_dynamic_varobj_children (struct varobj *var,
                                 can_mention ? newobj : NULL,
                                 can_mention ? unchanged : NULL,
                                 can_mention ? cchanged : NULL, i,
-                                item);
-
-         delete item;
+                                item.get ());
        }
       else
        {
-         var->dynamic->saved_item = item;
+         var->dynamic->saved_item = item.release ();
 
          /* We want to truncate the child list just before this
             element.  */