On 28/11/16 22:19 +0100, François Dumont wrote:
Hi

Here is a patch to fix pretty printers when versioned namespace is activated.

You will see that I have hesitated in making the fix independant of the version being used. In source files you will find (__7::)? patterns while in xmethods.py I chose (__\d+::)? making it ready for __8 and forward. Do you want to generalize one option ? If so which one ?

I don't really mind, but I note that the point of the path
libstdcxx/v6/printers.py was that we'd have different printers for v7,
v8 etc. ... I think it's simpler to keep everything in one place
though.
At the moment version namespace is visible within gdb, it displays for instance 'std::__7::string'. I am pretty sure we could hide it, is it preferable ? I would need some time to do so as I am neither a python nor regex expert.

It's fine to display it.

I am not fully happy with the replication in printers.py of StdRbtreeIteratorPrinter and StdExpAnyPrinter(SingleObjContainerPrinter in respectively StdVersionedRbtreeIteratorPrinter and StdExpVerAnyPrinter(SingleObjContainerPrinter just to adapt 2 lines where regex is not an option. We could surely keep only one and pass it '' or '__7'. But as I said I am not a python expert so any help would be appreciated.

We definitely want to avoid that duplication. For
StdRbtreeIteratorPrinter you can just look at 'typename' and see
whether it starts with "std::__7" or not. If it does, you need to lookup
std::__7::_Rb_tree_node<...>, otherwise you need to lookup
std::_Rb_tree_node<...> instead.

For StdExpAnyPrinter just do two replacements: first replace
std::string with the result of gdb.lookup_type('std::string') and then
replace std::__7::string with the result of looking that up. Are you
sure that's even needed though? Does std::__7::string actually appear
in the manager function's name? I would expect it to appear as
std::__7::basic_string<char, std::__7::char_traits<char>, std::__7::allocator<char> 
> >
which doesn't need to be expanded anyway. So I think you can just
remove your StdExpVerAnyPrinter.


--- a/libstdc++-v3/testsuite/lib/gdb-test.exp
+++ b/libstdc++-v3/testsuite/lib/gdb-test.exp
@@ -74,6 +74,14 @@ proc whatis-test {var result} {
    lappend gdb_tests $var $result whatis
}

+# A test of 'whatis'.  This tests a type rather than a variable through a
+# regexp.

Please use "regular expression" here rather than "regexp".

+proc whatis-regexp-test {var result} {
+    global gdb_tests
+
+    lappend gdb_tests $var $result whatisrexp
+}
+

And something other than "whatisrexp" e.g. "whatis_regexp" would be
OK, but "rexp" is not a conventional abbreviation.

Reply via email to