diff options
author | Pedro Alves <palves@redhat.com> | 2011-01-25 15:18:36 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-01-25 15:18:36 +0000 |
commit | de4127a3b22abd0e9e69f61f6e52b5f891050ffd (patch) | |
tree | e9c7badb2302c3e663e392770e7f01d355cb5d03 /gdb/cp-valprint.c | |
parent | ee99023e123b99f55fdf9a99e54e03fea21d3882 (diff) | |
download | gdb-de4127a3b22abd0e9e69f61f6e52b5f891050ffd.zip gdb-de4127a3b22abd0e9e69f61f6e52b5f891050ffd.tar.gz gdb-de4127a3b22abd0e9e69f61f6e52b5f891050ffd.tar.bz2 |
* cp-valprint.c (cp_print_value): Treat the 'skip' local as
boolean. Make sure to always pass a value that matches the
contents buffer to callees. Preserve `address' for following
iterations.
* value.c (value_contents_for_printing_const): New.
(value_address): Constify value argument.
* value.h (value_contents_for_printing_const): Declare.
(value_address): Constify value argument.
Diffstat (limited to 'gdb/cp-valprint.c')
-rw-r--r-- | gdb/cp-valprint.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 23e42c1..ff3908d 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -488,6 +488,7 @@ cp_print_value (struct type *type, struct type *real_type, struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); char *basename = TYPE_NAME (baseclass); const gdb_byte *base_valaddr; + const struct value *base_val; if (BASETYPE_VIA_VIRTUAL (type, i)) { @@ -509,7 +510,7 @@ cp_print_value (struct type *type, struct type *real_type, boffset = baseclass_offset (type, i, valaddr + offset, address + offset); - skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1; + skip = ((boffset == -1) || (boffset + offset) < 0); if (BASETYPE_VIA_VIRTUAL (type, i)) { @@ -525,20 +526,28 @@ cp_print_value (struct type *type, struct type *real_type, large. */ gdb_byte *buf = alloca (TYPE_LENGTH (baseclass)); - base_valaddr = buf; if (target_read_memory (address + boffset, buf, TYPE_LENGTH (baseclass)) != 0) skip = 1; - address = address + boffset; + base_val = value_from_contents_and_address (baseclass, + buf, + address + boffset); thisoffset = 0; boffset = 0; thistype = baseclass; + base_valaddr = value_contents_for_printing_const (base_val); } else - base_valaddr = valaddr; + { + base_valaddr = valaddr; + base_val = val; + } } else - base_valaddr = valaddr; + { + base_valaddr = valaddr; + base_val = val; + } /* Now do the printing. */ if (options->pretty) @@ -553,7 +562,7 @@ cp_print_value (struct type *type, struct type *real_type, fputs_filtered ("> = ", stream); - if (skip >= 1) + if (skip) fprintf_filtered (stream, "<invalid address>"); else { @@ -564,15 +573,17 @@ cp_print_value (struct type *type, struct type *real_type, if (!options->raw) result = apply_val_pretty_printer (baseclass, base_valaddr, thisoffset + boffset, - address, - stream, recurse, - val, options, - current_language); + value_address (base_val), + stream, recurse, base_val, + options, current_language); + + if (!result) cp_print_value_fields (baseclass, thistype, base_valaddr, - thisoffset + boffset, address, - stream, recurse, val, options, + thisoffset + boffset, + value_address (base_val), + stream, recurse, base_val, options, ((struct type **) obstack_base (&dont_print_vb_obstack)), 0); |