Index: test/python_api/formatters/TestFormattersSBAPI.py =================================================================== --- test/python_api/formatters/TestFormattersSBAPI.py +++ test/python_api/formatters/TestFormattersSBAPI.py @@ -153,7 +153,7 @@ self.expect("frame variable foo", matching=True, substrs = ['B = ', 'C = ', 'E = ', 'F = ']) - self.runCmd("command script import --allow-reload ./jas_synth.py") + self.runCmd("command script import --allow-reload ./synth.py") self.expect("frame variable foo", matching=False, substrs = ['X = 1']) @@ -162,6 +162,10 @@ self.expect("frame variable foo", matching=True, substrs = ['X = 1']) + self.dbg.GetCategory("CCCSynth").SetEnabled(True) + self.expect("frame variable ccc", matching=True, + substrs = ['CCC object with leading value (int) a = 111', 'a = 111', 'b = 222', 'c = 333']) + foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo') self.assertTrue(foo_var.IsValid(), 'could not find foo') Index: test/python_api/formatters/jas_synth.py =================================================================== --- test/python_api/formatters/jas_synth.py +++ /dev/null @@ -1,24 +0,0 @@ -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 __lldb_init_module(debugger,dict): - debugger.CreateCategory("JASSynth").AddTypeSynthetic(lldb.SBTypeNameSpecifier("JustAStruct"), - lldb.SBTypeSynthetic.CreateWithClassName("jas_synth.jasSynthProvider")) - Index: test/python_api/formatters/main.cpp =================================================================== --- test/python_api/formatters/main.cpp +++ test/python_api/formatters/main.cpp @@ -21,6 +21,12 @@ short F; }; +struct CCC +{ + int a, b, c; +}; + + int main(int argc, char const *argv[]) { JustAStruct foo; foo.A = 1; @@ -29,6 +35,7 @@ foo.D = 6.28; foo.E = 3100419850; foo.F = 0; + FooType bar; bar.A = 1; bar.B = 3.14; @@ -37,6 +44,10 @@ bar.E = 3100419850; bar.F = 0; JustAStruct* foo_ptr = &foo; + std::vector int_vector; + + CCC ccc = {111, 222, 333}; + return 0; // Set break point at this line. } Index: test/python_api/formatters/synth.py =================================================================== --- /dev/null +++ test/python_api/formatters/synth.py @@ -0,0 +1,64 @@ +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 __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)) + +