diff mbox

Pretty printers for versioned namespace

Message ID 20170104125240.GH895@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Jan. 4, 2017, 12:52 p.m. UTC
On 24/12/16 14:47 +0100, François Dumont wrote:
>On 15/12/2016 15:57, Jonathan Wakely wrote:

>>

>>And we could avoid three re.match expressions with complicated regular

>>expressions by creating a helper function to do the "startswith"

>>checks:

>>

>>def is_specialization_of(type, template_name):

>>   return re.match('^std::(%s)?%s<.*>$' % (vers_nsp, template_name), 

>>type) is not None

>>

>>Then replace impl_type.startswith('std::__uniq_ptr_impl<') with

>>is_specialization_of(impl_type, '__uniq_ptr_impl')

>>

>>And replace impl_type.startswith('std::tuple<') with

>>is_specialization_of(impl_type, 'tuple')

>>

>>And replace nodetype.name.startswith('std::_Rb_tree_node') with

>>is_specialization_of(nodetype.name, '_Rb_tree_node')

>>

>>That makes the code much easier to read.

>>

>>

>I agree that hiding the version namespace will be nicer. I just hope 

>it is possible. I don't think we can really dictate gdb to hide this 

>namespace during the rendering. In the attached path you will see what 

>I tried to do. Problem is that I am not sure that printers.py is 

>intercepting rendering of all types so version namespace will stay 

>visible in those cases.

>

>I think the 2 failures that I have with this patch are reflecting this 

>problem:

>

>type = holder<std::__7::basic_string<unsigned char, 

>std::__7::char_traits<unsigned char>, std::__7::allocator<unsigned 

>char> > >

>got: type = holder<std::__7::basic_string<unsigned char, 

>std::__7::char_traits<unsigned char>, std::__7::allocator<unsigned 

>char> > >

>FAIL: libstdc++-prettyprinters/whatis.cc whatis ustring_holder

>type = holder<std::__7::basic_string<signed char, 

>std::__7::char_traits<signed char>, std::__7::allocator<signed char> > 

>>

>got: type = holder<std::__7::basic_string<signed char, 

>std::__7::char_traits<signed char>, std::__7::allocator<signed char> > 

>>

>FAIL: libstdc++-prettyprinters/whatis.cc whatis sstring_holder

>

>Shall I simply use regex in those cases and adopt this approach ?


I'd prefer not to have to use the regex matches in libstdc++.exp as
they complicate things.

For the two examples above, the whatis results are bad even for the
non-versioned namespace. For specializations of basic_string we only
have type printers that recognize the standard typedefs like
std::u16string, but not other specializations. We really want it to
show std::basic_string<unsigned char> not the full name. That would
require a TemplateTypePrinter for basic_string. The attached patch
works, and should be easy to incorporate into your changes for the
versioned namespace.
diff mbox

Patch

diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 7690a6b..fd63a5c 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1372,6 +1372,7 @@  def register_type_printers(obj):
     # Note that we can't have a printer for std::wstreampos, because
     # it shares the same underlying type as std::streampos.
     add_one_type_printer(obj, 'fpos', 'streampos')
+
     add_one_type_printer(obj, 'basic_string', 'u16string')
     add_one_type_printer(obj, 'basic_string', 'u32string')
 
@@ -1397,6 +1398,10 @@  def register_type_printers(obj):
             'unique_ptr<(.*), std::default_delete<\\1 ?> >',
             'unique_ptr<{1}>')
 
+    add_one_template_type_printer(obj, 'basic_string<T>',
+            'basic_string<((un)?signed char), std::char_traits<\\1 ?>, std::allocator<\\1 ?> >',
+            'basic_string<{1}>')
+
     add_one_template_type_printer(obj, 'deque<T>',
             'deque<(.*), std::allocator<\\1 ?> >',
             'deque<{1}>')
diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc
index 31ded8b..7a55bb7 100644
--- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc
+++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc
@@ -166,11 +166,11 @@  holder<std::knuth_b> knuth_b_holder;
 
 ustring *ustring_ptr;
 holder<ustring> ustring_holder;
-// { dg-final { whatis-test ustring_holder "holder<std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> > >" } }
+// { dg-final { whatis-test ustring_holder "holder<std::basic_string<unsigned char> >" } }
 
 std::basic_string<signed char> *sstring_ptr;
 holder< std::basic_string<signed char> > sstring_holder;
-// { dg-final { whatis-test sstring_holder "holder<std::basic_string<signed char, std::char_traits<signed char>, std::allocator<signed char> > >" } }
+// { dg-final { whatis-test sstring_holder "holder<std::basic_string<signed char> >" } }
 
 std::vector<std::deque<std::unique_ptr<char>>> *seq1_ptr;
 holder< std::vector<std::deque<std::unique_ptr<char>>> > seq1_holder;