86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
|
|
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()) |