mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-11 20:41:01 +08:00
printers.py (NodeIteratorPrinter): New.
2018-03-08 François Dumont <fdumont@gcc.gnu.org> * python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New. (StdListIteratorPrinter): Inherit from latter. (StdFwdListIteratorPrinter): New, inherit from latter. (StdDebugIteratorPrinter.to_string): Use non-debug iterator printer when iterator has no associated container. (build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and __gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace registrations. * testsuite/libstdc++-prettyprinters/debug.cc: Adapt. * testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt. From-SVN: r258350
This commit is contained in:
parent
1b1a188198
commit
fe6bd21a0b
@ -1,3 +1,16 @@
|
||||
2018-03-08 François Dumont <fdumont@gcc.gnu.org>
|
||||
|
||||
* python/libstdcxx/v6/printers.py (NodeIteratorPrinter): New.
|
||||
(StdListIteratorPrinter): Inherit from latter.
|
||||
(StdFwdListIteratorPrinter): New, inherit from latter.
|
||||
(StdDebugIteratorPrinter.to_string): Use non-debug iterator printer
|
||||
when iterator has no associated container.
|
||||
(build_libstdcxx_dictionary): Add __gnu_cxx::_Fwd_list_iterator and
|
||||
__gnu_cxx::_Fwd_list_const_iterator printers. Remove __norm namespace
|
||||
registrations.
|
||||
* testsuite/libstdc++-prettyprinters/debug.cc: Adapt.
|
||||
* testsuite/libstdc++-prettyprinters/debug_cxx11.cc: Adapt.
|
||||
|
||||
2018-03-06 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||
|
||||
PR libstdc++/84601
|
||||
|
@ -249,21 +249,32 @@ class StdListPrinter:
|
||||
return 'empty %s' % (self.typename)
|
||||
return '%s' % (self.typename)
|
||||
|
||||
class StdListIteratorPrinter:
|
||||
"Print std::list::iterator"
|
||||
|
||||
def __init__(self, typename, val):
|
||||
class NodeIteratorPrinter:
|
||||
def __init__(self, typename, val, contname):
|
||||
self.val = val
|
||||
self.typename = typename
|
||||
self.contname = contname
|
||||
|
||||
def to_string(self):
|
||||
if not self.val['_M_node']:
|
||||
return 'non-dereferenceable iterator for std::list'
|
||||
return 'non-dereferenceable iterator for std::%s' % (self.contname)
|
||||
nodetype = find_type(self.val.type, '_Node')
|
||||
nodetype = nodetype.strip_typedefs().pointer()
|
||||
node = self.val['_M_node'].cast(nodetype).dereference()
|
||||
return str(get_value_from_list_node(node))
|
||||
|
||||
class StdListIteratorPrinter(NodeIteratorPrinter):
|
||||
"Print std::list::iterator"
|
||||
|
||||
def __init__(self, typename, val):
|
||||
NodeIteratorPrinter.__init__(self, typename, val, 'list')
|
||||
|
||||
class StdFwdListIteratorPrinter(NodeIteratorPrinter):
|
||||
"Print std::forward_list::iterator"
|
||||
|
||||
def __init__(self, typename, val):
|
||||
NodeIteratorPrinter.__init__(self, typename, val, 'forward_list')
|
||||
|
||||
class StdSlistPrinter:
|
||||
"Print a __gnu_cxx::slist"
|
||||
|
||||
@ -575,10 +586,12 @@ class StdDebugIteratorPrinter:
|
||||
# and return the wrapped iterator value.
|
||||
def to_string (self):
|
||||
base_type = gdb.lookup_type('__gnu_debug::_Safe_iterator_base')
|
||||
safe_seq = self.val.cast(base_type)['_M_sequence']
|
||||
if not safe_seq or self.val['_M_version'] != safe_seq['_M_version']:
|
||||
return "invalid iterator"
|
||||
itype = self.val.type.template_argument(0)
|
||||
safe_seq = self.val.cast(base_type)['_M_sequence']
|
||||
if not safe_seq:
|
||||
return str(self.val.cast(itype))
|
||||
if self.val['_M_version'] != safe_seq['_M_version']:
|
||||
return "invalid iterator"
|
||||
return str(self.val.cast(itype))
|
||||
|
||||
def num_elements(num):
|
||||
@ -1731,21 +1744,14 @@ def build_libstdcxx_dictionary ():
|
||||
StdVectorIteratorPrinter)
|
||||
libstdcxx_printer.add_version('__gnu_cxx::', '_Slist_iterator',
|
||||
StdSlistIteratorPrinter)
|
||||
libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_iterator',
|
||||
StdFwdListIteratorPrinter)
|
||||
libstdcxx_printer.add_version('__gnu_cxx::', '_Fwd_list_const_iterator',
|
||||
StdFwdListIteratorPrinter)
|
||||
|
||||
# Debug (compiled with -D_GLIBCXX_DEBUG) printer
|
||||
# registrations. The Rb_tree debug iterator when unwrapped
|
||||
# from the encapsulating __gnu_debug::_Safe_iterator does not
|
||||
# have the __norm namespace. Just use the existing printer
|
||||
# registration for that.
|
||||
# registrations.
|
||||
libstdcxx_printer.add('__gnu_debug::_Safe_iterator',
|
||||
StdDebugIteratorPrinter)
|
||||
libstdcxx_printer.add('std::__norm::_List_iterator',
|
||||
StdListIteratorPrinter)
|
||||
libstdcxx_printer.add('std::__norm::_List_const_iterator',
|
||||
StdListIteratorPrinter)
|
||||
libstdcxx_printer.add('std::__norm::_Deque_const_iterator',
|
||||
StdDequeIteratorPrinter)
|
||||
libstdcxx_printer.add('std::__norm::_Deque_iterator',
|
||||
StdDequeIteratorPrinter)
|
||||
|
||||
build_libstdcxx_dictionary ()
|
||||
|
@ -19,7 +19,9 @@
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define _GLIBCXX_DEBUG
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
# define _GLIBCXX_DEBUG
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <deque>
|
||||
@ -96,7 +98,7 @@ main()
|
||||
v.push_back(1);
|
||||
v.push_back(2);
|
||||
std::vector<int>::iterator viter0;
|
||||
// { dg-final { note-test viter0 {invalid iterator} } }
|
||||
// { dg-final { note-test viter0 {non-dereferenceable iterator for std::vector} } }
|
||||
std::vector<int>::iterator viter1 = v.begin();
|
||||
std::vector<int>::iterator viter2 = viter1 + 1;
|
||||
v.erase(viter1);
|
||||
|
@ -19,7 +19,9 @@
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define _GLIBCXX_DEBUG
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
# define _GLIBCXX_DEBUG
|
||||
#endif
|
||||
|
||||
#include <forward_list>
|
||||
#include <unordered_map>
|
||||
@ -31,7 +33,7 @@ main()
|
||||
{
|
||||
std::forward_list<std::string> flst;
|
||||
std::forward_list<std::string>::iterator flstiter0;
|
||||
// { dg-final { note-test flstiter0 {invalid iterator}} }
|
||||
// { dg-final { note-test flstiter0 {non-dereferenceable iterator for std::forward_list}} }
|
||||
flst.push_front("dum");
|
||||
std::forward_list<std::string>::iterator flstiter1 = flst.begin();
|
||||
// { dg-final { note-test *flstiter1 {"dum"}} }
|
||||
|
Loading…
Reference in New Issue
Block a user