* ada-lang.c (static_unwrap_type): Add forward declaration.
authorJoel Brobecker <brobecker@gnat.com>
Thu, 3 Jan 2008 13:11:51 +0000 (13:11 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Thu, 3 Jan 2008 13:11:51 +0000 (13:11 +0000)
        (template_to_static_fixed_type): Fields of dynamic types sometimes
        also need to be unwrapped. Take this into account.
        (ada_to_fixed_type_1): Renamed from ada_to_fixed_type.
        (ada_to_fixed_type): New wrapper around ada_to_fixed_type_1.
        * ada-typeprint.c (ada_print_type): Get the typename from
        the original type, not the base type.

gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-typeprint.c

index 2434672..67cfd7e 100644 (file)
@@ -1,3 +1,13 @@
+2008-01-03  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (static_unwrap_type): Add forward declaration.
+       (template_to_static_fixed_type): Fields of dynamic types sometimes
+       also need to be unwrapped. Take this into account.
+       (ada_to_fixed_type_1): Renamed from ada_to_fixed_type.
+       (ada_to_fixed_type): New wrapper around ada_to_fixed_type_1.
+       * ada-typeprint.c (ada_print_type): Get the typename from
+       the original type, not the base type. 
+
 2008-01-03  Jerome Guitton  <guitton@adacore.com>
 
        * ada-lang.c (ada_value_struct_elt, to_fixed_array_type)
index fcb3b05..76fe71a 100644 (file)
@@ -181,6 +181,7 @@ static struct type *to_fixed_range_type (char *, struct value *,
                                          struct objfile *);
 
 static struct type *to_static_fixed_type (struct type *);
+static struct type *static_unwrap_type (struct type *type);
 
 static struct value *unwrap_value (struct value *);
 
@@ -6854,7 +6855,7 @@ template_to_static_fixed_type (struct type *type0)
       if (is_dynamic_field (type0, f))
         new_type = to_static_fixed_type (TYPE_TARGET_TYPE (field_type));
       else
-        new_type = to_static_fixed_type (field_type);
+        new_type = static_unwrap_type (field_type);
       if (type == type0 && new_type != field_type)
         {
           TYPE_TARGET_TYPE (type0) = type = alloc_type (TYPE_OBJFILE (type0));
@@ -7125,8 +7126,8 @@ to_fixed_array_type (struct type *type0, struct value *dval,
    location of the tag, and therefore compute the tagged type's actual type.
    So we return the tagged type without consulting the tag.  */
    
-struct type *
-ada_to_fixed_type (struct type *type, const gdb_byte *valaddr,
+static struct type *
+ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr,
                    CORE_ADDR address, struct value *dval, int check_tag)
 {
   type = ada_check_typedef (type);
@@ -7168,6 +7169,25 @@ ada_to_fixed_type (struct type *type, const gdb_byte *valaddr,
     }
 }
 
+/* The same as ada_to_fixed_type_1, except that it preserves the type
+   if it is a TYPE_CODE_TYPEDEF of a type that is already fixed.
+   ada_to_fixed_type_1 would return the type referenced by TYPE.  */
+
+struct type *
+ada_to_fixed_type (struct type *type, const gdb_byte *valaddr,
+                   CORE_ADDR address, struct value *dval, int check_tag)
+
+{
+  struct type *fixed_type =
+    ada_to_fixed_type_1 (type, valaddr, address, dval, check_tag);
+
+  if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF
+      && TYPE_TARGET_TYPE (type) == fixed_type)
+    return type;
+
+  return fixed_type;
+}
+
 /* A standard (static-sized) type corresponding as well as possible to
    TYPE0, but based on no runtime data.  */
 
index 8532d6a..7bfb001 100644 (file)
@@ -753,7 +753,7 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
                int show, int level)
 {
   struct type *type = ada_check_typedef (ada_get_base_type (type0));
-  char *type_name = decoded_type_name (type);
+  char *type_name = decoded_type_name (type0);
   int is_var_decl = (varstring != NULL && varstring[0] != '\0');
 
   if (type == NULL)