Use a wrapper for PyErr_Fetch
[deliverable/binutils-gdb.git] / gdb / python / py-prettyprint.c
index 7da0f2d9af2c12269da0a494c727c016ffa9c97b..ac0506f3e11eeb56be9252dd8ca481778d264bb8 100644 (file)
@@ -1,6 +1,6 @@
 /* Python pretty-printing
 
-   Copyright (C) 2008-2018 Free Software Foundation, Inc.
+   Copyright (C) 2008-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -45,7 +45,7 @@ enum string_repr_result
    will return None.  On error, it will set the Python error and
    return NULL.  */
 
-static PyObject *
+static gdbpy_ref<>
 search_pp_list (PyObject *list, PyObject *value)
 {
   Py_ssize_t pp_list_size, list_index;
@@ -78,10 +78,10 @@ search_pp_list (PyObject *list, PyObject *value)
       if (printer == NULL)
        return NULL;
       else if (printer != Py_None)
-       return printer.release ();
+       return printer;
     }
 
-  Py_RETURN_NONE;
+  return gdbpy_ref<>::new_reference (Py_None);
 }
 
 /* Subroutine of find_pretty_printer to simplify it.
@@ -97,15 +97,15 @@ find_pretty_printer_from_objfiles (PyObject *value)
 
   ALL_OBJFILES (obj)
   {
-    PyObject *objf = objfile_to_objfile_object (obj);
-    if (!objf)
+    gdbpy_ref<> objf = objfile_to_objfile_object (obj);
+    if (objf == NULL)
       {
        /* Ignore the error and continue.  */
        PyErr_Clear ();
        continue;
       }
 
-    gdbpy_ref<> pp_list (objfpy_get_printers (objf, NULL));
+    gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), NULL));
     gdbpy_ref<> function (search_pp_list (pp_list.get (), value));
 
     /* If there is an error in any objfile list, abort the search and exit.  */
@@ -125,14 +125,14 @@ find_pretty_printer_from_objfiles (PyObject *value)
    The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
    Otherwise the result is the pretty-printer function, suitably inc-ref'd.  */
 
-static PyObject *
+static gdbpy_ref<>
 find_pretty_printer_from_progspace (PyObject *value)
 {
-  PyObject *obj = pspace_to_pspace_object (current_program_space);
+  gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space);
 
-  if (!obj)
+  if (obj == NULL)
     return NULL;
-  gdbpy_ref<> pp_list (pspy_get_printers (obj, NULL));
+  gdbpy_ref<> pp_list (pspy_get_printers (obj.get (), NULL));
   return search_pp_list (pp_list.get (), value);
 }
 
@@ -142,17 +142,17 @@ find_pretty_printer_from_progspace (PyObject *value)
    The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
    Otherwise the result is the pretty-printer function, suitably inc-ref'd.  */
 
-static PyObject *
+static gdbpy_ref<>
 find_pretty_printer_from_gdb (PyObject *value)
 {
   /* Fetch the global pretty printer list.  */
   if (gdb_python_module == NULL
       || ! PyObject_HasAttrString (gdb_python_module, "pretty_printers"))
-    Py_RETURN_NONE;
+    return gdbpy_ref<>::new_reference (Py_None);
   gdbpy_ref<> pp_list (PyObject_GetAttrString (gdb_python_module,
                                               "pretty_printers"));
   if (pp_list == NULL || ! PyList_Check (pp_list.get ()))
-    Py_RETURN_NONE;
+    return gdbpy_ref<>::new_reference (Py_None);
 
   return search_pp_list (pp_list.get (), value);
 }
@@ -161,19 +161,19 @@ find_pretty_printer_from_gdb (PyObject *value)
    pretty-printer exists, return None.  If one exists, return a new
    reference.  On error, set the Python error and return NULL.  */
 
-static PyObject *
+static gdbpy_ref<>
 find_pretty_printer (PyObject *value)
 {
   /* Look at the pretty-printer list for each objfile
      in the current program-space.  */
   gdbpy_ref<> function (find_pretty_printer_from_objfiles (value));
   if (function == NULL || function != Py_None)
-    return function.release ();
+    return function;
 
   /* Look at the pretty-printer list for the current program-space.  */
-  function.reset (find_pretty_printer_from_progspace (value));
+  function = find_pretty_printer_from_progspace (value);
   if (function == NULL || function != Py_None)
-    return function.release ();
+    return function;
 
   /* Look at the pretty-printer list in the gdb module.  */
   return find_pretty_printer_from_gdb (value);
@@ -259,16 +259,8 @@ print_stack_unless_memory_error (struct ui_file *stream)
 {
   if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error))
     {
-      PyObject *type, *value, *trace;
-
-      PyErr_Fetch (&type, &value, &trace);
-
-      gdbpy_ref<> type_ref (type);
-      gdbpy_ref<> value_ref (value);
-      gdbpy_ref<> trace_ref (trace);
-
-      gdb::unique_xmalloc_ptr<char>
-       msg (gdbpy_exception_to_string (type, value));
+      gdbpy_err_fetch fetched_error;
+      gdb::unique_xmalloc_ptr<char> msg = fetched_error.to_string ();
 
       if (msg == NULL || *msg == '\0')
        fprintf_filtered (stream, _("<error reading variable>"));
@@ -316,7 +308,7 @@ print_string_repr (PyObject *printer, const char *hint,
       else
        {
          gdbpy_ref<> string
-           (python_string_to_target_python_string (py_str.get ()));
+           = python_string_to_target_python_string (py_str.get ());
          if (string != NULL)
            {
              char *output;
@@ -744,7 +736,7 @@ apply_varobj_pretty_printer (PyObject *printer_obj,
    reference to the object if successful; returns NULL if not.  VALUE
    is the value for which a printer tests to determine if it
    can pretty-print the value.  */
-PyObject *
+gdbpy_ref<>
 gdbpy_get_varobj_pretty_printer (struct value *value)
 {
   TRY
@@ -772,7 +764,6 @@ PyObject *
 gdbpy_default_visualizer (PyObject *self, PyObject *args)
 {
   PyObject *val_obj;
-  PyObject *cons;
   struct value *value;
 
   if (! PyArg_ParseTuple (args, "O", &val_obj))
@@ -785,6 +776,5 @@ gdbpy_default_visualizer (PyObject *self, PyObject *args)
       return NULL;
     }
 
-  cons = find_pretty_printer (val_obj);
-  return cons;
+  return find_pretty_printer (val_obj).release ();
 }
This page took 0.027859 seconds and 4 git commands to generate.