import lldb class jasSynthProvider: def __init__(self, valobj, dict): self.valobj = valobj def num_children(self): return 2 def get_child_at_index(self, index): child = None if index == 0: child = self.valobj.GetChildMemberWithName('A') if index == 1: child = self.valobj.CreateValueFromExpression('X', '(int)1') return child def get_child_index(self, name): if name == 'A': return 0 if name == 'X': return 1 return None def ccc_summary(sbvalue, internal_dict): sbvalue = sbvalue.GetNonSyntheticValue() # This tests that the SBValue.GetNonSyntheticValue() actually returns a # non-synthetic value. If it does not, then sbvalue.GetChildMemberWithName("a") # in the following statement will call the 'get_child_index' method of the # synthetic child provider CCCSynthProvider below (which raises an # exception). return "CCC object with leading value " + \ str(sbvalue.GetChildMemberWithName("a")) class CCCSynthProvider(object): def __init__(self, sbvalue, internal_dict): self._sbvalue = sbvalue def num_children(self): return 3 def get_child_index(self, name): raise RuntimeError("I don't want to be called!") def get_child_at_index(self, index): if index == 0: return self._sbvalue.GetChildMemberWithName("a") if index == 1: return self._sbvalue.GetChildMemberWithName("b") if index == 2: return self._sbvalue.GetChildMemberWithName("c") def empty1_summary(sbvalue, internal_dict): return "I am an empty Empty1" class Empty1SynthProvider(object): def __init__(self, sbvalue, internal_dict): self._sbvalue = sbvalue def num_children(self): return 0 def get_child_at_index(self, index): return None def empty2_summary(sbvalue, internal_dict): return "I am an empty Empty2" class Empty2SynthProvider(object): def __init__(self, sbvalue, internal_dict): self._sbvalue = sbvalue def num_children(self): return 0 def get_child_at_index(self, index): return None def __lldb_init_module(debugger, dict): debugger.CreateCategory("JASSynth").AddTypeSynthetic( lldb.SBTypeNameSpecifier("JustAStruct"), lldb.SBTypeSynthetic.CreateWithClassName("synth.jasSynthProvider")) cat = debugger.CreateCategory("CCCSynth") cat.AddTypeSynthetic( lldb.SBTypeNameSpecifier("CCC"), lldb.SBTypeSynthetic.CreateWithClassName("synth.CCCSynthProvider", lldb.eTypeOptionCascade)) cat.AddTypeSummary( lldb.SBTypeNameSpecifier("CCC"), lldb.SBTypeSummary.CreateWithFunctionName("synth.ccc_summary", lldb.eTypeOptionCascade)) cat.AddTypeSynthetic( lldb.SBTypeNameSpecifier("Empty1"), lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty1SynthProvider")) cat.AddTypeSummary( lldb.SBTypeNameSpecifier("Empty1"), lldb.SBTypeSummary.CreateWithFunctionName("synth.empty1_summary")) cat.AddTypeSynthetic( lldb.SBTypeNameSpecifier("Empty2"), lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty2SynthProvider")) cat.AddTypeSummary( lldb.SBTypeNameSpecifier("Empty2"), lldb.SBTypeSummary.CreateWithFunctionName( "synth.empty2_summary", lldb.eTypeOptionHideEmptyAggregates))