|
- 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())
|