*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / ada-valprint.c
index 0fbb9c9b862dd8b7e563fcd8b0e8c65c786daa04..429349a5146f9773a46838c32e050ae3df503ffe 100644 (file)
@@ -1,7 +1,7 @@
 /* Support for printing Ada values for GDB, the GNU debugger.
 
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001,
-   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001, 2002,
+   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -17,7 +17,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #include <ctype.h>
 #include "defs.h"
@@ -86,20 +87,23 @@ print_optional_low_bound (struct ui_file *stream, struct type *type)
   struct type *index_type;
   long low_bound;
 
-  index_type = TYPE_INDEX_TYPE (type);
-  low_bound = 0;
+  if (print_array_indexes_p ())
+    return 0;
 
-  if (index_type == NULL)
+  if (!get_array_low_bound (type, &low_bound))
     return 0;
+
+  index_type = TYPE_INDEX_TYPE (type);
+
   if (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
     {
-      low_bound = TYPE_LOW_BOUND (index_type);
-      if (low_bound > TYPE_HIGH_BOUND (index_type))
-       return 0;
+      /* We need to know what the base type is, in order to do the
+         appropriate check below.  Otherwise, if this is a subrange
+         of an enumerated type, where the underlying value of the
+         first element is typically 0, we might test the low bound
+         against the wrong value.  */
       index_type = TYPE_TARGET_TYPE (index_type);
     }
-  else
-    return 0;
 
   switch (TYPE_CODE (index_type))
     {
@@ -137,16 +141,18 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
   unsigned int i;
   unsigned int things_printed = 0;
   unsigned len;
-  struct type *elttype;
+  struct type *elttype, *index_type;
   unsigned eltlen;
   unsigned long bitsize = TYPE_FIELD_BITSIZE (type, 0);
   struct value *mark = value_mark ();
+  LONGEST low = 0;
 
   elttype = TYPE_TARGET_TYPE (type);
   eltlen = TYPE_LENGTH (check_typedef (elttype));
+  index_type = TYPE_INDEX_TYPE (type);
 
   {
-    LONGEST low, high;
+    LONGEST high;
     if (get_discrete_bounds (TYPE_FIELD_TYPE (type, 0), &low, &high) < 0)
       len = 1;
     else
@@ -174,6 +180,7 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
            }
        }
       wrap_here (n_spaces (2 + 2 * recurse));
+      maybe_print_array_index (index_type, i + low, stream, format, pretty);
 
       i0 = i;
       v0 = ada_value_primitive_packed_val (NULL, valaddr,
@@ -219,6 +226,8 @@ val_print_packed_array_elements (struct type *type, const gdb_byte *valaddr,
                      fprintf_filtered (stream, ", ");
                    }
                  wrap_here (n_spaces (2 + 2 * recurse));
+                 maybe_print_array_index (index_type, j + low,
+                                          stream, format, pretty);
                }
              val_print (elttype, value_contents (v0), 0, 0, stream, format,
                         0, recurse + 1, pretty);
@@ -257,7 +266,7 @@ ada_emit_char (int c, struct ui_file *stream, int quoter, int type_len)
   if (isascii (c) && isprint (c))
     {
       if (c == quoter && c == '"')
-       fprintf_filtered (stream, "[\"%c\"]", quoter);
+       fprintf_filtered (stream, "\"\"");
       else
        fprintf_filtered (stream, "%c", c);
     }
@@ -411,7 +420,8 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
     case TYPE_CODE_SET:
     case TYPE_CODE_STRING:
     case TYPE_CODE_ERROR:
-    case TYPE_CODE_MEMBER:
+    case TYPE_CODE_MEMBERPTR:
+    case TYPE_CODE_METHODPTR:
     case TYPE_CODE_METHOD:
     case TYPE_CODE_REF:
       warning (_("internal error: unhandled type in ada_print_scalar"));
@@ -765,6 +775,13 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
        }
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+         print_scalar_formatted (valaddr, type, format, 0, stream);
+      else
+       val_print_type_code_flags (type, valaddr, stream);
+      break;
+
     case TYPE_CODE_FLT:
       if (format)
        return c_val_print (type, valaddr0, embedded_offset, address, stream,
This page took 0.02545 seconds and 4 git commands to generate.