This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
[python] [patch] Pretty printers for std::*::{const_,}iterator
- From: ppluzhnikov at google dot com (Paul Pluzhnikov)
- To: archer at sourceware dot org
- Date: Tue, 16 Dec 2008 17:17:10 -0800 (PST)
- Subject: [python] [patch] Pretty printers for std::*::{const_,}iterator
- Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;t=1229476633; bh=7+EZoinThJiLSvH+6RIyHWSGvpw=;h=DomainKey-Signature:To:Subject:Message-Id:Date:From; b=M3ki7QgAy49nvxc1wIjMuloyKfwh+YWYJgvvPgGnwc6xDfwzLRHNON0zKrPpAGCEp8/0OyZwf95UXGTDuNFYWQ==
- Domainkey-signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;h=to:subject:message-id:date:from;b=Y0LnqA92GDoiUA3JoKecxRbYKcX0tOEA9HKrLORgwVFvH7JP7PIDBddAcyd+/T6xfxBkKAd65GkKuz5Wh0v3bA==
Greetings,
Attached patch allows one to print std::*::iterator as easily as
the containers themselves.
OK to commit?
--
Paul Pluzhnikov
2008-12-16 Paul Pluzhnikov <ppluzhnikov@google.com>
* python/lib/gdb/libstdcxx/v6/printers.py: Iterator pretty-printers.
diff --git a/gdb/python/lib/gdb/libstdcxx/v6/printers.py b/gdb/python/lib/gdb/libstdcxx/v6/printers.py
index c03c682..ea48778 100644
--- a/gdb/python/lib/gdb/libstdcxx/v6/printers.py
+++ b/gdb/python/lib/gdb/libstdcxx/v6/printers.py
@@ -73,6 +73,17 @@ class StdListPrinter:
return 'empty std::list'
return 'std::list'
+class StdListIteratorPrinter:
+ "Print std::list::iterator"
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ itype = self.val.type().template_argument(0)
+ nodetype = gdb.Type('std::_List_node<%s>' % itype).pointer()
+ return self.val['_M_node'].cast(nodetype).dereference()['_M_data']
+
class StdSlistPrinter:
"Print a __gnu_cxx::slist"
@@ -107,6 +118,17 @@ class StdSlistPrinter:
return 'empty __gnu_cxx::slist'
return '__gnu_cxx::slist'
+class StdSlistIteratorPrinter:
+ "Print __gnu_cxx::slist::iterator"
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ itype = self.val.type().template_argument(0)
+ nodetype = gdb.Type('__gnu_cxx::_Slist_node<%s>' % itype).pointer()
+ return self.val['_M_node'].cast(nodetype).dereference()['_M_data']
+
class StdVectorPrinter:
"Print a std::vector"
@@ -145,6 +167,15 @@ class StdVectorPrinter:
def display_hint(self):
return 'array'
+class StdVectorIteratorPrinter:
+ "Print std::vector::iterator"
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ return self.val['_M_current'].dereference()
+
class StdStackOrQueuePrinter:
"Print a std::stack or std::queue"
@@ -198,6 +229,22 @@ class RbtreeIterator:
self.node = node
return result
+# This is a pretty printer for std::_Rb_tree_iterator (which is
+# std::map::iterator), and has nothing to do with the RbtreeIterator
+# class above.
+class StdRbtreeIteratorPrinter:
+ "Print std::map::iterator"
+
+ def __init__ (self, val):
+ self.val = val
+
+ def to_string (self):
+ valuetype = self.val.type().template_argument(0)
+ nodetype = gdb.Type('std::_Rb_tree_node < %s >' % valuetype)
+ nodetype = nodetype.pointer()
+ return self.val.cast(nodetype).dereference()['_M_value_field']
+
+
class StdMapPrinter:
"Print a std::map or std::multimap"
@@ -369,6 +416,15 @@ class StdDequePrinter:
def display_hint (self):
return 'array'
+class StdDequeIteratorPrinter:
+ "Print std::deque::iterator"
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ return self.val['_M_cur'].dereference()
+
class WideEncoding (gdb.Parameter):
"""The target wide character set is the encoding used for wchar_t."""
@@ -514,6 +570,13 @@ def register_libstdcxx_printers(obj):
obj.pretty_printers['^std::set<.*>$'] = lambda val: StdSetPrinter("std::set", val)
obj.pretty_printers['^std::stack<.*>$'] = lambda val: StdStackOrQueuePrinter("std::stack", val)
obj.pretty_printers['^std::vector<.*>$'] = StdVectorPrinter
+ obj.pretty_printers['^std::_List_iterator<.*>$'] = lambda val: StdListIteratorPrinter(val)
+ obj.pretty_printers['^std::_List_const_iterator<.*>$'] = lambda val: StdListIteratorPrinter(val)
+ obj.pretty_printers['^std::_Rb_tree_iterator<.*>$'] = lambda val: StdRbtreeIteratorPrinter(val)
+ obj.pretty_printers['^std::_Rb_tree_const_iterator<.*>$'] = lambda val: StdRbtreeIteratorPrinter(val)
+ obj.pretty_printers['^std::_Deque_iterator<.*>$'] = lambda val: StdDequeIteratorPrinter(val)
+ obj.pretty_printers['^std::_Deque_const_iterator<.*>$'] = lambda val: StdDequeIteratorPrinter(val)
+ obj.pretty_printers['^__gnu_cxx::__normal_iterator<.*>$'] = lambda val: StdVectorIteratorPrinter(val)
# vector<bool>
# C++0x stuff.
@@ -529,5 +592,6 @@ def register_libstdcxx_printers(obj):
# Extensions.
obj.pretty_printers['^__gnu_cxx::slist<.*>$'] = StdSlistPrinter
+ obj.pretty_printers['^__gnu_cxx::_Slist_iterator<.*>$'] = lambda val: StdSlistIteratorPrinter(val)
register_libstdcxx_printers (gdb.current_objfile())