OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [python/] [py-prettyprint.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Python pretty-printing
/* Python pretty-printing
 
 
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include "exceptions.h"
#include "exceptions.h"
#include "objfiles.h"
#include "objfiles.h"
#include "symtab.h"
#include "symtab.h"
#include "language.h"
#include "language.h"
#include "valprint.h"
#include "valprint.h"
 
 
#include "python.h"
#include "python.h"
 
 
#ifdef HAVE_PYTHON
#ifdef HAVE_PYTHON
#include "python-internal.h"
#include "python-internal.h"
 
 
 
 
/* Helper function for find_pretty_printer which iterates over a list,
/* Helper function for find_pretty_printer which iterates over a list,
   calls each function and inspects output.  This will return a
   calls each function and inspects output.  This will return a
   printer object if one recognizes VALUE.  If no printer is found, it
   printer object if one recognizes VALUE.  If no printer is found, it
   will return None.  On error, it will set the Python error and
   will return None.  On error, it will set the Python error and
   return NULL.  */
   return NULL.  */
static PyObject *
static PyObject *
search_pp_list (PyObject *list, PyObject *value)
search_pp_list (PyObject *list, PyObject *value)
{
{
  Py_ssize_t pp_list_size, list_index;
  Py_ssize_t pp_list_size, list_index;
  PyObject *function, *printer = NULL;
  PyObject *function, *printer = NULL;
 
 
  pp_list_size = PyList_Size (list);
  pp_list_size = PyList_Size (list);
  for (list_index = 0; list_index < pp_list_size; list_index++)
  for (list_index = 0; list_index < pp_list_size; list_index++)
    {
    {
      function = PyList_GetItem (list, list_index);
      function = PyList_GetItem (list, list_index);
      if (! function)
      if (! function)
        return NULL;
        return NULL;
 
 
      printer = PyObject_CallFunctionObjArgs (function, value, NULL);
      printer = PyObject_CallFunctionObjArgs (function, value, NULL);
      if (! printer)
      if (! printer)
        return NULL;
        return NULL;
      else if (printer != Py_None)
      else if (printer != Py_None)
        return printer;
        return printer;
 
 
      Py_DECREF (printer);
      Py_DECREF (printer);
    }
    }
 
 
  Py_RETURN_NONE;
  Py_RETURN_NONE;
}
}
 
 
/* Find the pretty-printing constructor function for VALUE.  If no
/* Find the pretty-printing constructor function for VALUE.  If no
   pretty-printer exists, return None.  If one exists, return a new
   pretty-printer exists, return None.  If one exists, return a new
   reference.  On error, set the Python error and return NULL.  */
   reference.  On error, set the Python error and return NULL.  */
static PyObject *
static PyObject *
find_pretty_printer (PyObject *value)
find_pretty_printer (PyObject *value)
{
{
  PyObject *pp_list = NULL;
  PyObject *pp_list = NULL;
  PyObject *function = NULL;
  PyObject *function = NULL;
  struct objfile *obj;
  struct objfile *obj;
  volatile struct gdb_exception except;
  volatile struct gdb_exception except;
 
 
  /* Look at the pretty-printer dictionary for each objfile.  */
  /* Look at the pretty-printer dictionary for each objfile.  */
  ALL_OBJFILES (obj)
  ALL_OBJFILES (obj)
  {
  {
    PyObject *objf = objfile_to_objfile_object (obj);
    PyObject *objf = objfile_to_objfile_object (obj);
    if (!objf)
    if (!objf)
      {
      {
        /* Ignore the error and continue.  */
        /* Ignore the error and continue.  */
        PyErr_Clear ();
        PyErr_Clear ();
        continue;
        continue;
      }
      }
 
 
    pp_list = objfpy_get_printers (objf, NULL);
    pp_list = objfpy_get_printers (objf, NULL);
    function = search_pp_list (pp_list, value);
    function = search_pp_list (pp_list, value);
 
 
    /* If there is an error in any objfile list, abort the search and
    /* If there is an error in any objfile list, abort the search and
       exit.  */
       exit.  */
    if (! function)
    if (! function)
      {
      {
        Py_XDECREF (pp_list);
        Py_XDECREF (pp_list);
        return NULL;
        return NULL;
      }
      }
 
 
    if (function != Py_None)
    if (function != Py_None)
      goto done;
      goto done;
 
 
    Py_DECREF (function);
    Py_DECREF (function);
    Py_XDECREF (pp_list);
    Py_XDECREF (pp_list);
  }
  }
 
 
  pp_list = NULL;
  pp_list = NULL;
  /* Fetch the global pretty printer dictionary.  */
  /* Fetch the global pretty printer dictionary.  */
  if (! PyObject_HasAttrString (gdb_module, "pretty_printers"))
  if (! PyObject_HasAttrString (gdb_module, "pretty_printers"))
    {
    {
      function = Py_None;
      function = Py_None;
      Py_INCREF (function);
      Py_INCREF (function);
      goto done;
      goto done;
    }
    }
  pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers");
  pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers");
  if (! pp_list)
  if (! pp_list)
    goto done;
    goto done;
  if (! PyList_Check (pp_list))
  if (! PyList_Check (pp_list))
    goto done;
    goto done;
 
 
  function = search_pp_list (pp_list, value);
  function = search_pp_list (pp_list, value);
 
 
 done:
 done:
  Py_XDECREF (pp_list);
  Py_XDECREF (pp_list);
 
 
  return function;
  return function;
}
}
 
 
 
 
/* Pretty-print a single value, via the printer object PRINTER.
/* Pretty-print a single value, via the printer object PRINTER.
   If the function returns a string, a PyObject containing the string
   If the function returns a string, a PyObject containing the string
   is returned.  Otherwise, if the function returns a value,
   is returned.  Otherwise, if the function returns a value,
   *OUT_VALUE is set to the value, and NULL is returned.  On error,
   *OUT_VALUE is set to the value, and NULL is returned.  On error,
   *OUT_VALUE is set to NULL, and NULL is returned.  */
   *OUT_VALUE is set to NULL, and NULL is returned.  */
static PyObject *
static PyObject *
pretty_print_one_value (PyObject *printer, struct value **out_value)
pretty_print_one_value (PyObject *printer, struct value **out_value)
{
{
  volatile struct gdb_exception except;
  volatile struct gdb_exception except;
  PyObject *result = NULL;
  PyObject *result = NULL;
 
 
  *out_value = NULL;
  *out_value = NULL;
  TRY_CATCH (except, RETURN_MASK_ALL)
  TRY_CATCH (except, RETURN_MASK_ALL)
    {
    {
      result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL);
      result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL);
      if (result)
      if (result)
        {
        {
          if (! gdbpy_is_string (result) && ! gdbpy_is_lazy_string (result))
          if (! gdbpy_is_string (result) && ! gdbpy_is_lazy_string (result))
            {
            {
              *out_value = convert_value_from_python (result);
              *out_value = convert_value_from_python (result);
              if (PyErr_Occurred ())
              if (PyErr_Occurred ())
                *out_value = NULL;
                *out_value = NULL;
              Py_DECREF (result);
              Py_DECREF (result);
              result = NULL;
              result = NULL;
            }
            }
        }
        }
    }
    }
 
 
  return result;
  return result;
}
}
 
 
/* Return the display hint for the object printer, PRINTER.  Return
/* Return the display hint for the object printer, PRINTER.  Return
   NULL if there is no display_hint method, or if the method did not
   NULL if there is no display_hint method, or if the method did not
   return a string.  On error, print stack trace and return NULL.  On
   return a string.  On error, print stack trace and return NULL.  On
   success, return an xmalloc()d string.  */
   success, return an xmalloc()d string.  */
char *
char *
gdbpy_get_display_hint (PyObject *printer)
gdbpy_get_display_hint (PyObject *printer)
{
{
  PyObject *hint;
  PyObject *hint;
  char *result = NULL;
  char *result = NULL;
 
 
  if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst))
  if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst))
    return NULL;
    return NULL;
 
 
  hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL);
  hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL);
  if (gdbpy_is_string (hint))
  if (gdbpy_is_string (hint))
    result = python_string_to_host_string (hint);
    result = python_string_to_host_string (hint);
  if (hint)
  if (hint)
    Py_DECREF (hint);
    Py_DECREF (hint);
  else
  else
    gdbpy_print_stack ();
    gdbpy_print_stack ();
 
 
  return result;
  return result;
}
}
 
 
/* Helper for apply_val_pretty_printer which calls to_string and
/* Helper for apply_val_pretty_printer which calls to_string and
   formats the result.  */
   formats the result.  */
static void
static void
print_string_repr (PyObject *printer, const char *hint,
print_string_repr (PyObject *printer, const char *hint,
                   struct ui_file *stream, int recurse,
                   struct ui_file *stream, int recurse,
                   const struct value_print_options *options,
                   const struct value_print_options *options,
                   const struct language_defn *language,
                   const struct language_defn *language,
                   struct gdbarch *gdbarch)
                   struct gdbarch *gdbarch)
{
{
  struct value *replacement = NULL;
  struct value *replacement = NULL;
  PyObject *py_str = NULL;
  PyObject *py_str = NULL;
 
 
  py_str = pretty_print_one_value (printer, &replacement);
  py_str = pretty_print_one_value (printer, &replacement);
  if (py_str)
  if (py_str)
    {
    {
      gdb_byte *output = NULL;
      gdb_byte *output = NULL;
      long length;
      long length;
      struct type *type;
      struct type *type;
      char *encoding = NULL;
      char *encoding = NULL;
      PyObject *string = NULL;
      PyObject *string = NULL;
      int is_lazy;
      int is_lazy;
 
 
      is_lazy = gdbpy_is_lazy_string (py_str);
      is_lazy = gdbpy_is_lazy_string (py_str);
      if (is_lazy)
      if (is_lazy)
        output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding);
        output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding);
      else
      else
        {
        {
          string = python_string_to_target_python_string (py_str);
          string = python_string_to_target_python_string (py_str);
          if (string)
          if (string)
            {
            {
              output = PyString_AsString (string);
              output = PyString_AsString (string);
              length = PyString_Size (string);
              length = PyString_Size (string);
              type = builtin_type (gdbarch)->builtin_char;
              type = builtin_type (gdbarch)->builtin_char;
            }
            }
          else
          else
            gdbpy_print_stack ();
            gdbpy_print_stack ();
 
 
        }
        }
 
 
      if (output)
      if (output)
        {
        {
          if (is_lazy || (hint && !strcmp (hint, "string")))
          if (is_lazy || (hint && !strcmp (hint, "string")))
            LA_PRINT_STRING (stream, type, output, length, encoding,
            LA_PRINT_STRING (stream, type, output, length, encoding,
                             0, options);
                             0, options);
          else
          else
            fputs_filtered (output, stream);
            fputs_filtered (output, stream);
        }
        }
      else
      else
        gdbpy_print_stack ();
        gdbpy_print_stack ();
 
 
      if (string)
      if (string)
        Py_DECREF (string);
        Py_DECREF (string);
      else
      else
        xfree (output);
        xfree (output);
 
 
      xfree (encoding);
      xfree (encoding);
      Py_DECREF (py_str);
      Py_DECREF (py_str);
    }
    }
  else if (replacement)
  else if (replacement)
    {
    {
      struct value_print_options opts = *options;
      struct value_print_options opts = *options;
 
 
      opts.addressprint = 0;
      opts.addressprint = 0;
      common_val_print (replacement, stream, recurse, &opts, language);
      common_val_print (replacement, stream, recurse, &opts, language);
    }
    }
  else
  else
    gdbpy_print_stack ();
    gdbpy_print_stack ();
}
}
 
 
static void
static void
py_restore_tstate (void *p)
py_restore_tstate (void *p)
{
{
  PyFrameObject *frame = p;
  PyFrameObject *frame = p;
  PyThreadState *tstate = PyThreadState_GET ();
  PyThreadState *tstate = PyThreadState_GET ();
  tstate->frame = frame;
  tstate->frame = frame;
}
}
 
 
/* Create a dummy PyFrameObject, needed to work around
/* Create a dummy PyFrameObject, needed to work around
   a Python-2.4 bug with generators.  */
   a Python-2.4 bug with generators.  */
static PyObject *
static PyObject *
push_dummy_python_frame ()
push_dummy_python_frame ()
{
{
  PyObject *empty_string, *null_tuple, *globals;
  PyObject *empty_string, *null_tuple, *globals;
  PyCodeObject *code;
  PyCodeObject *code;
  PyFrameObject *frame;
  PyFrameObject *frame;
  PyThreadState *tstate;
  PyThreadState *tstate;
 
 
  empty_string = PyString_FromString ("");
  empty_string = PyString_FromString ("");
  if (!empty_string)
  if (!empty_string)
    return NULL;
    return NULL;
 
 
  null_tuple = PyTuple_New (0);
  null_tuple = PyTuple_New (0);
  if (!null_tuple)
  if (!null_tuple)
    {
    {
      Py_DECREF (empty_string);
      Py_DECREF (empty_string);
      return NULL;
      return NULL;
    }
    }
 
 
  code = PyCode_New (0,                  /* argcount */
  code = PyCode_New (0,                  /* argcount */
                     0,                  /* nlocals */
                     0,                  /* nlocals */
                     0,                  /* stacksize */
                     0,                  /* stacksize */
                     0,                  /* flags */
                     0,                  /* flags */
                     empty_string,      /* code */
                     empty_string,      /* code */
                     null_tuple,        /* consts */
                     null_tuple,        /* consts */
                     null_tuple,        /* names */
                     null_tuple,        /* names */
                     null_tuple,        /* varnames */
                     null_tuple,        /* varnames */
#if PYTHON_API_VERSION >= 1010
#if PYTHON_API_VERSION >= 1010
                     null_tuple,        /* freevars */
                     null_tuple,        /* freevars */
                     null_tuple,        /* cellvars */
                     null_tuple,        /* cellvars */
#endif
#endif
                     empty_string,      /* filename */
                     empty_string,      /* filename */
                     empty_string,      /* name */
                     empty_string,      /* name */
                     1,                 /* firstlineno */
                     1,                 /* firstlineno */
                     empty_string       /* lnotab */
                     empty_string       /* lnotab */
                    );
                    );
 
 
  Py_DECREF (empty_string);
  Py_DECREF (empty_string);
  Py_DECREF (null_tuple);
  Py_DECREF (null_tuple);
 
 
  if (!code)
  if (!code)
    return NULL;
    return NULL;
 
 
  globals = PyDict_New ();
  globals = PyDict_New ();
  if (!globals)
  if (!globals)
    {
    {
      Py_DECREF (code);
      Py_DECREF (code);
      return NULL;
      return NULL;
    }
    }
 
 
  tstate = PyThreadState_GET ();
  tstate = PyThreadState_GET ();
 
 
  frame = PyFrame_New (tstate, code, globals, NULL);
  frame = PyFrame_New (tstate, code, globals, NULL);
 
 
  Py_DECREF (globals);
  Py_DECREF (globals);
  Py_DECREF (code);
  Py_DECREF (code);
 
 
  if (!frame)
  if (!frame)
    return NULL;
    return NULL;
 
 
  tstate->frame = frame;
  tstate->frame = frame;
  make_cleanup (py_restore_tstate, frame->f_back);
  make_cleanup (py_restore_tstate, frame->f_back);
  return (PyObject *) frame;
  return (PyObject *) frame;
}
}
 
 
/* Helper for apply_val_pretty_printer that formats children of the
/* Helper for apply_val_pretty_printer that formats children of the
   printer, if any exist.  */
   printer, if any exist.  */
static void
static void
print_children (PyObject *printer, const char *hint,
print_children (PyObject *printer, const char *hint,
                struct ui_file *stream, int recurse,
                struct ui_file *stream, int recurse,
                const struct value_print_options *options,
                const struct value_print_options *options,
                const struct language_defn *language)
                const struct language_defn *language)
{
{
  int is_map, is_array, done_flag, pretty;
  int is_map, is_array, done_flag, pretty;
  unsigned int i;
  unsigned int i;
  PyObject *children, *iter, *frame;
  PyObject *children, *iter, *frame;
  struct cleanup *cleanups;
  struct cleanup *cleanups;
 
 
  if (! PyObject_HasAttr (printer, gdbpy_children_cst))
  if (! PyObject_HasAttr (printer, gdbpy_children_cst))
    return;
    return;
 
 
  /* If we are printing a map or an array, we want some special
  /* If we are printing a map or an array, we want some special
     formatting.  */
     formatting.  */
  is_map = hint && ! strcmp (hint, "map");
  is_map = hint && ! strcmp (hint, "map");
  is_array = hint && ! strcmp (hint, "array");
  is_array = hint && ! strcmp (hint, "array");
 
 
  children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
  children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
                                         NULL);
                                         NULL);
  if (! children)
  if (! children)
    {
    {
      gdbpy_print_stack ();
      gdbpy_print_stack ();
      return;
      return;
    }
    }
 
 
  cleanups = make_cleanup_py_decref (children);
  cleanups = make_cleanup_py_decref (children);
 
 
  iter = PyObject_GetIter (children);
  iter = PyObject_GetIter (children);
  if (!iter)
  if (!iter)
    {
    {
      gdbpy_print_stack ();
      gdbpy_print_stack ();
      goto done;
      goto done;
    }
    }
  make_cleanup_py_decref (iter);
  make_cleanup_py_decref (iter);
 
 
  /* Use the prettyprint_arrays option if we are printing an array,
  /* Use the prettyprint_arrays option if we are printing an array,
     and the pretty option otherwise.  */
     and the pretty option otherwise.  */
  pretty = is_array ? options->prettyprint_arrays : options->pretty;
  pretty = is_array ? options->prettyprint_arrays : options->pretty;
 
 
  /* Manufacture a dummy Python frame to work around Python 2.4 bug,
  /* Manufacture a dummy Python frame to work around Python 2.4 bug,
     where it insists on having a non-NULL tstate->frame when
     where it insists on having a non-NULL tstate->frame when
     a generator is called.  */
     a generator is called.  */
  frame = push_dummy_python_frame ();
  frame = push_dummy_python_frame ();
  if (!frame)
  if (!frame)
    {
    {
      gdbpy_print_stack ();
      gdbpy_print_stack ();
      goto done;
      goto done;
    }
    }
  make_cleanup_py_decref (frame);
  make_cleanup_py_decref (frame);
 
 
  done_flag = 0;
  done_flag = 0;
  for (i = 0; i < options->print_max; ++i)
  for (i = 0; i < options->print_max; ++i)
    {
    {
      PyObject *py_v, *item = PyIter_Next (iter);
      PyObject *py_v, *item = PyIter_Next (iter);
      char *name;
      char *name;
      struct cleanup *inner_cleanup;
      struct cleanup *inner_cleanup;
 
 
      if (! item)
      if (! item)
        {
        {
          if (PyErr_Occurred ())
          if (PyErr_Occurred ())
            gdbpy_print_stack ();
            gdbpy_print_stack ();
          /* Set a flag so we can know whether we printed all the
          /* Set a flag so we can know whether we printed all the
             available elements.  */
             available elements.  */
          else
          else
            done_flag = 1;
            done_flag = 1;
          break;
          break;
        }
        }
 
 
      if (! PyArg_ParseTuple (item, "sO", &name, &py_v))
      if (! PyArg_ParseTuple (item, "sO", &name, &py_v))
        {
        {
          gdbpy_print_stack ();
          gdbpy_print_stack ();
          Py_DECREF (item);
          Py_DECREF (item);
          continue;
          continue;
        }
        }
      inner_cleanup = make_cleanup_py_decref (item);
      inner_cleanup = make_cleanup_py_decref (item);
 
 
      /* Print initial "{".  For other elements, there are three
      /* Print initial "{".  For other elements, there are three
         cases:
         cases:
         1. Maps.  Print a "," after each value element.
         1. Maps.  Print a "," after each value element.
         2. Arrays.  Always print a ",".
         2. Arrays.  Always print a ",".
         3. Other.  Always print a ",".  */
         3. Other.  Always print a ",".  */
      if (i == 0)
      if (i == 0)
        fputs_filtered (" = {", stream);
        fputs_filtered (" = {", stream);
      else if (! is_map || i % 2 == 0)
      else if (! is_map || i % 2 == 0)
        fputs_filtered (pretty ? "," : ", ", stream);
        fputs_filtered (pretty ? "," : ", ", stream);
 
 
      /* In summary mode, we just want to print "= {...}" if there is
      /* In summary mode, we just want to print "= {...}" if there is
         a value.  */
         a value.  */
      if (options->summary)
      if (options->summary)
        {
        {
          /* This increment tricks the post-loop logic to print what
          /* This increment tricks the post-loop logic to print what
             we want.  */
             we want.  */
          ++i;
          ++i;
          /* Likewise.  */
          /* Likewise.  */
          pretty = 0;
          pretty = 0;
          break;
          break;
        }
        }
 
 
      if (! is_map || i % 2 == 0)
      if (! is_map || i % 2 == 0)
        {
        {
          if (pretty)
          if (pretty)
            {
            {
              fputs_filtered ("\n", stream);
              fputs_filtered ("\n", stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
            }
          else
          else
            wrap_here (n_spaces (2 + 2 *recurse));
            wrap_here (n_spaces (2 + 2 *recurse));
        }
        }
 
 
      if (is_map && i % 2 == 0)
      if (is_map && i % 2 == 0)
        fputs_filtered ("[", stream);
        fputs_filtered ("[", stream);
      else if (is_array)
      else if (is_array)
        {
        {
          /* We print the index, not whatever the child method
          /* We print the index, not whatever the child method
             returned as the name.  */
             returned as the name.  */
          if (options->print_array_indexes)
          if (options->print_array_indexes)
            fprintf_filtered (stream, "[%d] = ", i);
            fprintf_filtered (stream, "[%d] = ", i);
        }
        }
      else if (! is_map)
      else if (! is_map)
        {
        {
          fputs_filtered (name, stream);
          fputs_filtered (name, stream);
          fputs_filtered (" = ", stream);
          fputs_filtered (" = ", stream);
        }
        }
 
 
      if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v))
      if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v))
        {
        {
          gdb_byte *output = NULL;
          gdb_byte *output = NULL;
 
 
          if (gdbpy_is_lazy_string (py_v))
          if (gdbpy_is_lazy_string (py_v))
            {
            {
              struct type *type;
              struct type *type;
              long length;
              long length;
              char *encoding = NULL;
              char *encoding = NULL;
 
 
              output = gdbpy_extract_lazy_string (py_v, &type,
              output = gdbpy_extract_lazy_string (py_v, &type,
                                                  &length, &encoding);
                                                  &length, &encoding);
              if (!output)
              if (!output)
                gdbpy_print_stack ();
                gdbpy_print_stack ();
              LA_PRINT_STRING (stream, type, output, length, encoding,
              LA_PRINT_STRING (stream, type, output, length, encoding,
                               0, options);
                               0, options);
              xfree (encoding);
              xfree (encoding);
              xfree (output);
              xfree (output);
            }
            }
          else
          else
            {
            {
              output = python_string_to_host_string (py_v);
              output = python_string_to_host_string (py_v);
              fputs_filtered (output, stream);
              fputs_filtered (output, stream);
              xfree (output);
              xfree (output);
            }
            }
        }
        }
      else
      else
        {
        {
          struct value *value = convert_value_from_python (py_v);
          struct value *value = convert_value_from_python (py_v);
 
 
          if (value == NULL)
          if (value == NULL)
            {
            {
              gdbpy_print_stack ();
              gdbpy_print_stack ();
              error (_("Error while executing Python code."));
              error (_("Error while executing Python code."));
            }
            }
          else
          else
            common_val_print (value, stream, recurse + 1, options, language);
            common_val_print (value, stream, recurse + 1, options, language);
        }
        }
 
 
      if (is_map && i % 2 == 0)
      if (is_map && i % 2 == 0)
        fputs_filtered ("] = ", stream);
        fputs_filtered ("] = ", stream);
 
 
      do_cleanups (inner_cleanup);
      do_cleanups (inner_cleanup);
    }
    }
 
 
  if (i)
  if (i)
    {
    {
      if (!done_flag)
      if (!done_flag)
        {
        {
          if (pretty)
          if (pretty)
            {
            {
              fputs_filtered ("\n", stream);
              fputs_filtered ("\n", stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
            }
          fputs_filtered ("...", stream);
          fputs_filtered ("...", stream);
        }
        }
      if (pretty)
      if (pretty)
        {
        {
          fputs_filtered ("\n", stream);
          fputs_filtered ("\n", stream);
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
      fputs_filtered ("}", stream);
      fputs_filtered ("}", stream);
    }
    }
 
 
 done:
 done:
  do_cleanups (cleanups);
  do_cleanups (cleanups);
}
}
 
 
int
int
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
                          int embedded_offset, CORE_ADDR address,
                          int embedded_offset, CORE_ADDR address,
                          struct ui_file *stream, int recurse,
                          struct ui_file *stream, int recurse,
                          const struct value_print_options *options,
                          const struct value_print_options *options,
                          const struct language_defn *language)
                          const struct language_defn *language)
{
{
  struct gdbarch *gdbarch = get_type_arch (type);
  struct gdbarch *gdbarch = get_type_arch (type);
  PyObject *printer = NULL;
  PyObject *printer = NULL;
  PyObject *val_obj = NULL;
  PyObject *val_obj = NULL;
  struct value *value;
  struct value *value;
  char *hint = NULL;
  char *hint = NULL;
  struct cleanup *cleanups;
  struct cleanup *cleanups;
  int result = 0;
  int result = 0;
 
 
  cleanups = ensure_python_env (gdbarch, language);
  cleanups = ensure_python_env (gdbarch, language);
 
 
  /* Instantiate the printer.  */
  /* Instantiate the printer.  */
  if (valaddr)
  if (valaddr)
    valaddr += embedded_offset;
    valaddr += embedded_offset;
  value = value_from_contents_and_address (type, valaddr,
  value = value_from_contents_and_address (type, valaddr,
                                           address + embedded_offset);
                                           address + embedded_offset);
 
 
  val_obj = value_to_value_object (value);
  val_obj = value_to_value_object (value);
  if (! val_obj)
  if (! val_obj)
    goto done;
    goto done;
 
 
  /* Find the constructor.  */
  /* Find the constructor.  */
  printer = find_pretty_printer (val_obj);
  printer = find_pretty_printer (val_obj);
  Py_DECREF (val_obj);
  Py_DECREF (val_obj);
  make_cleanup_py_decref (printer);
  make_cleanup_py_decref (printer);
  if (! printer || printer == Py_None)
  if (! printer || printer == Py_None)
    goto done;
    goto done;
 
 
  /* If we are printing a map, we want some special formatting.  */
  /* If we are printing a map, we want some special formatting.  */
  hint = gdbpy_get_display_hint (printer);
  hint = gdbpy_get_display_hint (printer);
  make_cleanup (free_current_contents, &hint);
  make_cleanup (free_current_contents, &hint);
 
 
  /* Print the section */
  /* Print the section */
  print_string_repr (printer, hint, stream, recurse, options, language,
  print_string_repr (printer, hint, stream, recurse, options, language,
                     gdbarch);
                     gdbarch);
  print_children (printer, hint, stream, recurse, options, language);
  print_children (printer, hint, stream, recurse, options, language);
  result = 1;
  result = 1;
 
 
 
 
 done:
 done:
  if (PyErr_Occurred ())
  if (PyErr_Occurred ())
    gdbpy_print_stack ();
    gdbpy_print_stack ();
  do_cleanups (cleanups);
  do_cleanups (cleanups);
  return result;
  return result;
}
}
 
 
 
 
/* Apply a pretty-printer for the varobj code.  PRINTER_OBJ is the
/* Apply a pretty-printer for the varobj code.  PRINTER_OBJ is the
   print object.  It must have a 'to_string' method (but this is
   print object.  It must have a 'to_string' method (but this is
   checked by varobj, not here) which takes no arguments and
   checked by varobj, not here) which takes no arguments and
   returns a string.  The printer will return a value and in the case
   returns a string.  The printer will return a value and in the case
   of a Python string being returned, this function will return a
   of a Python string being returned, this function will return a
   PyObject containing the string.  For any other type, *REPLACEMENT is
   PyObject containing the string.  For any other type, *REPLACEMENT is
   set to the replacement value and this function returns NULL.  On
   set to the replacement value and this function returns NULL.  On
   error, *REPLACEMENT is set to NULL and this function also returns
   error, *REPLACEMENT is set to NULL and this function also returns
   NULL.  */
   NULL.  */
PyObject *
PyObject *
apply_varobj_pretty_printer (PyObject *printer_obj,
apply_varobj_pretty_printer (PyObject *printer_obj,
                             struct value **replacement)
                             struct value **replacement)
{
{
  int size = 0;
  int size = 0;
  PyObject *py_str = NULL;
  PyObject *py_str = NULL;
 
 
  *replacement = NULL;
  *replacement = NULL;
  py_str = pretty_print_one_value (printer_obj, replacement);
  py_str = pretty_print_one_value (printer_obj, replacement);
 
 
  if (*replacement == NULL && py_str == NULL)
  if (*replacement == NULL && py_str == NULL)
    gdbpy_print_stack ();
    gdbpy_print_stack ();
 
 
  return py_str;
  return py_str;
}
}
 
 
/* Find a pretty-printer object for the varobj module.  Returns a new
/* Find a pretty-printer object for the varobj module.  Returns a new
   reference to the object if successful; returns NULL if not.  VALUE
   reference to the object if successful; returns NULL if not.  VALUE
   is the value for which a printer tests to determine if it
   is the value for which a printer tests to determine if it
   can pretty-print the value.  */
   can pretty-print the value.  */
PyObject *
PyObject *
gdbpy_get_varobj_pretty_printer (struct value *value)
gdbpy_get_varobj_pretty_printer (struct value *value)
{
{
  PyObject *val_obj;
  PyObject *val_obj;
  PyObject *pretty_printer = NULL;
  PyObject *pretty_printer = NULL;
  volatile struct gdb_exception except;
  volatile struct gdb_exception except;
 
 
  TRY_CATCH (except, RETURN_MASK_ALL)
  TRY_CATCH (except, RETURN_MASK_ALL)
    {
    {
      value = value_copy (value);
      value = value_copy (value);
    }
    }
  GDB_PY_HANDLE_EXCEPTION (except);
  GDB_PY_HANDLE_EXCEPTION (except);
 
 
  val_obj = value_to_value_object (value);
  val_obj = value_to_value_object (value);
  if (! val_obj)
  if (! val_obj)
    return NULL;
    return NULL;
 
 
  pretty_printer = find_pretty_printer (val_obj);
  pretty_printer = find_pretty_printer (val_obj);
  Py_DECREF (val_obj);
  Py_DECREF (val_obj);
  return pretty_printer;
  return pretty_printer;
}
}
 
 
/* A Python function which wraps find_pretty_printer and instantiates
/* A Python function which wraps find_pretty_printer and instantiates
   the resulting class.  This accepts a Value argument and returns a
   the resulting class.  This accepts a Value argument and returns a
   pretty printer instance, or None.  This function is useful as an
   pretty printer instance, or None.  This function is useful as an
   argument to the MI command -var-set-visualizer.  */
   argument to the MI command -var-set-visualizer.  */
PyObject *
PyObject *
gdbpy_default_visualizer (PyObject *self, PyObject *args)
gdbpy_default_visualizer (PyObject *self, PyObject *args)
{
{
  PyObject *val_obj;
  PyObject *val_obj;
  PyObject *cons, *printer = NULL;
  PyObject *cons, *printer = NULL;
  struct value *value;
  struct value *value;
 
 
  if (! PyArg_ParseTuple (args, "O", &val_obj))
  if (! PyArg_ParseTuple (args, "O", &val_obj))
    return NULL;
    return NULL;
  value = value_object_to_value (val_obj);
  value = value_object_to_value (val_obj);
  if (! value)
  if (! value)
    {
    {
      PyErr_SetString (PyExc_TypeError, "argument must be a gdb.Value");
      PyErr_SetString (PyExc_TypeError, "argument must be a gdb.Value");
      return NULL;
      return NULL;
    }
    }
 
 
  cons = find_pretty_printer (val_obj);
  cons = find_pretty_printer (val_obj);
  return cons;
  return cons;
}
}
 
 
#else /* HAVE_PYTHON */
#else /* HAVE_PYTHON */
 
 
int
int
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
                          int embedded_offset, CORE_ADDR address,
                          int embedded_offset, CORE_ADDR address,
                          struct ui_file *stream, int recurse,
                          struct ui_file *stream, int recurse,
                          const struct value_print_options *options,
                          const struct value_print_options *options,
                          const struct language_defn *language)
                          const struct language_defn *language)
{
{
  return 0;
  return 0;
}
}
 
 
#endif /* HAVE_PYTHON */
#endif /* HAVE_PYTHON */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.