forked from OSchip/llvm-project
Add test for SBValue.GetNonSyntheticValue in presence of synth provider.
Test Plan: dotest.py -p TestFormattersSBAPI Reviewers: granata.enrico Reviewed By: granata.enrico Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D10783 llvm-svn: 240861
This commit is contained in:
parent
0000afd88c
commit
a07e1e7f2b
|
@ -153,7 +153,7 @@ class SBFormattersAPITestCase(TestBase):
|
|||
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 @@ class SBFormattersAPITestCase(TestBase):
|
|||
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')
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
|
@ -21,6 +21,12 @@ struct FooType
|
|||
short F;
|
||||
};
|
||||
|
||||
struct CCC
|
||||
{
|
||||
int a, b, c;
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char const *argv[]) {
|
||||
JustAStruct foo;
|
||||
foo.A = 1;
|
||||
|
@ -29,6 +35,7 @@ int main(int argc, char const *argv[]) {
|
|||
foo.D = 6.28;
|
||||
foo.E = 3100419850;
|
||||
foo.F = 0;
|
||||
|
||||
FooType bar;
|
||||
bar.A = 1;
|
||||
bar.B = 3.14;
|
||||
|
@ -37,6 +44,10 @@ int main(int argc, char const *argv[]) {
|
|||
bar.E = 3100419850;
|
||||
bar.F = 0;
|
||||
JustAStruct* foo_ptr = &foo;
|
||||
|
||||
std::vector<int> int_vector;
|
||||
|
||||
CCC ccc = {111, 222, 333};
|
||||
|
||||
return 0; // Set break point at this line.
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
Loading…
Reference in New Issue