67 lines · python
1# Formatters for classes that derive from Message.2#3# Usage:4# command script import ./example.py5# type summary add --expand --recognizer-function --python-function example.message_summary example.is_message_type6# type synth add --recognizer-function --python-class example.MessageChildProvider example.is_message_type7 8import sys9 10 11def is_message_type(t, internal_dict):12 for base in t.get_bases_array():13 if base.GetName() == "Message":14 return True15 return False16 17 18def message_summary(value, internal_dict):19 # Could have used a summary string as well. All the work is done by the child20 # provider.21 return "Message"22 23 24class MessageChildProvider:25 def __init__(self, value, internal_dict):26 self.value = value27 self.synthetic_children = self._analyze_children(value)28 29 def has_children(self):30 return self.num_children() > 031 32 def num_children(self):33 return len(self.synthetic_children)34 35 def get_child_index(self, name):36 for index, child in enumerate(self.synthetic_children):37 if child.GetName() == name:38 return index39 return None40 41 def get_child_at_index(self, index):42 return self.synthetic_children[index]43 44 def _rename_sbvalue(self, value):45 # We want to display the field with its original name without a trailing46 # underscore. So we create a new SBValue with the same type and address but47 # a different name.48 name = value.GetName()49 assert name.endswith("_")50 new_name = name[:-1]51 return value.CreateValueFromAddress(52 new_name, value.GetLoadAddress(), value.GetType()53 )54 55 def _analyze_children(self, value):56 result = []57 for i in range(value.GetNumChildren()):58 child = value.GetChildAtIndex(i)59 child_name = child.GetName()60 if child_name.startswith("_"):61 continue # Internal field, skip62 # Normal field. Check presence bit.63 presence_bit = value.GetChildMemberWithName("_has_" + child_name)64 if presence_bit.GetValueAsUnsigned() != 0:65 result.append(self._rename_sbvalue(child))66 return result67