This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
[python][rfc] Attempt to print the base class if a there is no Pythonpretty-printer for a derived class.
- From: Phil Muldoon <pmuldoon at redhat dot com>
- To: Project Archer <archer at sourceware dot org>
- Date: Fri, 27 Mar 2009 17:04:48 +0000
- Subject: [python][rfc] Attempt to print the base class if a there is no Pythonpretty-printer for a derived class.
The bug is detailed here:
http://sourceware.org/bugzilla/show_bug.cgi?id=10008
In summary, given this class:
class Y : public std::tr1::unordered_map<int, char *>
{
public:
Y()
{
}
};
Any Python pretty-printers that have been written and registered to
print std::tr1::unordered_map will not work on Y. But there is no
reason, given the lack of a more specialized printer for Y, why the
printer for unordered_map should not print the parts of Y it can
accurately print. This patch attempts to find a base class printer if a
specialized printer does not exist for the class in question.
Built and tested on x8664, with no regressions.
Phil
2009-03-27 Phil Muldoon <pmuldoon@redhat.com>
* cp-valprint.c (cp_print_value_fields): Attempt to run
apply_val_pretty_print on the baseclass of a class.
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index a96a81a..efc13e5 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -36,6 +36,7 @@
#include "valprint.h"
#include "cp-support.h"
#include "language.h"
+#include "python/python.h"
/* Controls printing of vtbl's */
static void
@@ -155,16 +156,33 @@ cp_print_value_fields (struct type *type, struct type *real_type,
int i, len, n_baseclasses;
char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
int fields_seen = 0;
+ int result = 0;
+ struct type *baseclass;
CHECK_TYPEDEF (type);
- fprintf_filtered (stream, "{");
len = TYPE_NFIELDS (type);
n_baseclasses = TYPE_N_BASECLASSES (type);
+ /* Attempt to run the Python pretty-printers on the base class of
+ the derived class. */
+ if (!options->raw)
+ if (n_baseclasses > 0)
+ {
+
+ baseclass = check_typedef (TYPE_BASECLASS (type,0));
+ result = apply_val_pretty_printer (baseclass, valaddr, offset,
+ address, stream, recurse, options,
+ current_language);
+
+ if (result)
+ return;
+ }
+
/* First, print out baseclasses such that we don't print
duplicates of virtual baseclasses. */
+ fprintf_filtered (stream, "{");
if (n_baseclasses > 0)
cp_print_value (type, real_type, valaddr, offset, address, stream,
recurse + 1, options, dont_print_vb);