1868186cfSJorge Gorbe Moya# Formatters for classes that derive from Message. 2868186cfSJorge Gorbe Moya# 3868186cfSJorge Gorbe Moya# Usage: 4868186cfSJorge Gorbe Moya# command script import ./example.py 5868186cfSJorge Gorbe Moya# type summary add --expand --recognizer-function --python-function example.message_summary example.is_message_type 6868186cfSJorge Gorbe Moya# type synth add --recognizer-function --python-class example.MessageChildProvider example.is_message_type 7868186cfSJorge Gorbe Moya 8868186cfSJorge Gorbe Moyaimport sys 9868186cfSJorge Gorbe Moya 10*2238dcc3SJonas Devlieghere 11868186cfSJorge Gorbe Moyadef is_message_type(t, internal_dict): 12868186cfSJorge Gorbe Moya for base in t.get_bases_array(): 13868186cfSJorge Gorbe Moya if base.GetName() == "Message": 14868186cfSJorge Gorbe Moya return True 15868186cfSJorge Gorbe Moya return False 16868186cfSJorge Gorbe Moya 17*2238dcc3SJonas Devlieghere 18868186cfSJorge Gorbe Moyadef message_summary(value, internal_dict): 19868186cfSJorge Gorbe Moya # Could have used a summary string as well. All the work is done by the child 20868186cfSJorge Gorbe Moya # provider. 21868186cfSJorge Gorbe Moya return "Message" 22868186cfSJorge Gorbe Moya 23*2238dcc3SJonas Devlieghere 24868186cfSJorge Gorbe Moyaclass MessageChildProvider: 25868186cfSJorge Gorbe Moya def __init__(self, value, internal_dict): 26868186cfSJorge Gorbe Moya self.value = value 27868186cfSJorge Gorbe Moya self.synthetic_children = self._analyze_children(value) 28868186cfSJorge Gorbe Moya 29868186cfSJorge Gorbe Moya def has_children(self): 30868186cfSJorge Gorbe Moya return self.num_children() > 0 31868186cfSJorge Gorbe Moya 32868186cfSJorge Gorbe Moya def num_children(self): 33868186cfSJorge Gorbe Moya return len(self.synthetic_children) 34868186cfSJorge Gorbe Moya 35868186cfSJorge Gorbe Moya def get_child_index(self, name): 36868186cfSJorge Gorbe Moya for index, child in enumerate(self.synthetic_children): 37868186cfSJorge Gorbe Moya if child.GetName() == name: 38868186cfSJorge Gorbe Moya return index 39868186cfSJorge Gorbe Moya return None 40868186cfSJorge Gorbe Moya 41868186cfSJorge Gorbe Moya def get_child_at_index(self, index): 42868186cfSJorge Gorbe Moya return self.synthetic_children[index] 43868186cfSJorge Gorbe Moya 44868186cfSJorge Gorbe Moya def _rename_sbvalue(self, value): 45868186cfSJorge Gorbe Moya # We want to display the field with its original name without a trailing 46868186cfSJorge Gorbe Moya # underscore. So we create a new SBValue with the same type and address but 47868186cfSJorge Gorbe Moya # a different name. 48868186cfSJorge Gorbe Moya name = value.GetName() 49868186cfSJorge Gorbe Moya assert name.endswith("_") 50868186cfSJorge Gorbe Moya new_name = name[:-1] 51*2238dcc3SJonas Devlieghere return value.CreateValueFromAddress( 52*2238dcc3SJonas Devlieghere new_name, value.GetLoadAddress(), value.GetType() 53*2238dcc3SJonas Devlieghere ) 54868186cfSJorge Gorbe Moya 55868186cfSJorge Gorbe Moya def _analyze_children(self, value): 56868186cfSJorge Gorbe Moya result = [] 57868186cfSJorge Gorbe Moya for i in range(value.GetNumChildren()): 58868186cfSJorge Gorbe Moya child = value.GetChildAtIndex(i) 59868186cfSJorge Gorbe Moya child_name = child.GetName() 60868186cfSJorge Gorbe Moya if child_name.startswith("_"): 61868186cfSJorge Gorbe Moya continue # Internal field, skip 62868186cfSJorge Gorbe Moya # Normal field. Check presence bit. 63868186cfSJorge Gorbe Moya presence_bit = value.GetChildMemberWithName("_has_" + child_name) 64868186cfSJorge Gorbe Moya if presence_bit.GetValueAsUnsigned() != 0: 65868186cfSJorge Gorbe Moya result.append(self._rename_sbvalue(child)) 66868186cfSJorge Gorbe Moya return result 67