On 14/07/14 15:21 +0100, Jonathan Wakely wrote:
This defines a new style of Python type printer that recognizes
templates and can be used to omit default template arguments from the
typename GDB prints, e.g. showing std::vector<T, std::allocator<T>> as
simply std::vector<T>. Additionally, T will get processed by the type
recognizers so if it's a standard typedef or template it will also get
displayed in its abbreviated form.
e.g. with current trunk:
Breakpoint 1, main () at p.cc:45
45 std::vector<std::deque<std::list<int>>> nested;
(gdb) whatis nested
type = std::vector<std::deque<std::list<int, std::allocator<int> >, std::allocator<std::list<int, std::allocator<int> > > >,
std::allocator<std::deque<std::list<int, std::allocator<int> >, std::allocator<std::list<int, std::allocator<int> > > > >
>
and with this patch:
(gdb) whatis nested
type = std::vector<std::deque<std::list<int>>>
N.B. I am not printing spaces between the closing angle brackets. If
people prefer I can put them in, or only do it for C++11 types, so
that copying and pasting types from GDB will always work (if you're
copying a C++11 type then you must be planning to use it with a C++11
compiler, which will handle >> without spaces).
This passes the python testsuite but I'll wait for comments before
committing, in case my use of the GDB API or Python can be improved by
anyone.
I forgot to say that with these type recognizers we might want to
revisit the output of the existing printers for the containers, so
that instead of:
std::map with 3 elements = { ... }
GDB could print the map type:
std::map<int, int> with 3 elements = { ... }