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