From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5126 invoked by alias); 16 Aug 2010 15:03:30 -0000 Received: (qmail 4865 invoked by uid 22791); 16 Aug 2010 15:03:27 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 16 Aug 2010 15:03:21 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7GF3JvT027167 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 16 Aug 2010 11:03:20 -0400 Received: from qcore.mollernet.net (vpn-11-48.rdu.redhat.com [10.11.11.48]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7GF3J1J010666; Mon, 16 Aug 2010 11:03:19 -0400 Message-ID: <4C695337.5030908@redhat.com> Date: Mon, 16 Aug 2010 15:03:00 -0000 From: Chris Moller User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090513 Fedora/3.0-2.3.beta2.fc11 Thunderbird/3.0b2 MIME-Version: 1.0 To: Tom Tromey , "gdb-patches@sourceware.org" Subject: Re: [tools-team] 11874 Vector pretty-printer chokes on bit-vectors References: <4C653282.4050204@redhat.com> <4C659A95.1060207@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------000100000107090704000803" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-08/txt/msg00221.txt.bz2 This is a multi-part message in MIME format. --------------000100000107090704000803 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 796 On 08/13/10 17:57, Tom Tromey wrote: > Chris> + return ('[%d]' % count, obit) > > It seems like it might be nicer to only print the set bits, something > like bitset. > If it's a sparse vector, yeah, you're right. But it's probably more trouble than it's worth to figure that out and do different things depending, and, on average, it probably dumps more chares to print the indices of the '1's than to print all of the bits. > > Chris> + return ('%s of length %d, capacity %d' > Chris> + % (self.typename, int (length), int (capacity))) > > Doesn't self.typename already include the? > No. typename comes from a string in the dictionary entry for std::vector<.*> and is the same regardless of the template argument. --------------000100000107090704000803 Content-Type: text/x-patch; name="pr11874.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr11874.patch" Content-length: 3967 Index: python/libstdcxx/v6/printers.py =================================================================== --- python/libstdcxx/v6/printers.py (revision 163221) +++ python/libstdcxx/v6/printers.py (working copy) @@ -153,37 +153,71 @@ "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 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' Index: ChangeLog =================================================================== --- ChangeLog (revision 163221) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2010-08-13 Chris Moller + + * python/libstdcxx/v6/printers.py (StdVectorPrinter): Added stuff + to handle pretty-printing of std::vector. + 2010-08-12 Kostya Serebryany Paolo Carlini --------------000100000107090704000803--