From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6715 invoked by alias); 15 Jun 2009 12:39:12 -0000 Received: (qmail 6707 invoked by uid 22791); 15 Jun 2009 12:39:11 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43,J_CHICKENPOX_44,J_CHICKENPOX_46,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 15 Jun 2009 12:39:04 +0000 Received: (qmail 4877 invoked from network); 15 Jun 2009 12:39:02 -0000 Received: from unknown (HELO wind.localnet) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 15 Jun 2009 12:39:02 -0000 From: Vladimir Prus To: Phil Muldoon Subject: Re: Robustifying pretty-printers Date: Mon, 15 Jun 2009 12:39:00 -0000 User-Agent: KMail/1.11.90 (Linux/2.6.24-24-generic; KDE/4.2.90; i686; svn-979530; 2009-06-10) Cc: gdb@sources.redhat.com References: <200906131411.34204.vladimir@codesourcery.com> <200906131421.24719.vladimir@codesourcery.com> <4A363E6F.6020005@redhat.com> In-Reply-To: <4A363E6F.6020005@redhat.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200906151638.57869.vladimir@codesourcery.com> Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2009-06/txt/msg00141.txt.bz2 On Monday 15 June 2009 Phil Muldoon wrote: > --- a/gdb/python/lib/gdb/libstdcxx/v6/printers.py > +++ b/gdb/python/lib/gdb/libstdcxx/v6/printers.py > @@ -468,7 +468,17 @@ class StdStringPrinter: > encoding = gdb.parameter('target-charset') > elif isinstance(encoding, WideEncoding): > encoding = encoding.value > - return self.val['_M_dataplus']['_M_p'].string(encoding) > + type = self.val.type > + if type.code == gdb.TYPE_CODE_REF: > + type = type.target () > + > + ptr = self.val ['_M_dataplus']['_M_p'] > + realtype = type.unqualified ().strip_typedefs () > + reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer () > + header = ptr.cast(reptype) - 1 > + len = header.dereference ()['_M_length'] > + > + return self.val['_M_dataplus']['_M_p'].string (encoding, length = len) Great, this is exactly what I was looking for. Thanks, Volodya