gdb/python: Return None from Progspace.block_for_pc on error
[deliverable/binutils-gdb.git] / gdb / python / py-prettyprint.c
index a7062225816a69ccb74729911d65805cdfd45f7f..a4df48fe19ab08ae3e4f02efa99769cdd2065443 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.
 
@@ -25,7 +25,7 @@
 #include "extension-priv.h"
 #include "python.h"
 #include "python-internal.h"
-#include "py-ref.h"
+#include "cli/cli-style.h"
 
 /* Return type of print_string_repr.  */
 
@@ -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.
@@ -93,28 +93,26 @@ search_pp_list (PyObject *list, PyObject *value)
 static PyObject *
 find_pretty_printer_from_objfiles (PyObject *value)
 {
-  struct objfile *obj;
+  for (objfile *obj : current_program_space->objfiles ())
+    {
+      gdbpy_ref<> objf = objfile_to_objfile_object (obj);
+      if (objf == NULL)
+       {
+         /* Ignore the error and continue.  */
+         PyErr_Clear ();
+         continue;
+       }
 
-  ALL_OBJFILES (obj)
-  {
-    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.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.  */
-    if (function == NULL)
-      return NULL;
+      gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), NULL));
+      gdbpy_ref<> function (search_pp_list (pp_list.get (), value));
 
-    if (function != Py_None)
-      return function.release ();
-  }
+      /* If there is an error in any objfile list, abort the search and exit.  */
+      if (function == NULL)
+       return NULL;
+
+      if (function != Py_None)
+       return function.release ();
+    }
 
   Py_RETURN_NONE;
 }
@@ -125,7 +123,7 @@ 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)
 {
   gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space);
@@ -142,17 +140,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 +159,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);
@@ -193,7 +191,7 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
   gdbpy_ref<> result;
 
   *out_value = NULL;
-  TRY
+  try
     {
       if (!PyObject_HasAttr (printer, gdbpy_to_string_cst))
        result = gdbpy_ref<>::new_reference (Py_None);
@@ -215,10 +213,9 @@ pretty_print_one_value (PyObject *printer, struct value **out_value)
            }
        }
     }
-  CATCH (except, RETURN_MASK_ALL)
+  catch (const gdb_exception &except)
     {
     }
-  END_CATCH
 
   return result;
 }
@@ -259,22 +256,15 @@ 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>"));
+       fprintf_styled (stream, metadata_style.style (),
+                       _("<error reading variable>"));
       else
-       fprintf_filtered (stream, _("<error reading variable: %s>"),
-                         msg.get ());
+       fprintf_styled (stream, metadata_style.style (),
+                       _("<error reading variable: %s>"), msg.get ());
     }
   else
     gdbpy_print_stack ();
@@ -316,20 +306,15 @@ 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;
              long length;
              struct type *type;
 
-#ifdef IS_PY3K
              output = PyBytes_AS_STRING (string.get ());
              length = PyBytes_GET_SIZE (string.get ());
-#else
-             output = PyString_AsString (string.get ());
-             length = PyString_Size (string.get ());
-#endif
              type = builtin_type (gdbarch)->builtin_char;
 
              if (hint && !strcmp (hint, "string"))
@@ -361,88 +346,6 @@ print_string_repr (PyObject *printer, const char *hint,
   return result;
 }
 
-#ifndef IS_PY3K
-
-/* Create a dummy PyFrameObject, needed to work around
-   a Python-2.4 bug with generators.  */
-class dummy_python_frame
-{
- public:
-
-  dummy_python_frame ();
-
-  ~dummy_python_frame ()
-  {
-    if (m_valid)
-      m_tstate->frame = m_saved_frame;
-  }
-
-  bool failed () const
-  {
-    return !m_valid;
-  }
-
- private:
-
-  bool m_valid;
-  PyFrameObject *m_saved_frame;
-  gdbpy_ref<> m_frame;
-  PyThreadState *m_tstate;
-};
-
-dummy_python_frame::dummy_python_frame ()
-: m_valid (false),
-  m_saved_frame (NULL),
-  m_tstate (NULL)
-{
-  PyCodeObject *code;
-  PyFrameObject *frame;
-
-  gdbpy_ref<> empty_string (PyString_FromString (""));
-  if (empty_string == NULL)
-    return;
-
-  gdbpy_ref<> null_tuple (PyTuple_New (0));
-  if (null_tuple == NULL)
-    return;
-
-  code = PyCode_New (0,                          /* argcount */
-                    0,                   /* locals */
-                    0,                   /* stacksize */
-                    0,                   /* flags */
-                    empty_string.get (), /* code */
-                    null_tuple.get (),   /* consts */
-                    null_tuple.get (),   /* names */
-                    null_tuple.get (),   /* varnames */
-#if PYTHON_API_VERSION >= 1010
-                    null_tuple.get (),   /* freevars */
-                    null_tuple.get (),   /* cellvars */
-#endif
-                    empty_string.get (), /* filename */
-                    empty_string.get (), /* name */
-                    1,                   /* firstlineno */
-                    empty_string.get ()  /* lnotab */
-                    );
-  if (code == NULL)
-    return;
-  gdbpy_ref<> code_holder ((PyObject *) code);
-
-  gdbpy_ref<> globals (PyDict_New ());
-  if (globals == NULL)
-    return;
-
-  m_tstate = PyThreadState_GET ();
-  frame = PyFrame_New (m_tstate, code, globals.get (), NULL);
-  if (frame == NULL)
-    return;
-
-  m_frame.reset ((PyObject *) frame);
-  m_tstate->frame = frame;
-  m_saved_frame = frame->f_back;
-  m_valid = true;
-}
-#endif
-
 /* Helper for gdbpy_apply_val_pretty_printer that formats children of the
    printer, if any exist.  If is_py_none is true, then nothing has
    been printed by to_string, and format output accordingly. */
@@ -491,18 +394,6 @@ print_children (PyObject *printer, const char *hint,
        pretty = options->prettyformat_structs;
     }
 
-  /* Manufacture a dummy Python frame to work around Python 2.4 bug,
-     where it insists on having a non-NULL tstate->frame when
-     a generator is called.  */
-#ifndef IS_PY3K
-  dummy_python_frame frame;
-  if (frame.failed ())
-    {
-      gdbpy_print_stack ();
-      return;
-    }
-#endif
-
   done_flag = 0;
   for (i = 0; i < options->print_max; ++i)
     {
@@ -628,7 +519,17 @@ print_children (PyObject *printer, const char *hint,
              error (_("Error while executing Python code."));
            }
          else
-           common_val_print (value, stream, recurse + 1, options, language);
+           {
+             /* When printing the key of a map we allow one additional
+                level of depth.  This means the key will print before the
+                value does.  */
+             struct value_print_options opt = *options;
+             if (is_map && i % 2 == 0
+                 && opt.max_depth != -1
+                 && opt.max_depth < INT_MAX)
+               ++opt.max_depth;
+             common_val_print (value, stream, recurse + 1, &opt, language);
+           }
        }
 
       if (is_map && i % 2 == 0)
@@ -701,6 +602,9 @@ gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
   if (printer == Py_None)
     return EXT_LANG_RC_NOP;
 
+  if (val_print_check_max_depth (stream, recurse, options, language))
+    return EXT_LANG_RC_OK;
+
   /* If we are printing a map, we want some special formatting.  */
   gdb::unique_xmalloc_ptr<char> hint (gdbpy_get_display_hint (printer.get ()));
 
@@ -744,18 +648,17 @@ 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
+  try
     {
       value = value_copy (value);
     }
-  CATCH (except, RETURN_MASK_ALL)
+  catch (const gdb_exception &except)
     {
       GDB_PY_HANDLE_EXCEPTION (except);
     }
-  END_CATCH
 
   gdbpy_ref<> val_obj (value_to_value_object (value));
   if (val_obj == NULL)
@@ -772,7 +675,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 +687,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.028785 seconds and 4 git commands to generate.