Commit 7bf7b578 by Chris Moller Committed by Tom Tromey

printers.py (StdVectorPrinter): Added stuff to handle pretty-printing of std::vector<bool>.

2010-08-16  Chris Moller  <cmoller@redhat.com>

	http://sourceware.org/bugzilla/show_bug.cgi?id=11874
	* python/libstdcxx/v6/printers.py (StdVectorPrinter): Added stuff
	to handle pretty-printing of std::vector<bool>.

From-SVN: r163282
parent c29e2982
2010-08-16 Chris Moller <cmoller@redhat.com>
http://sourceware.org/bugzilla/show_bug.cgi?id=11874
* python/libstdcxx/v6/printers.py (StdVectorPrinter): Added stuff
to handle pretty-printing of std::vector<bool>.
2010-08-14 Jonathan Wakely <jwakely.gcc@gmail.com> 2010-08-14 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/45283 PR libstdc++/45283
......
...@@ -153,37 +153,71 @@ class StdVectorPrinter: ...@@ -153,37 +153,71 @@ class StdVectorPrinter:
"Print a std::vector" "Print a std::vector"
class _iterator: class _iterator:
def __init__ (self, start, finish): def __init__ (self, start, finish, bitvec):
self.item = start self.bitvec = bitvec
self.finish = finish if bitvec:
self.item = start['_M_p']
self.so = start['_M_offset']
self.finish = finish['_M_p']
self.fo = finish['_M_offset']
itype = self.item.dereference().type
self.isize = 8 * itype.sizeof
else:
self.item = start
self.finish = finish
self.count = 0 self.count = 0
def __iter__(self): def __iter__(self):
return self return self
def next(self): def next(self):
if self.item == self.finish:
raise StopIteration
count = self.count count = self.count
self.count = self.count + 1 self.count = self.count + 1
elt = self.item.dereference() if self.bitvec:
self.item = self.item + 1 if self.item == self.finish and self.so >= self.fo:
return ('[%d]' % count, elt) raise StopIteration
elt = self.item.dereference()
obit = 1 if elt & (1 << self.so) else 0
self.so = self.so + 1
if self.so >= self.isize:
self.item = self.item + 1
self.so = 0
return ('[%d]' % count, obit)
else:
if self.item == self.finish:
raise StopIteration
elt = self.item.dereference()
self.item = self.item + 1
return ('[%d]' % count, elt)
def __init__(self, typename, val): def __init__(self, typename, val):
self.typename = typename self.typename = typename
self.val = val self.val = val
self.is_bool = val.type.template_argument(0).code == gdb.TYPE_CODE_BOOL
def children(self): def children(self):
return self._iterator(self.val['_M_impl']['_M_start'], return self._iterator(self.val['_M_impl']['_M_start'],
self.val['_M_impl']['_M_finish']) self.val['_M_impl']['_M_finish'],
self.is_bool)
def to_string(self): def to_string(self):
start = self.val['_M_impl']['_M_start'] start = self.val['_M_impl']['_M_start']
finish = self.val['_M_impl']['_M_finish'] finish = self.val['_M_impl']['_M_finish']
end = self.val['_M_impl']['_M_end_of_storage'] end = self.val['_M_impl']['_M_end_of_storage']
return ('%s of length %d, capacity %d' if self.is_bool:
% (self.typename, int (finish - start), int (end - start))) start = self.val['_M_impl']['_M_start']['_M_p']
so = self.val['_M_impl']['_M_start']['_M_offset']
finish = self.val['_M_impl']['_M_finish']['_M_p']
fo = self.val['_M_impl']['_M_finish']['_M_offset']
itype = start.dereference().type
bl = 8 * itype.sizeof
length = (bl - so) + bl * ((finish - start) - 1) + fo
capacity = bl * (end - start)
return ('%s<bool> of length %d, capacity %d'
% (self.typename, int (length), int (capacity)))
else:
return ('%s of length %d, capacity %d'
% (self.typename, int (finish - start), int (end - start)))
def display_hint(self): def display_hint(self):
return 'array' return 'array'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment