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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [jv-valprint.c] - Diff between revs 105 and 1765

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

Rev 105 Rev 1765
/* Support for printing Java values for GDB, the GNU debugger.
/* Support for printing Java values for GDB, the GNU debugger.
   Copyright 1997-2000 Free Software Foundation, Inc.
   Copyright 1997-2000 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 2 of the License, or
   the Free Software Foundation; either version 2 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, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include "defs.h"
#include "defs.h"
#include "symtab.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbtypes.h"
#include "gdbcore.h"
#include "gdbcore.h"
#include "expression.h"
#include "expression.h"
#include "value.h"
#include "value.h"
#include "demangle.h"
#include "demangle.h"
#include "valprint.h"
#include "valprint.h"
#include "language.h"
#include "language.h"
#include "jv-lang.h"
#include "jv-lang.h"
#include "c-lang.h"
#include "c-lang.h"
#include "annotate.h"
#include "annotate.h"
 
 
/* Local functions */
/* Local functions */
 
 
static void java_print_value_fields (struct type * type, char *valaddr,
static void java_print_value_fields (struct type * type, char *valaddr,
                                     CORE_ADDR address,
                                     CORE_ADDR address,
                                     struct ui_file *stream, int format,
                                     struct ui_file *stream, int format,
                                     int recurse,
                                     int recurse,
                                     enum val_prettyprint pretty);
                                     enum val_prettyprint pretty);
 
 
 
 
int
int
java_value_print (val, stream, format, pretty)
java_value_print (val, stream, format, pretty)
     value_ptr val;
     value_ptr val;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  struct type *type;
  struct type *type;
  CORE_ADDR address;
  CORE_ADDR address;
  int i;
  int i;
  char *name;
  char *name;
 
 
  type = VALUE_TYPE (val);
  type = VALUE_TYPE (val);
  address = VALUE_ADDRESS (val) + VALUE_OFFSET (val);
  address = VALUE_ADDRESS (val) + VALUE_OFFSET (val);
 
 
  if (is_object_type (type))
  if (is_object_type (type))
    {
    {
      CORE_ADDR obj_addr;
      CORE_ADDR obj_addr;
 
 
      /* Get the run-time type, and cast the object into that */
      /* Get the run-time type, and cast the object into that */
 
 
      obj_addr = unpack_pointer (type, VALUE_CONTENTS (val));
      obj_addr = unpack_pointer (type, VALUE_CONTENTS (val));
 
 
      if (obj_addr != 0)
      if (obj_addr != 0)
        {
        {
          type = type_from_class (java_class_from_object (val));
          type = type_from_class (java_class_from_object (val));
          type = lookup_pointer_type (type);
          type = lookup_pointer_type (type);
 
 
          val = value_at (type, address, NULL);
          val = value_at (type, address, NULL);
        }
        }
    }
    }
 
 
  if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
  if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
    type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
    type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
 
 
  name = TYPE_TAG_NAME (type);
  name = TYPE_TAG_NAME (type);
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
      && (i = strlen (name), name[i - 1] == ']'))
      && (i = strlen (name), name[i - 1] == ']'))
    {
    {
      char buf4[4];
      char buf4[4];
      long length;
      long length;
      unsigned int things_printed = 0;
      unsigned int things_printed = 0;
      int reps;
      int reps;
      struct type *el_type = java_primitive_type_from_name (name, i - 2);
      struct type *el_type = java_primitive_type_from_name (name, i - 2);
 
 
      i = 0;
      i = 0;
      read_memory (address + JAVA_OBJECT_SIZE, buf4, 4);
      read_memory (address + JAVA_OBJECT_SIZE, buf4, 4);
 
 
      length = (long) extract_signed_integer (buf4, 4);
      length = (long) extract_signed_integer (buf4, 4);
      fprintf_filtered (stream, "{length: %ld", length);
      fprintf_filtered (stream, "{length: %ld", length);
 
 
      if (el_type == NULL)
      if (el_type == NULL)
        {
        {
          CORE_ADDR element, next_element;
          CORE_ADDR element, next_element;
 
 
          address += JAVA_OBJECT_SIZE + 4;      /* Skip object header and length. */
          address += JAVA_OBJECT_SIZE + 4;      /* Skip object header and length. */
 
 
          while (i < length && things_printed < print_max)
          while (i < length && things_printed < print_max)
            {
            {
              char buf[TARGET_PTR_BIT / HOST_CHAR_BIT];
              char buf[TARGET_PTR_BIT / HOST_CHAR_BIT];
 
 
              fputs_filtered (", ", stream);
              fputs_filtered (", ", stream);
              wrap_here (n_spaces (2));
              wrap_here (n_spaces (2));
 
 
              if (i > 0)
              if (i > 0)
                element = next_element;
                element = next_element;
              else
              else
                {
                {
                  read_memory (address, buf, sizeof (buf));
                  read_memory (address, buf, sizeof (buf));
                  address += TARGET_PTR_BIT / HOST_CHAR_BIT;
                  address += TARGET_PTR_BIT / HOST_CHAR_BIT;
                  element = extract_address (buf, sizeof (buf));
                  element = extract_address (buf, sizeof (buf));
                }
                }
 
 
              for (reps = 1; i + reps < length; reps++)
              for (reps = 1; i + reps < length; reps++)
                {
                {
                  read_memory (address, buf, sizeof (buf));
                  read_memory (address, buf, sizeof (buf));
                  address += TARGET_PTR_BIT / HOST_CHAR_BIT;
                  address += TARGET_PTR_BIT / HOST_CHAR_BIT;
                  next_element = extract_address (buf, sizeof (buf));
                  next_element = extract_address (buf, sizeof (buf));
                  if (next_element != element)
                  if (next_element != element)
                    break;
                    break;
                }
                }
 
 
              if (reps == 1)
              if (reps == 1)
                fprintf_filtered (stream, "%d: ", i);
                fprintf_filtered (stream, "%d: ", i);
              else
              else
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
 
 
              if (element == 0)
              if (element == 0)
                fprintf_filtered (stream, "null");
                fprintf_filtered (stream, "null");
              else
              else
                fprintf_filtered (stream, "@%s", paddr_nz (element));
                fprintf_filtered (stream, "@%s", paddr_nz (element));
 
 
              things_printed++;
              things_printed++;
              i += reps;
              i += reps;
            }
            }
        }
        }
      else
      else
        {
        {
          value_ptr v = allocate_value (el_type);
          value_ptr v = allocate_value (el_type);
          value_ptr next_v = allocate_value (el_type);
          value_ptr next_v = allocate_value (el_type);
 
 
          VALUE_ADDRESS (v) = address + JAVA_OBJECT_SIZE + 4;
          VALUE_ADDRESS (v) = address + JAVA_OBJECT_SIZE + 4;
          VALUE_ADDRESS (next_v) = VALUE_ADDRESS (v);
          VALUE_ADDRESS (next_v) = VALUE_ADDRESS (v);
 
 
          while (i < length && things_printed < print_max)
          while (i < length && things_printed < print_max)
            {
            {
              fputs_filtered (", ", stream);
              fputs_filtered (", ", stream);
              wrap_here (n_spaces (2));
              wrap_here (n_spaces (2));
 
 
              if (i > 0)
              if (i > 0)
                {
                {
                  value_ptr tmp;
                  value_ptr tmp;
 
 
                  tmp = next_v;
                  tmp = next_v;
                  next_v = v;
                  next_v = v;
                  v = tmp;
                  v = tmp;
                }
                }
              else
              else
                {
                {
                  VALUE_LAZY (v) = 1;
                  VALUE_LAZY (v) = 1;
                  VALUE_OFFSET (v) = 0;
                  VALUE_OFFSET (v) = 0;
                }
                }
 
 
              VALUE_OFFSET (next_v) = VALUE_OFFSET (v);
              VALUE_OFFSET (next_v) = VALUE_OFFSET (v);
 
 
              for (reps = 1; i + reps < length; reps++)
              for (reps = 1; i + reps < length; reps++)
                {
                {
                  VALUE_LAZY (next_v) = 1;
                  VALUE_LAZY (next_v) = 1;
                  VALUE_OFFSET (next_v) += TYPE_LENGTH (el_type);
                  VALUE_OFFSET (next_v) += TYPE_LENGTH (el_type);
                  if (memcmp (VALUE_CONTENTS (v), VALUE_CONTENTS (next_v),
                  if (memcmp (VALUE_CONTENTS (v), VALUE_CONTENTS (next_v),
                              TYPE_LENGTH (el_type)) != 0)
                              TYPE_LENGTH (el_type)) != 0)
                    break;
                    break;
                }
                }
 
 
              if (reps == 1)
              if (reps == 1)
                fprintf_filtered (stream, "%d: ", i);
                fprintf_filtered (stream, "%d: ", i);
              else
              else
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
 
 
              val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
              val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
                         stream, format, 2, 1, pretty);
                         stream, format, 2, 1, pretty);
 
 
              things_printed++;
              things_printed++;
              i += reps;
              i += reps;
            }
            }
        }
        }
 
 
      if (i < length)
      if (i < length)
        fprintf_filtered (stream, "...");
        fprintf_filtered (stream, "...");
 
 
      fprintf_filtered (stream, "}");
      fprintf_filtered (stream, "}");
 
 
      return 0;
      return 0;
    }
    }
 
 
  /* If it's type String, print it */
  /* If it's type String, print it */
 
 
  if (TYPE_CODE (type) == TYPE_CODE_PTR
  if (TYPE_CODE (type) == TYPE_CODE_PTR
      && TYPE_TARGET_TYPE (type)
      && TYPE_TARGET_TYPE (type)
      && TYPE_NAME (TYPE_TARGET_TYPE (type))
      && TYPE_NAME (TYPE_TARGET_TYPE (type))
    && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "java.lang.String") == 0
    && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "java.lang.String") == 0
      && (format == 0 || format == 's')
      && (format == 0 || format == 's')
      && address != 0)
      && address != 0)
    {
    {
      value_ptr data_val;
      value_ptr data_val;
      CORE_ADDR data;
      CORE_ADDR data;
      value_ptr boffset_val;
      value_ptr boffset_val;
      unsigned long boffset;
      unsigned long boffset;
      value_ptr count_val;
      value_ptr count_val;
      unsigned long count;
      unsigned long count;
      value_ptr mark;
      value_ptr mark;
 
 
      mark = value_mark ();     /* Remember start of new values */
      mark = value_mark ();     /* Remember start of new values */
 
 
      data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
      data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
      data = value_as_pointer (data_val);
      data = value_as_pointer (data_val);
 
 
      boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
      boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
      boffset = value_as_pointer (boffset_val);
      boffset = value_as_pointer (boffset_val);
 
 
      count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
      count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
      count = value_as_pointer (count_val);
      count = value_as_pointer (count_val);
 
 
      value_free_to_mark (mark);        /* Release unnecessary values */
      value_free_to_mark (mark);        /* Release unnecessary values */
 
 
      val_print_string (data + boffset, count, 2, stream);
      val_print_string (data + boffset, count, 2, stream);
 
 
      return 0;
      return 0;
    }
    }
 
 
  return (val_print (type, VALUE_CONTENTS (val), 0, address,
  return (val_print (type, VALUE_CONTENTS (val), 0, address,
                     stream, format, 1, 0, pretty));
                     stream, format, 1, 0, pretty));
}
}
 
 
/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
   same meanings as in cp_print_value and c_val_print.
   same meanings as in cp_print_value and c_val_print.
 
 
   DONT_PRINT is an array of baseclass types that we
   DONT_PRINT is an array of baseclass types that we
   should not print, or zero if called from top level.  */
   should not print, or zero if called from top level.  */
 
 
static void
static void
java_print_value_fields (type, valaddr, address, stream,
java_print_value_fields (type, valaddr, address, stream,
                         format, recurse, pretty)
                         format, recurse, pretty)
     struct type *type;
     struct type *type;
     char *valaddr;
     char *valaddr;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  int i, len, n_baseclasses;
  int i, len, n_baseclasses;
 
 
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
 
 
  fprintf_filtered (stream, "{");
  fprintf_filtered (stream, "{");
  len = TYPE_NFIELDS (type);
  len = TYPE_NFIELDS (type);
  n_baseclasses = TYPE_N_BASECLASSES (type);
  n_baseclasses = TYPE_N_BASECLASSES (type);
 
 
  if (n_baseclasses > 0)
  if (n_baseclasses > 0)
    {
    {
      int i, n_baseclasses = TYPE_N_BASECLASSES (type);
      int i, n_baseclasses = TYPE_N_BASECLASSES (type);
 
 
      for (i = 0; i < n_baseclasses; i++)
      for (i = 0; i < n_baseclasses; i++)
        {
        {
          int boffset;
          int boffset;
          struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
          struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
          char *basename = TYPE_NAME (baseclass);
          char *basename = TYPE_NAME (baseclass);
          char *base_valaddr;
          char *base_valaddr;
 
 
          if (BASETYPE_VIA_VIRTUAL (type, i))
          if (BASETYPE_VIA_VIRTUAL (type, i))
            continue;
            continue;
 
 
          if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
          if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
            continue;
            continue;
 
 
          boffset = 0;
          boffset = 0;
 
 
          if (pretty)
          if (pretty)
            {
            {
              fprintf_filtered (stream, "\n");
              fprintf_filtered (stream, "\n");
              print_spaces_filtered (2 * (recurse + 1), stream);
              print_spaces_filtered (2 * (recurse + 1), stream);
            }
            }
          fputs_filtered ("<", stream);
          fputs_filtered ("<", stream);
          /* Not sure what the best notation is in the case where there is no
          /* Not sure what the best notation is in the case where there is no
             baseclass name.  */
             baseclass name.  */
          fputs_filtered (basename ? basename : "", stream);
          fputs_filtered (basename ? basename : "", stream);
          fputs_filtered ("> = ", stream);
          fputs_filtered ("> = ", stream);
 
 
          base_valaddr = valaddr;
          base_valaddr = valaddr;
 
 
          java_print_value_fields (baseclass, base_valaddr, address + boffset,
          java_print_value_fields (baseclass, base_valaddr, address + boffset,
                                   stream, format, recurse + 1, pretty);
                                   stream, format, recurse + 1, pretty);
          fputs_filtered (", ", stream);
          fputs_filtered (", ", stream);
 
 
        flush_it:
        flush_it:
          ;
          ;
        }
        }
 
 
    }
    }
 
 
  if (!len && n_baseclasses == 1)
  if (!len && n_baseclasses == 1)
    fprintf_filtered (stream, "<No data fields>");
    fprintf_filtered (stream, "<No data fields>");
  else
  else
    {
    {
      extern int inspect_it;
      extern int inspect_it;
      int fields_seen = 0;
      int fields_seen = 0;
 
 
      for (i = n_baseclasses; i < len; i++)
      for (i = n_baseclasses; i < len; i++)
        {
        {
          /* If requested, skip printing of static fields.  */
          /* If requested, skip printing of static fields.  */
          if (TYPE_FIELD_STATIC (type, i))
          if (TYPE_FIELD_STATIC (type, i))
            {
            {
              char *name = TYPE_FIELD_NAME (type, i);
              char *name = TYPE_FIELD_NAME (type, i);
              if (!static_field_print)
              if (!static_field_print)
                continue;
                continue;
              if (name != NULL && strcmp (name, "class") == 0)
              if (name != NULL && strcmp (name, "class") == 0)
                continue;
                continue;
            }
            }
          if (fields_seen)
          if (fields_seen)
            fprintf_filtered (stream, ", ");
            fprintf_filtered (stream, ", ");
          else if (n_baseclasses > 0)
          else if (n_baseclasses > 0)
            {
            {
              if (pretty)
              if (pretty)
                {
                {
                  fprintf_filtered (stream, "\n");
                  fprintf_filtered (stream, "\n");
                  print_spaces_filtered (2 + 2 * recurse, stream);
                  print_spaces_filtered (2 + 2 * recurse, stream);
                  fputs_filtered ("members of ", stream);
                  fputs_filtered ("members of ", stream);
                  fputs_filtered (type_name_no_tag (type), stream);
                  fputs_filtered (type_name_no_tag (type), stream);
                  fputs_filtered (": ", stream);
                  fputs_filtered (": ", stream);
                }
                }
            }
            }
          fields_seen = 1;
          fields_seen = 1;
 
 
          if (pretty)
          if (pretty)
            {
            {
              fprintf_filtered (stream, "\n");
              fprintf_filtered (stream, "\n");
              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 (inspect_it)
          if (inspect_it)
            {
            {
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
                fputs_filtered ("\"( ptr \"", stream);
                fputs_filtered ("\"( ptr \"", stream);
              else
              else
                fputs_filtered ("\"( nodef \"", stream);
                fputs_filtered ("\"( nodef \"", stream);
              if (TYPE_FIELD_STATIC (type, i))
              if (TYPE_FIELD_STATIC (type, i))
                fputs_filtered ("static ", stream);
                fputs_filtered ("static ", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              fputs_filtered ("\" \"", stream);
              fputs_filtered ("\" \"", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              fputs_filtered ("\") \"", stream);
              fputs_filtered ("\") \"", stream);
            }
            }
          else
          else
            {
            {
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
 
 
              if (TYPE_FIELD_STATIC (type, i))
              if (TYPE_FIELD_STATIC (type, i))
                fputs_filtered ("static ", stream);
                fputs_filtered ("static ", stream);
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
                                       language_cplus,
                                       language_cplus,
                                       DMGL_PARAMS | DMGL_ANSI);
                                       DMGL_PARAMS | DMGL_ANSI);
              annotate_field_name_end ();
              annotate_field_name_end ();
              fputs_filtered (": ", stream);
              fputs_filtered (": ", stream);
              annotate_field_value ();
              annotate_field_value ();
            }
            }
 
 
          if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
          if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
            {
            {
              value_ptr v;
              value_ptr v;
 
 
              /* Bitfields require special handling, especially due to byte
              /* Bitfields require special handling, especially due to byte
                 order problems.  */
                 order problems.  */
              if (TYPE_FIELD_IGNORE (type, i))
              if (TYPE_FIELD_IGNORE (type, i))
                {
                {
                  fputs_filtered ("<optimized out or zero length>", stream);
                  fputs_filtered ("<optimized out or zero length>", stream);
                }
                }
              else
              else
                {
                {
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
                                   unpack_field_as_long (type, valaddr, i));
                                   unpack_field_as_long (type, valaddr, i));
 
 
                  val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
                  val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
                             0, stream, format, 0, recurse + 1, pretty);
                             0, stream, format, 0, recurse + 1, pretty);
                }
                }
            }
            }
          else
          else
            {
            {
              if (TYPE_FIELD_IGNORE (type, i))
              if (TYPE_FIELD_IGNORE (type, i))
                {
                {
                  fputs_filtered ("<optimized out or zero length>", stream);
                  fputs_filtered ("<optimized out or zero length>", stream);
                }
                }
              else if (TYPE_FIELD_STATIC (type, i))
              else if (TYPE_FIELD_STATIC (type, i))
                {
                {
                  value_ptr v = value_static_field (type, i);
                  value_ptr v = value_static_field (type, i);
                  if (v == NULL)
                  if (v == NULL)
                    fputs_filtered ("<optimized out>", stream);
                    fputs_filtered ("<optimized out>", stream);
                  else
                  else
                    {
                    {
                      struct type *t = check_typedef (VALUE_TYPE (v));
                      struct type *t = check_typedef (VALUE_TYPE (v));
                      if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
                      if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
                        v = value_addr (v);
                        v = value_addr (v);
                      val_print (VALUE_TYPE (v),
                      val_print (VALUE_TYPE (v),
                                 VALUE_CONTENTS (v), 0, VALUE_ADDRESS (v),
                                 VALUE_CONTENTS (v), 0, VALUE_ADDRESS (v),
                                 stream, format, 0, recurse + 1, pretty);
                                 stream, format, 0, recurse + 1, pretty);
                    }
                    }
                }
                }
              else if (TYPE_FIELD_TYPE (type, i) == NULL)
              else if (TYPE_FIELD_TYPE (type, i) == NULL)
                fputs_filtered ("<unknown type>", stream);
                fputs_filtered ("<unknown type>", stream);
              else
              else
                {
                {
                  val_print (TYPE_FIELD_TYPE (type, i),
                  val_print (TYPE_FIELD_TYPE (type, i),
                             valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
                             valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
                             stream, format, 0, recurse + 1, pretty);
                             stream, format, 0, recurse + 1, pretty);
                }
                }
            }
            }
          annotate_field_end ();
          annotate_field_end ();
        }
        }
 
 
      if (pretty)
      if (pretty)
        {
        {
          fprintf_filtered (stream, "\n");
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
          print_spaces_filtered (2 * recurse, stream);
        }
        }
    }
    }
  fprintf_filtered (stream, "}");
  fprintf_filtered (stream, "}");
}
}
 
 
/* Print data of type TYPE located at VALADDR (within GDB), which came from
/* Print data of type TYPE located at VALADDR (within GDB), which came from
   the inferior at address ADDRESS, onto stdio stream STREAM according to
   the inferior at address ADDRESS, onto stdio stream STREAM according to
   FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
   FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
   target byte order.
   target byte order.
 
 
   If the data are a string pointer, returns the number of string characters
   If the data are a string pointer, returns the number of string characters
   printed.
   printed.
 
 
   If DEREF_REF is nonzero, then dereference references, otherwise just print
   If DEREF_REF is nonzero, then dereference references, otherwise just print
   them like pointers.
   them like pointers.
 
 
   The PRETTY parameter controls prettyprinting.  */
   The PRETTY parameter controls prettyprinting.  */
 
 
int
int
java_val_print (type, valaddr, embedded_offset, address, stream, format,
java_val_print (type, valaddr, embedded_offset, address, stream, format,
                deref_ref, recurse, pretty)
                deref_ref, recurse, pretty)
     struct type *type;
     struct type *type;
     char *valaddr;
     char *valaddr;
     CORE_ADDR address;
     CORE_ADDR address;
     struct ui_file *stream;
     struct ui_file *stream;
     int format;
     int format;
     int deref_ref;
     int deref_ref;
     int recurse;
     int recurse;
     enum val_prettyprint pretty;
     enum val_prettyprint pretty;
{
{
  register unsigned int i = 0;   /* Number of characters printed */
  register unsigned int i = 0;   /* Number of characters printed */
  struct type *target_type;
  struct type *target_type;
  CORE_ADDR addr;
  CORE_ADDR addr;
 
 
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_PTR:
    case TYPE_CODE_PTR:
      if (format && format != 's')
      if (format && format != 's')
        {
        {
          print_scalar_formatted (valaddr, type, format, 0, stream);
          print_scalar_formatted (valaddr, type, format, 0, stream);
          break;
          break;
        }
        }
#if 0
#if 0
      if (vtblprint && cp_is_vtbl_ptr_type (type))
      if (vtblprint && cp_is_vtbl_ptr_type (type))
        {
        {
          /* Print the unmangled name if desired.  */
          /* Print the unmangled name if desired.  */
          /* Print vtable entry - we only get here if we ARE using
          /* Print vtable entry - we only get here if we ARE using
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
          print_address_demangle (extract_address (valaddr, TYPE_LENGTH (type)),
          print_address_demangle (extract_address (valaddr, TYPE_LENGTH (type)),
                                  stream, demangle);
                                  stream, demangle);
          break;
          break;
        }
        }
#endif
#endif
      addr = unpack_pointer (type, valaddr);
      addr = unpack_pointer (type, valaddr);
      if (addr == 0)
      if (addr == 0)
        {
        {
          fputs_filtered ("null", stream);
          fputs_filtered ("null", stream);
          return i;
          return i;
        }
        }
      target_type = check_typedef (TYPE_TARGET_TYPE (type));
      target_type = check_typedef (TYPE_TARGET_TYPE (type));
 
 
      if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
      if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
        {
        {
          /* Try to print what function it points to.  */
          /* Try to print what function it points to.  */
          print_address_demangle (addr, stream, demangle);
          print_address_demangle (addr, stream, demangle);
          /* Return value is irrelevant except for string pointers.  */
          /* Return value is irrelevant except for string pointers.  */
          return (0);
          return (0);
        }
        }
 
 
      if (addressprint && format != 's')
      if (addressprint && format != 's')
        {
        {
          fputs_filtered ("@", stream);
          fputs_filtered ("@", stream);
          print_longest (stream, 'x', 0, (ULONGEST) addr);
          print_longest (stream, 'x', 0, (ULONGEST) addr);
        }
        }
 
 
      return i;
      return i;
 
 
    case TYPE_CODE_CHAR:
    case TYPE_CODE_CHAR:
      format = format ? format : output_format;
      format = format ? format : output_format;
      if (format)
      if (format)
        print_scalar_formatted (valaddr, type, format, 0, stream);
        print_scalar_formatted (valaddr, type, format, 0, stream);
      else
      else
        LA_PRINT_CHAR ((int) unpack_long (type, valaddr), stream);
        LA_PRINT_CHAR ((int) unpack_long (type, valaddr), stream);
      break;
      break;
 
 
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
      /* Can't just call c_val_print because that print bytes as C chars. */
      /* Can't just call c_val_print because that print bytes as C chars. */
      format = format ? format : output_format;
      format = format ? format : output_format;
      if (format)
      if (format)
        print_scalar_formatted (valaddr, type, format, 0, stream);
        print_scalar_formatted (valaddr, type, format, 0, stream);
      else
      else
        val_print_type_code_int (type, valaddr, stream);
        val_print_type_code_int (type, valaddr, stream);
      break;
      break;
 
 
    case TYPE_CODE_STRUCT:
    case TYPE_CODE_STRUCT:
      java_print_value_fields (type, valaddr, address, stream, format,
      java_print_value_fields (type, valaddr, address, stream, format,
                               recurse, pretty);
                               recurse, pretty);
      break;
      break;
 
 
    default:
    default:
      return c_val_print (type, valaddr, embedded_offset, address, stream,
      return c_val_print (type, valaddr, embedded_offset, address, stream,
                          format, deref_ref, recurse, pretty);
                          format, deref_ref, recurse, pretty);
    }
    }
 
 
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

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