1ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Pretty-printers for libstc++.
2ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
4ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
5ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# This program is free software; you can redistribute it and/or modify
6ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# it under the terms of the GNU General Public License as published by
7ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# the Free Software Foundation; either version 3 of the License, or
8ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# (at your option) any later version.
9ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#
10ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# This program is distributed in the hope that it will be useful,
11ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# but WITHOUT ANY WARRANTY; without even the implied warranty of
12ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# GNU General Public License for more details.
14ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#
15ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# You should have received a copy of the GNU General Public License
16ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# along with this program.  If not, see <http://www.gnu.org/licenses/>.
17ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
18ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport gdb
19ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport itertools
20ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport re
21ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
22ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdPointerPrinter:
23ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a smart pointer of some kind"
24ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
25ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
26ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
27ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
28ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
29ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
30ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.val['_M_refcount']['_M_pi'] == 0:
31ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return '%s (empty) %s' % (self.typename, self.val['_M_ptr'])
32ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s (count %d) %s' % (self.typename,
33ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                     self.val['_M_refcount']['_M_pi']['_M_use_count'],
34ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                     self.val['_M_ptr'])
35ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
36ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass UniquePointerPrinter:
37ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a unique_ptr"
38ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
39ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, val):
40ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
41ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
42ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
43ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_t']
44ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
45ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdListPrinter:
46ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::list"
47ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
48ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iterator:
49ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, nodetype, head):
50ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.nodetype = nodetype
51ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.base = head['_M_next']
52ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.head = head.address
53ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
54ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
55ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
56ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
57ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
58ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
59ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.base == self.head:
60ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise StopIteration
61ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            elt = self.base.cast(self.nodetype).dereference()
62ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.base = elt['_M_next']
63ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            count = self.count
64ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
65ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return ('[%d]' % count, elt['_M_data'])
66ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
67ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, typename, val):
68ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
69ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
70ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
71ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children(self):
72ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        itype = self.val.type.template_argument(0)
73ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # If the inferior program is compiled with -D_GLIBCXX_DEBUG
74ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # some of the internal implementation details change.
75ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.typename == "std::list":
76ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer()
77ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif self.typename == "std::__debug::list":
78ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodetype = gdb.lookup_type('std::__norm::_List_node<%s>' % itype).pointer()
79ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
80ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise ValueError, "Cannot cast list node for list printer."
81ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iterator(nodetype, self.val['_M_impl']['_M_node'])
82ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
83ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
84ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.val['_M_impl']['_M_node'].address == self.val['_M_impl']['_M_node']['_M_next']:
85ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return 'empty %s' % (self.typename)
86ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s' % (self.typename)
87ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
88ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdListIteratorPrinter:
89ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print std::list::iterator"
90ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
91ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, typename, val):
92ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
93ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
94ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
95ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
96ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        itype = self.val.type.template_argument(0)
97ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # If the inferior program is compiled with -D_GLIBCXX_DEBUG
98ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # some of the internal implementation details change.
99ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.typename == "std::_List_iterator" or self.typename == "std::_List_const_iterator":
100ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer()
101ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif self.typename == "std::__norm::_List_iterator" or self.typename == "std::__norm::_List_const_iterator":
102ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodetype = gdb.lookup_type('std::__norm::_List_node<%s>' % itype).pointer()
103ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
104ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise ValueError, "Cannot cast list node for list iterator printer."
105ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_node'].cast(nodetype).dereference()['_M_data']
106ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
107ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdSlistPrinter:
108ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a __gnu_cxx::slist"
109ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
110ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iterator:
111ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, nodetype, head):
112ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.nodetype = nodetype
113ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.base = head['_M_head']['_M_next']
114ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
115ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
116ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
117ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
118ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
119ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
120ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.base == 0:
121ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise StopIteration
122ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            elt = self.base.cast(self.nodetype).dereference()
123ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.base = elt['_M_next']
124ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            count = self.count
125ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
126ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return ('[%d]' % count, elt['_M_data'])
127ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
128ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, val):
129ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
130ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
131ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children(self):
132ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        itype = self.val.type.template_argument(0)
133ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer()
134ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iterator(nodetype, self.val)
135ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
136ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
137ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.val['_M_head']['_M_next'] == 0:
138ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return 'empty __gnu_cxx::slist'
139ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '__gnu_cxx::slist'
140ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
141ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdSlistIteratorPrinter:
142ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print __gnu_cxx::slist::iterator"
143ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
144ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, val):
145ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
146ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
147ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
148ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        itype = self.val.type.template_argument(0)
149ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer()
150ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_node'].cast(nodetype).dereference()['_M_data']
151ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
152ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdVectorPrinter:
153ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::vector"
154ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
155ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iterator:
156ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__ (self, start, finish, bitvec):
157ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.bitvec = bitvec
158ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if bitvec:
159ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.item   = start['_M_p']
160ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.so     = start['_M_offset']
161ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.finish = finish['_M_p']
162ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.fo     = finish['_M_offset']
163ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                itype = self.item.dereference().type
164ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.isize = 8 * itype.sizeof
165ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
166ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.item = start
167ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.finish = finish
168ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
169ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
170ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
171ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
172ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
173ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
174ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            count = self.count
175ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
176ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.bitvec:
177ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if self.item == self.finish and self.so >= self.fo:
178ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    raise StopIteration
179ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                elt = self.item.dereference()
180ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if elt & (1 << self.so):
181ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    obit = 1
182ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
183ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    obit = 0
184ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.so = self.so + 1
185ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if self.so >= self.isize:
186ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.item = self.item + 1
187ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.so = 0
188ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return ('[%d]' % count, obit)
189ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
190ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if self.item == self.finish:
191ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    raise StopIteration
192ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                elt = self.item.dereference()
193ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.item = self.item + 1
194ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return ('[%d]' % count, elt)
195ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
196ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, typename, val):
197ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
198ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
199ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.is_bool = val.type.template_argument(0).code  == gdb.TYPE_CODE_BOOL
200ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
201ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children(self):
202ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iterator(self.val['_M_impl']['_M_start'],
203ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                              self.val['_M_impl']['_M_finish'],
204ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                              self.is_bool)
205ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
206ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
207ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        start = self.val['_M_impl']['_M_start']
208ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finish = self.val['_M_impl']['_M_finish']
209ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        end = self.val['_M_impl']['_M_end_of_storage']
210ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.is_bool:
211ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            start = self.val['_M_impl']['_M_start']['_M_p']
212ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            so    = self.val['_M_impl']['_M_start']['_M_offset']
213ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            finish = self.val['_M_impl']['_M_finish']['_M_p']
214ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            fo     = self.val['_M_impl']['_M_finish']['_M_offset']
215ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            itype = start.dereference().type
216ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bl = 8 * itype.sizeof
217ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            length   = (bl - so) + bl * ((finish - start) - 1) + fo
218ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            capacity = bl * (end - start)
219ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return ('%s<bool> of length %d, capacity %d'
220ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    % (self.typename, int (length), int (capacity)))
221ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
222ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return ('%s of length %d, capacity %d'
223ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    % (self.typename, int (finish - start), int (end - start)))
224ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
225ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint(self):
226ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 'array'
227ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
228ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdVectorIteratorPrinter:
229ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print std::vector::iterator"
230ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
231ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, val):
232ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
233ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
234ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
235ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_current'].dereference()
236ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
237ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdTuplePrinter:
238ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::tuple"
239ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
240ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iterator:
241ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__ (self, head):
242ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.head = head
243ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
244ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Set the base class as the initial head of the
245ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # tuple.
246ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodes = self.head.type.fields ()
247ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if len (nodes) != 1:
248ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise ValueError, "Top of tuple tree does not consist of a single node."
249ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
250ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Set the actual head to the first pair.
251ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.head  = self.head.cast (nodes[0].type)
252ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
253ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
254ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__ (self):
255ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
256ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
257ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next (self):
258ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            nodes = self.head.type.fields ()
259ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Check for further recursions in the inheritance tree.
260ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if len (nodes) == 0:
261ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise StopIteration
262ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Check that this iteration has an expected structure.
263ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if len (nodes) != 2:
264ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise ValueError, "Cannot parse more than 2 nodes in a tuple tree."
265ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
266ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - Left node is the next recursion parent.
267ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - Right node is the actual class contained in the tuple.
268ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
269ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Process right node.
270ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            impl = self.head.cast (nodes[1].type)
271ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
272ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Process left node and set it as head.
273ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.head  = self.head.cast (nodes[0].type)
274ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
275ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
276ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Finally, check the implementation.  If it is
277ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # wrapped in _M_head_impl return that, otherwise return
278ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # the value "as is".
279ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            fields = impl.type.fields ()
280ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if len (fields) < 1 or fields[0].name != "_M_head_impl":
281ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return ('[%d]' % self.count, impl)
282ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
283ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return ('[%d]' % self.count, impl['_M_head_impl'])
284ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
285ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
286ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
287ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val;
288ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
289ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
290ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iterator (self.val)
291ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
292ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
293ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s containing' % (self.typename)
294ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
295ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdStackOrQueuePrinter:
296ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::stack or std::queue"
297ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
298ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
299ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
300ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.visualizer = gdb.default_visualizer(val['c'])
301ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
302ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
303ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.visualizer.children()
304ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
305ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
306ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s wrapping: %s' % (self.typename,
307ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                    self.visualizer.to_string())
308ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
309ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint (self):
310ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if hasattr (self.visualizer, 'display_hint'):
311ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self.visualizer.display_hint ()
312ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return None
313ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
314ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass RbtreeIterator:
315ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, rbtree):
316ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.size = rbtree['_M_t']['_M_impl']['_M_node_count']
317ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left']
318ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.count = 0
319ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
320ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __iter__(self):
321ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self
322ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
323ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __len__(self):
324ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return int (self.size)
325ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
326ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def next(self):
327ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.count == self.size:
328ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise StopIteration
329ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        result = self.node
330ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.count = self.count + 1
331ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.count < self.size:
332ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Compute the next node.
333ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            node = self.node
334ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if node.dereference()['_M_right']:
335ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                node = node.dereference()['_M_right']
336ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                while node.dereference()['_M_left']:
337ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    node = node.dereference()['_M_left']
338ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
339ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                parent = node.dereference()['_M_parent']
340ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                while node == parent.dereference()['_M_right']:
341ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    node = parent
342ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    parent = parent.dereference()['_M_parent']
343ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if node.dereference()['_M_right'] != parent:
344ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    node = parent
345ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = node
346ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return result
347ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
348ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# This is a pretty printer for std::_Rb_tree_iterator (which is
349ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# std::map::iterator), and has nothing to do with the RbtreeIterator
350ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# class above.
351ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdRbtreeIteratorPrinter:
352ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print std::map::iterator"
353ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
354ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, val):
355ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
356ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
357ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
358ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        valuetype = self.val.type.template_argument(0)
359ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = gdb.lookup_type('std::_Rb_tree_node < %s >' % valuetype)
360ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = nodetype.pointer()
361ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val.cast(nodetype).dereference()['_M_value_field']
362ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
363ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdDebugIteratorPrinter:
364ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a debug enabled version of an iterator"
365ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
366ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, val):
367ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
368ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
369ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Just strip away the encapsulating __gnu_debug::_Safe_iterator
370ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # and return the wrapped iterator value.
371ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
372ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        itype = self.val.type.template_argument(0)
373ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_current'].cast(itype)
374ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
375ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdMapPrinter:
376ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::map or std::multimap"
377ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
378ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Turn an RbtreeIterator into a pretty-print iterator.
379ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iter:
380ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, rbiter, type):
381ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.rbiter = rbiter
382ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
383ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.type = type
384ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
385ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
386ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
387ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
388ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
389ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.count % 2 == 0:
390ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                n = self.rbiter.next()
391ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                n = n.cast(self.type).dereference()['_M_value_field']
392ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.pair = n
393ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                item = n['first']
394ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
395ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                item = self.pair['second']
396ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            result = ('[%d]' % self.count, item)
397ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
398ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return result
399ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
400ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
401ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
402ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
403ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
404ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
405ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s with %d elements' % (self.typename,
406ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                        len (RbtreeIterator (self.val)))
407ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
408ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
409ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        keytype = self.val.type.template_argument(0).const()
410ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        valuetype = self.val.type.template_argument(1)
411ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = gdb.lookup_type('std::_Rb_tree_node< std::pair< %s, %s > >' % (keytype, valuetype))
412ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = nodetype.pointer()
413ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iter (RbtreeIterator (self.val), nodetype)
414ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
415ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint (self):
416ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 'map'
417ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
418ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdSetPrinter:
419ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::set or std::multiset"
420ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
421ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Turn an RbtreeIterator into a pretty-print iterator.
422ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iter:
423ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, rbiter, type):
424ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.rbiter = rbiter
425ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
426ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.type = type
427ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
428ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
429ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
430ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
431ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
432ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            item = self.rbiter.next()
433ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            item = item.cast(self.type).dereference()['_M_value_field']
434ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # FIXME: this is weird ... what to do?
435ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Maybe a 'set' display hint?
436ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            result = ('[%d]' % self.count, item)
437ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
438ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return result
439ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
440ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
441ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
442ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
443ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
444ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
445ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s with %d elements' % (self.typename,
446ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                        len (RbtreeIterator (self.val)))
447ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
448ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
449ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        keytype = self.val.type.template_argument(0)
450ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nodetype = gdb.lookup_type('std::_Rb_tree_node< %s >' % keytype).pointer()
451ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iter (RbtreeIterator (self.val), nodetype)
452ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
453ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdBitsetPrinter:
454ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::bitset"
455ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
456ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, typename, val):
457ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
458ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
459ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
460ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
461ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # If template_argument handled values, we could print the
462ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # size.  Or we could use a regexp on the type.
463ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s' % (self.typename)
464ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
465ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
466ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        words = self.val['_M_w']
467ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wtype = words.type
468ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
469ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The _M_w member can be either an unsigned long, or an
470ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # array.  This depends on the template specialization used.
471ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # If it is a single long, convert to a single element list.
472ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if wtype.code == gdb.TYPE_CODE_ARRAY:
473ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            tsize = wtype.target ().sizeof
474ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
475ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            words = [words]
476ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            tsize = wtype.sizeof
477ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
478ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        nwords = wtype.sizeof / tsize
479ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        result = []
480ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        byte = 0
481ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while byte < nwords:
482ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            w = words[byte]
483ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bit = 0
484ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            while w != 0:
485ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if (w & 1) != 0:
486ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    # Another spot where we could use 'set'?
487ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    result.append(('[%d]' % (byte * tsize * 8 + bit), 1))
488ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bit = bit + 1
489ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                w = w >> 1
490ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            byte = byte + 1
491ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return result
492ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
493ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdDequePrinter:
494ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::deque"
495ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
496ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class _iter:
497ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, node, start, end, last, buffer_size):
498ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = node
499ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.p = start
500ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.end = end
501ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.last = last
502ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.buffer_size = buffer_size
503ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = 0
504ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
505ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __iter__(self):
506ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self
507ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
508ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def next(self):
509ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.p == self.last:
510ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raise StopIteration
511ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
512ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            result = ('[%d]' % self.count, self.p.dereference())
513ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
514ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
515ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Advance the 'cur' pointer.
516ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.p = self.p + 1
517ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.p == self.end:
518ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # If we got to the end of this bucket, move to the
519ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # next bucket.
520ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.node = self.node + 1
521ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.p = self.node[0]
522ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.end = self.p + self.buffer_size
523ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
524ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return result
525ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
526ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, typename, val):
527ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
528ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
529ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.elttype = val.type.template_argument(0)
530ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        size = self.elttype.sizeof
531ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if size < 512:
532ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.buffer_size = int (512 / size)
533ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
534ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.buffer_size = 1
535ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
536ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
537ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        start = self.val['_M_impl']['_M_start']
538ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        end = self.val['_M_impl']['_M_finish']
539ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
540ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        delta_n = end['_M_node'] - start['_M_node'] - 1
541ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        delta_s = start['_M_last'] - start['_M_cur']
542ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        delta_e = end['_M_cur'] - end['_M_first']
543ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
544ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        size = self.buffer_size * delta_n + delta_s + delta_e
545ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
546ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s with %d elements' % (self.typename, long (size))
547ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
548ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children(self):
549ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        start = self.val['_M_impl']['_M_start']
550ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        end = self.val['_M_impl']['_M_finish']
551ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self._iter(start['_M_node'], start['_M_cur'], start['_M_last'],
552ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                          end['_M_cur'], self.buffer_size)
553ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
554ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint (self):
555ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 'array'
556ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
557ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdDequeIteratorPrinter:
558ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print std::deque::iterator"
559ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
560ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, val):
561ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
562ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
563ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
564ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self.val['_M_cur'].dereference()
565ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
566ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StdStringPrinter:
567ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a std::basic_string of some kind"
568ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
569ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, val):
570ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
571ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
572ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string(self):
573ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Make sure &string works, too.
574ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        type = self.val.type
575ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if type.code == gdb.TYPE_CODE_REF:
576ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            type = type.target ()
577ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
578ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Calculate the length of the string so that to_string returns
579ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # the string according to length, not according to first null
580ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # encountered.
581ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        ptr = self.val ['_M_dataplus']['_M_p']
582ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        realtype = type.unqualified ().strip_typedefs ()
583ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()
584ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        header = ptr.cast(reptype) - 1
585ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        len = header.dereference ()['_M_length']
586ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if hasattr(ptr, "lazy_string"):
587ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return ptr.lazy_string (length = len)
588ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return ptr.string (length = len)
589ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
590ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint (self):
591ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 'string'
592ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
593ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass Tr1HashtableIterator:
594ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, hash):
595ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.count = 0
596ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.n_buckets = hash['_M_element_count']
597ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.n_buckets == 0:
598ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = False
599ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
600ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.bucket = hash['_M_buckets']
601ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = self.bucket[0]
602ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.update ()
603ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
604ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __iter__ (self):
605ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return self
606ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
607ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def update (self):
608ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # If we advanced off the end of the chain, move to the next
609ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # bucket.
610ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while self.node == 0:
611ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.bucket = self.bucket + 1
612ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = self.bucket[0]
613ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
614ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot       # If we advanced off the end of the bucket array, then
615ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot       # we're done.
616ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.count == self.n_buckets:
617ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.node = False
618ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
619ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.count = self.count + 1
620ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
621ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def next (self):
622ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not self.node:
623ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise StopIteration
624ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        result = self.node.dereference()['_M_v']
625ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.node = self.node.dereference()['_M_next']
626ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.update ()
627ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return result
628ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
629ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass Tr1UnorderedSetPrinter:
630ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a tr1::unordered_set"
631ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
632ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
633ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
634ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
635ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
636ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
637ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s with %d elements' % (self.typename, self.val['_M_element_count'])
638ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
639ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @staticmethod
640ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def format_count (i):
641ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '[%d]' % i
642ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
643ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
644ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        counter = itertools.imap (self.format_count, itertools.count())
645ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return itertools.izip (counter, Tr1HashtableIterator (self.val))
646ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
647ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass Tr1UnorderedMapPrinter:
648ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Print a tr1::unordered_map"
649ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
650ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__ (self, typename, val):
651ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.typename = typename
652ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.val = val
653ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
654ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def to_string (self):
655ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '%s with %d elements' % (self.typename, self.val['_M_element_count'])
656ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
657ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @staticmethod
658ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def flatten (list):
659ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for elt in list:
660ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for i in elt:
661ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                yield i
662ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
663ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @staticmethod
664ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def format_one (elt):
665ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return (elt['first'], elt['second'])
666ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
667ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @staticmethod
668ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def format_count (i):
669ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '[%d]' % i
670ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
671ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def children (self):
672ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        counter = itertools.imap (self.format_count, itertools.count())
673ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Map over the hash table and flatten the result.
674ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.val)))
675ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Zip the two iterators together.
676ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return itertools.izip (counter, data)
677ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
678ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def display_hint (self):
679ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 'map'
680ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
681ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef register_libstdcxx_printers (obj):
682ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Register libstdc++ pretty-printers with objfile Obj."
683ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
684ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if obj == None:
685ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        obj = gdb
686ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
687ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    obj.pretty_printers.append (lookup_function)
688ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
689ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef lookup_function (val):
690ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    "Look-up and return a pretty-printer that can print val."
691ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
692ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Get the type.
693ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    type = val.type
694ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
695ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # If it points to a reference, get the reference.
696ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if type.code == gdb.TYPE_CODE_REF:
697ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        type = type.target ()
698ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
699ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Get the unqualified type, stripped of typedefs.
700ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    type = type.unqualified ().strip_typedefs ()
701ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
702ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Get the type name.
703ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    typename = type.tag
704ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if typename == None:
705ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return None
706ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
707ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Iterate over local dictionary of types to determine
708ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # if a printer is registered for that type.  Return an
709ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # instantiation of the printer if found.
710ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for function in pretty_printers_dict:
711ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if function.search (typename):
712ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return pretty_printers_dict[function] (val)
713ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
714ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Cannot find a pretty printer.  Return None.
715ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return None
716ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
717ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef build_libstdcxx_dictionary ():
718ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # libstdc++ objects requiring pretty-printing.
719ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # In order from:
720ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html
721ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::basic_string<.*>$')] = lambda val: StdStringPrinter(val)
722ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::bitset", val)
723ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::deque<.*>$')] = lambda val: StdDequePrinter("std::deque", val)
724ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::list<.*>$')] = lambda val: StdListPrinter("std::list", val)
725ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::map<.*>$')] = lambda val: StdMapPrinter("std::map", val)
726ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::multimap<.*>$')] = lambda val: StdMapPrinter("std::multimap", val)
727ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::multiset<.*>$')] = lambda val: StdSetPrinter("std::multiset", val)
728ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::priority_queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::priority_queue", val)
729ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::queue", val)
730ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tuple<.*>$')] = lambda val: StdTuplePrinter("std::tuple", val)
731ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::set<.*>$')] = lambda val: StdSetPrinter("std::set", val)
732ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::stack<.*>$')] = lambda val: StdStackOrQueuePrinter("std::stack", val)
733ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::unique_ptr<.*>$')] = UniquePointerPrinter
734ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::vector<.*>$')] = lambda val: StdVectorPrinter("std::vector", val)
735ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # vector<bool>
736ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
737ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Printer registrations for classes compiled with -D_GLIBCXX_DEBUG.
738ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::__debug::bitset", val)
739ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::deque<.*>$')] = lambda val: StdDequePrinter("std::__debug::deque", val)
740ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::list<.*>$')] = lambda val: StdListPrinter("std::__debug::list", val)
741ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::map<.*>$')] = lambda val: StdMapPrinter("std::__debug::map", val)
742ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::multimap<.*>$')] = lambda val: StdMapPrinter("std::__debug::multimap", val)
743ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::multiset<.*>$')] = lambda val: StdSetPrinter("std::__debug::multiset", val)
744ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::priority_queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::priority_queue", val)
745ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::queue", val)
746ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::set<.*>$')] = lambda val: StdSetPrinter("std::__debug::set", val)
747ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::stack<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::stack", val)
748ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::unique_ptr<.*>$')] = UniquePointerPrinter
749ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::vector<.*>$')] = lambda val: StdVectorPrinter("std::__debug::vector", val)
750ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
751ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # These are the TR1 and C++0x printers.
752ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # For array - the default GDB pretty-printer seems reasonable.
753ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::shared_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::shared_ptr', val)
754ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::weak_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::weak_ptr', val)
755ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::unordered_map', val)
756ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::unordered_set', val)
757ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::unordered_multimap', val)
758ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::unordered_multiset', val)
759ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
760ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::shared_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::tr1::shared_ptr', val)
761ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::weak_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::tr1::weak_ptr', val)
762ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_map', val)
763ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_set', val)
764ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_multimap', val)
765ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::tr1::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_multiset', val)
766ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
767ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # These are the C++0x printer registrations for -D_GLIBCXX_DEBUG cases.
768ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # The tr1 namespace printers do not seem to have any debug
769ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # equivalents, so do no register them.
770ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::__debug::unordered_map', val)
771ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::__debug::unordered_set', val)
772ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::__debug::unordered_multimap',  val)
773ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^std::__debug::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::__debug:unordered_multiset', val)
774ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
775ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
776ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Extensions.
777ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pretty_printers_dict[re.compile('^__gnu_cxx::slist<.*>$')] = StdSlistPrinter
778ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
779ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if True:
780ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # These shouldn't be necessary, if GDB "print *i" worked.
781ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # But it often doesn't, so here they are.
782ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_List_iterator<.*>$')] = lambda val: StdListIteratorPrinter("std::_List_iterator",val)
783ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_List_const_iterator<.*>$')] = lambda val: StdListIteratorPrinter("std::_List_const_iterator",val)
784ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_Rb_tree_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val)
785ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_Rb_tree_const_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val)
786ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_Deque_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val)
787ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::_Deque_const_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val)
788ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^__gnu_cxx::__normal_iterator<.*>$')] = lambda val: StdVectorIteratorPrinter(val)
789ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^__gnu_cxx::_Slist_iterator<.*>$')] = lambda val: StdSlistIteratorPrinter(val)
790ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
791ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Debug (compiled with -D_GLIBCXX_DEBUG) printer registrations.
792ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The Rb_tree debug iterator when unwrapped from the encapsulating __gnu_debug::_Safe_iterator
793ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # does not have the __norm namespace. Just use the existing printer registration for that.
794ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^__gnu_debug::_Safe_iterator<.*>$')] = lambda val: StdDebugIteratorPrinter(val)
795ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::__norm::_List_iterator<.*>$')] = lambda val: StdListIteratorPrinter ("std::__norm::_List_iterator",val)
796ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::__norm::_List_const_iterator<.*>$')] = lambda val: StdListIteratorPrinter ("std::__norm::_List_const_iterator",val)
797ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::__norm::_Deque_const_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val)
798ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pretty_printers_dict[re.compile('^std::__norm::_Deque_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val)
799ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
800ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotpretty_printers_dict = {}
801ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
802ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotbuild_libstdcxx_dictionary ()
803