diff options
author | Richard Henderson <rth@redhat.com> | 2003-10-14 06:51:14 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2003-10-14 06:51:14 +0000 |
commit | 0501c382d2d81738a91ca53dcfc7621bfdc2dc44 (patch) | |
tree | c8f81b638330df0fcf86a459947464d29c964a54 /gdb/f-valprint.c | |
parent | c9239e59a1a40c0467a654651f91bd2bce0dc9e1 (diff) | |
download | gdb-0501c382d2d81738a91ca53dcfc7621bfdc2dc44.tar.gz |
* f-typeprint.c (f_type_print_base): Handle TYPE_CODE_REF.
* f-valprint.c (f_val_print): Likewise. Tweak TYPE_CODE_PTR to
match c_val_print a bit closer.
Diffstat (limited to 'gdb/f-valprint.c')
-rw-r--r-- | gdb/f-valprint.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 7fdcabd7173..805590f0a91 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -384,11 +384,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, deref_ref, recurse, pretty); fprintf_filtered (stream, ")"); break; -#if 0 - /* Array of unspecified length: treat like pointer to first elt. */ - valaddr = (char *) &address; - /* FALL THROUGH */ -#endif + case TYPE_CODE_PTR: if (format && format != 's') { @@ -409,7 +405,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, } if (addressprint && format != 's') - fprintf_filtered (stream, "0x%s", paddr_nz (addr)); + print_address_numeric (addr, 1, stream); /* For a pointer to char or unsigned char, also print the string pointed to, unless pointer is null. */ @@ -419,9 +415,47 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset, && addr != 0) i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream); - /* Return number of characters printed, plus one for the - terminating null if we have "reached the end". */ - return (i + (print_max && i != print_max)); + /* Return number of characters printed, including the terminating + '\0' if we reached the end. val_print_string takes care including + the terminating '\0' if necessary. */ + return i; + } + break; + + case TYPE_CODE_REF: + elttype = check_typedef (TYPE_TARGET_TYPE (type)); + if (addressprint) + { + CORE_ADDR addr + = extract_typed_address (valaddr + embedded_offset, type); + fprintf_filtered (stream, "@"); + print_address_numeric (addr, 1, stream); + if (deref_ref) + fputs_filtered (": ", stream); + } + /* De-reference the reference. */ + if (deref_ref) + { + if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF) + { + struct value *deref_val = + value_at + (TYPE_TARGET_TYPE (type), + unpack_pointer (lookup_pointer_type (builtin_type_void), + valaddr + embedded_offset), + NULL); + val_print (VALUE_TYPE (deref_val), + VALUE_CONTENTS (deref_val), + 0, + VALUE_ADDRESS (deref_val), + stream, + format, + deref_ref, + recurse, + pretty); + } + else + fputs_filtered ("???", stream); } break; |