+2017-01-10  Tom Tromey  <tom@tromey.com>
+
+       * varobj.c (gdbpy_enter_varobj): New constructor.
+       * python/python-internal.h (gdbpy_enter_varobj): New class.
+       * python/py-varobj.c (py_varobj_get_iterator): Use
+       gdbpy_enter_varobj.
+
 2017-01-10  Tom Tromey  <tom@tromey.com>
 
        * python/py-xmethods.c (gdbpy_get_xmethod_result_type): Use
 
 #include "python-internal.h"
 #include "varobj.h"
 #include "varobj-iter.h"
+#include "py-ref.h"
 
 /* A dynamic varobj iterator "class" for python pretty-printed
    varobjs.  This inherits struct varobj_iter.  */
 struct varobj_iter *
 py_varobj_get_iterator (struct varobj *var, PyObject *printer)
 {
-  PyObject *children;
   PyObject *iter;
   struct py_varobj_iter *py_iter;
-  struct cleanup *back_to = varobj_ensure_python_env (var);
+
+  gdbpy_enter_varobj enter_py (var);
 
   if (!PyObject_HasAttr (printer, gdbpy_children_cst))
-    {
-      do_cleanups (back_to);
-      return NULL;
-    }
+    return NULL;
 
-  children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
-                                        NULL);
+  gdbpy_ref children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
+                                                 NULL));
   if (children == NULL)
     {
       gdbpy_print_stack ();
       error (_("Null value returned for children"));
     }
 
-  make_cleanup_py_decref (children);
-
-  iter = PyObject_GetIter (children);
+  iter = PyObject_GetIter (children.get ());
   if (iter == NULL)
     {
       gdbpy_print_stack ();
 
   py_iter = py_varobj_iter_new (var, iter);
 
-  do_cleanups (back_to);
-
   return &py_iter->base;
 }
 
   PyObject *m_error_type, *m_error_value, *m_error_traceback;
 };
 
+/* Like gdbpy_enter, but takes a varobj.  This is a subclass just to
+   make constructor delegation a little nicer.  */
+class gdbpy_enter_varobj : public gdbpy_enter
+{
+ public:
+
+  /* This is defined in varobj.c, where it can access varobj
+     internals.  */
+  gdbpy_enter_varobj (const struct varobj *var);
+
+};
+
 struct cleanup *ensure_python_env (struct gdbarch *gdbarch,
                                   const struct language_defn *language);
 
 
   return ensure_python_env (var->root->exp->gdbarch,
                            var->root->exp->language_defn);
 }
+
+/* See python-internal.h.  */
+gdbpy_enter_varobj::gdbpy_enter_varobj (const struct varobj *var)
+: gdbpy_enter (var->root->exp->gdbarch, var->root->exp->language_defn)
+{
+}
+
 #endif
 
 /* Return the full FRAME which corresponds to the given CORE_ADDR