| 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: | |
| import lldb | |
| data = lldb.SBData.CreateDataFromInt(1) | |
| type = self.valobj.target.FindFirstType("int") | |
| child = self.valobj.CreateValueFromData("X", data, type) | |
| 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 return the "b" field"). | |
| return "CCC object with leading value " + str(sbvalue.GetChildMemberWithName("a")) | |
| def ccc_synthetic(sbvalue, internal_dict): | |
| sbvalue = sbvalue.GetSyntheticValue() | |
| # This tests that the SBValue.GetSyntheticValue() actually returns a | |
| # synthetic value. If it does, then sbvalue.GetChildMemberWithName("a") | |
| # in the following statement will call the 'get_child_index' method of the | |
| # synthetic child provider CCCSynthProvider below (which return the "b" field"). | |
| return "CCC object with leading synthetic value " + str( | |
| sbvalue.GetChildMemberWithName("a") | |
| ) | |
| def bar_int_synthetic(sbvalue, internal_dict): | |
| sbvalue = sbvalue.GetSyntheticValue() | |
| # This tests that the SBValue.GetSyntheticValue() actually returns no | |
| # value when the value has no synthetic representation. | |
| return "bar_int synthetic: " + str(sbvalue) | |
| class CCCSynthProvider(object): | |
| def __init__(self, sbvalue, internal_dict): | |
| self._sbvalue = sbvalue | |
| def num_children(self): | |
| return 3 | |
| def get_child_index(self, name): | |
| if name == "a": | |
| # Return b for test. | |
| return 1 | |
| 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 | |
| ), | |
| ) | |
| cat2 = debugger.CreateCategory("CCCSynth2") | |
| cat2.AddTypeSynthetic( | |
| lldb.SBTypeNameSpecifier("CCC"), | |
| lldb.SBTypeSynthetic.CreateWithClassName( | |
| "synth.CCCSynthProvider", lldb.eTypeOptionCascade | |
| ), | |
| ) | |
| cat2.AddTypeSummary( | |
| lldb.SBTypeNameSpecifier("CCC"), | |
| lldb.SBTypeSummary.CreateWithFunctionName( | |
| "synth.ccc_synthetic", lldb.eTypeOptionCascade | |
| ), | |
| ) | |
| cat3 = debugger.CreateCategory("BarIntSynth") | |
| cat3.AddTypeSummary( | |
| lldb.SBTypeNameSpecifier("int"), | |
| lldb.SBTypeSummary.CreateWithFunctionName( | |
| "synth.bar_int_synthetic", lldb.eTypeOptionCascade | |
| ), | |
| ) |