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