| 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 = lldb.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)) |