Added simple gdb pretty-printer (only StrideSpan and StrideSpanIterator for now).
This commit is contained in:
parent
938135768b
commit
dabaf6d903
86
extra/gdb_pretty_printer.py
Normal file
86
extra/gdb_pretty_printer.py
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
|
||||||
|
import gdb
|
||||||
|
import gdb.printing
|
||||||
|
|
||||||
|
if hasattr(gdb, 'ValuePrinter'):
|
||||||
|
printer_base = gdb.ValuePrinter
|
||||||
|
else:
|
||||||
|
printer_base = object
|
||||||
|
|
||||||
|
|
||||||
|
class MijinStrideSpanIteratorPrinter(printer_base):
|
||||||
|
"""Print a mijin::StrideSpanIterator."""
|
||||||
|
class _iterator:
|
||||||
|
def __init__(self, val):
|
||||||
|
self._val = val
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
if self._val is None:
|
||||||
|
raise StopIteration
|
||||||
|
self._val, val = None, self._val
|
||||||
|
return ('ele', val.dereference())
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
self._val = val
|
||||||
|
|
||||||
|
def children(self):
|
||||||
|
return self._iterator(self._val['ele_'])
|
||||||
|
|
||||||
|
def to_string(self):
|
||||||
|
t = self._val.type.template_argument(0)
|
||||||
|
return 'mijin::StrideSpanIterator<%s> with stride %d' % (str(t), self._val['strideBytes_'])
|
||||||
|
|
||||||
|
def display_hint(self):
|
||||||
|
return None # 'array'
|
||||||
|
|
||||||
|
class MijinStrideSpanPrinter(printer_base):
|
||||||
|
"""Print a mijin::StrideSpan."""
|
||||||
|
|
||||||
|
class _iterator:
|
||||||
|
def __init__(self, start, finish, stride_bytes):
|
||||||
|
self._stride_bytes = stride_bytes
|
||||||
|
self._item = start
|
||||||
|
self._finish = finish
|
||||||
|
self._count = 0
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
count = self._count
|
||||||
|
self._count = self._count + 1
|
||||||
|
if self._item == self._finish:
|
||||||
|
raise StopIteration
|
||||||
|
elt = self._item.dereference()
|
||||||
|
self._item = (self._item.cast(gdb.lookup_type('size_t')) + self._stride_bytes).cast(self._finish.type)
|
||||||
|
return ('[%d]' % count, elt)
|
||||||
|
|
||||||
|
def __init__(self, val):
|
||||||
|
self._typename = str(val.type)
|
||||||
|
self._val = val
|
||||||
|
|
||||||
|
def children(self):
|
||||||
|
return self._iterator(self._val['begin_'],
|
||||||
|
self._val['end_'],
|
||||||
|
self._val['strideBytes_'])
|
||||||
|
|
||||||
|
def to_string(self):
|
||||||
|
start = self._val['begin_']
|
||||||
|
finish = self._val['end_']
|
||||||
|
strideBytes = self._val['strideBytes_']
|
||||||
|
return ('%s of length %d, stride %d'
|
||||||
|
% (self._typename, int(finish - start) / strideBytes, strideBytes))
|
||||||
|
|
||||||
|
def display_hint(self):
|
||||||
|
return 'array'
|
||||||
|
|
||||||
|
def build_pretty_printer():
|
||||||
|
printer = gdb.printing.gdb.printing.RegexpCollectionPrettyPrinter('mijin_pp')
|
||||||
|
printer.add_printer('mijin::StrideSpan', r"^mijin::StrideSpan<.*>$", MijinStrideSpanPrinter)
|
||||||
|
printer.add_printer('mijin::StrideSpanIterator', r"^mijin::StrideSpanIterator<.*>$", MijinStrideSpanIteratorPrinter)
|
||||||
|
return printer
|
||||||
|
|
||||||
|
gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer())
|
Loading…
x
Reference in New Issue
Block a user