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