import re
import gdb
import gdb.types
import gdb.xmethod
class SmallVectorImplWorker_at(gdb.xmethod.XMethodWorker):
def __init__(self, t):
self.t = t
def get_arg_types(self):
return gdb.lookup_type('int')
def get_result_type(self, *args):
return self.t
def __call__(self, obj, i):
return (obj['m_begin_ptr'].cast(self.t.pointer()) + i).dereference()
class SmallVectorImplWorker_size(gdb.xmethod.XMethodWorker):
def __init__(self, t):
self.t = t
def get_arg_types(self):
return None
def get_result_type(self, *args):
return gdb.lookup_type('int')
def __call__(self, obj):
return obj['m_end_ptr'].cast(self.t.pointer()) - obj['m_begin_ptr'].cast(self.t.pointer())
class SmallVectorImplMatcher(gdb.xmethod.XMethodMatcher):
def __init__(self):
super().__init__('SmallVectorImplMatcher')
def match(self, class_type, method_name):
if re.match('^megdnn::SmallVector(Impl)?<.*>',
class_type.tag):
if method_name == 'at':
return SmallVectorImplWorker_at(class_type.template_argument(0))
if method_name == 'operator[]':
return SmallVectorImplWorker_at(class_type.template_argument(0))
if method_name == 'size':
return SmallVectorImplWorker_size(class_type.template_argument(0))
gdb.xmethod.register_xmethod_matcher(None, SmallVectorImplMatcher())