This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Patch: Adjust libstdc++ std::string GDB pretty-printer to use 'lazy strings'.
- From: Phil Muldoon <pmuldoon at redhat dot com>
- To: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Thu, 14 Jan 2010 10:10:32 +0000
- Subject: Patch: Adjust libstdc++ std::string GDB pretty-printer to use 'lazy strings'.
Hello,
Over at GDB we've checked in the initial implementation of Python lazy
strings. This basically allows us to delay string retrieval until a
time when a string is actually printed. This allows us to defer
encoding of that string until later, and use (because of that), GDB's
encoding mechanisms over Python's mechanisms. GDB's encoding
mechanisms generally tend to be more fault tolerant, and because it
can inspect the actual type of the data being printed, can select an
encoding more accurately. This patch to the libstdc++ GDB pretty-printers
changes the std::string printer to use lazy strings, and also defers
the encoding selection to GDB.
What do you think?
Cheers,
Phil
2010-01-14 Phil Muldoon <pmuldoon@redhat.com>
* python/libstdcxx/v6/printers.py (StdStringPrinter.__init__):
Remove encoding argument.
(StdStringPrinter.to_string): Do not compute or pass encoding.
Use lazy_string over string function.
--
Index: python/libstdcxx/v6/printers.py
===================================================================
--- python/libstdcxx/v6/printers.py (revision 155884)
+++ python/libstdcxx/v6/printers.py (working copy)
@@ -1,6 +1,6 @@
# Pretty-printers for libstc++.
-# Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -529,18 +529,10 @@
class StdStringPrinter:
"Print a std::basic_string of some kind"
- def __init__(self, encoding, val):
- self.encoding = encoding
+ def __init__(self, val):
self.val = val
def to_string(self):
- # Look up the target encoding as late as possible.
- encoding = self.encoding
- if encoding == 0:
- encoding = gdb.parameter('target-charset')
- elif encoding == 1:
- encoding = gdb.parameter('target-wide-charset')
-
# Make sure &string works, too.
type = self.val.type
if type.code == gdb.TYPE_CODE_REF:
@@ -554,7 +546,7 @@
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)
+ return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)
def display_hint (self):
return 'string'
@@ -687,10 +679,7 @@
# libstdc++ objects requiring pretty-printing.
# In order from:
# http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html
- pretty_printers_dict[re.compile('^std::basic_string<char(,.*)?>$')] = lambda val: StdStringPrinter(0, val)
- pretty_printers_dict[re.compile('^std::basic_string<wchar_t(,.*)?>$')] = lambda val: StdStringPrinter(1, val)
- pretty_printers_dict[re.compile('^std::basic_string<char16_t(,.*)?>$')] = lambda val: StdStringPrinter('UTF-16', val)
- pretty_printers_dict[re.compile('^std::basic_string<char32_t(,.*)?>$')] = lambda val: StdStringPrinter('UTF-32', val)
+ pretty_printers_dict[re.compile('^std::basic_string<.*>$')] = lambda val: StdStringPrinter(val)
pretty_printers_dict[re.compile('^std::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::bitset", val)
pretty_printers_dict[re.compile('^std::deque<.*>$')] = lambda val: StdDequePrinter("std::deque", val)
pretty_printers_dict[re.compile('^std::list<.*>$')] = lambda val: StdListPrinter("std::list", val)