This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]