diff options
author | Chris Moller <cmoller@redhat.com> | 2010-08-16 18:48:27 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2010-08-16 18:48:27 +0000 |
commit | 7bf7b578b780768e086f312d3bb87e90e56a5845 (patch) | |
tree | ddbbeb0ac0a0b242924e0c10051acab03b9293c9 /libstdc++-v3/python/libstdcxx | |
parent | c29e2982e4e8fe39db44ac1e9b06367e209b4f76 (diff) | |
download | gcc-7bf7b578b780768e086f312d3bb87e90e56a5845.zip gcc-7bf7b578b780768e086f312d3bb87e90e56a5845.tar.gz gcc-7bf7b578b780768e086f312d3bb87e90e56a5845.tar.bz2 |
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
Diffstat (limited to 'libstdc++-v3/python/libstdcxx')
-rw-r--r-- | libstdc++-v3/python/libstdcxx/v6/printers.py | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index fe278d6..5333c57 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -153,37 +153,71 @@ class StdVectorPrinter: "Print a std::vector" class _iterator: - def __init__ (self, start, finish): - self.item = start - self.finish = finish + def __init__ (self, start, finish, bitvec): + self.bitvec = bitvec + 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 def __iter__(self): return self def next(self): - if self.item == self.finish: - raise StopIteration count = self.count self.count = self.count + 1 - elt = self.item.dereference() - self.item = self.item + 1 - return ('[%d]' % count, elt) + if self.bitvec: + if self.item == self.finish and self.so >= self.fo: + 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): self.typename = typename self.val = val + self.is_bool = val.type.template_argument(0).code == gdb.TYPE_CODE_BOOL def children(self): 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): start = self.val['_M_impl']['_M_start'] finish = self.val['_M_impl']['_M_finish'] end = self.val['_M_impl']['_M_end_of_storage'] - return ('%s of length %d, capacity %d' - % (self.typename, int (finish - start), int (end - start))) + if self.is_bool: + 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): return 'array' |