struct value *value = NULL;
   /* 'result' must be set to NULL, this initially indicates whether
      the function was called, or not.  */
-  PyObject *result = NULL;
-  PyObject *callable, *args;
-  struct cleanup *cleanup;
+  gdbpy_ref result;
 
-  cleanup = ensure_python_env (gdbarch, language);
+  gdbpy_enter enter_py (gdbarch, language);
 
-  args = convert_values_to_python (argc, argv);
+  gdbpy_ref args (convert_values_to_python (argc, argv));
   /* convert_values_to_python can return NULL on error.  If we
      encounter this, do not call the function, but allow the Python ->
      error code conversion below to deal with the Python exception.
      Note, that this is different if the function simply does not
      have arguments.  */
 
-  if (args)
+  if (args != NULL)
     {
-      callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
-      if (! callable)
-       {
-         Py_DECREF (args);
-         error (_("No method named 'invoke' in object."));
-       }
+      gdbpy_ref callable (PyObject_GetAttrString ((PyObject *) cookie,
+                                                 "invoke"));
+      if (callable == NULL)
+       error (_("No method named 'invoke' in object."));
 
-      result = PyObject_Call (callable, args, NULL);
-      Py_DECREF (callable);
-      Py_DECREF (args);
+      result.reset (PyObject_Call (callable.get (), args.get (), NULL));
     }
 
-  if (!result)
+  if (result == NULL)
     {
       PyObject *ptype, *pvalue, *ptraceback;
 
        }
     }
 
-  value = convert_value_from_python (result);
+  value = convert_value_from_python (result.get ());
   if (value == NULL)
     {
-      Py_DECREF (result);
       gdbpy_print_stack ();
       error (_("Error while executing Python code."));
     }
 
-  Py_DECREF (result);
-  do_cleanups (cleanup);
-
   return value;
 }