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,
|
self.expect("frame variable foo", matching=True,
|
||||||
substrs = ['B = ', 'C = ', 'E = ', 'F = '])
|
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,
|
self.expect("frame variable foo", matching=False,
|
||||||
substrs = ['X = 1'])
|
substrs = ['X = 1'])
|
||||||
|
@ -162,6 +162,10 @@ class SBFormattersAPITestCase(TestBase):
|
||||||
self.expect("frame variable foo", matching=True,
|
self.expect("frame variable foo", matching=True,
|
||||||
substrs = ['X = 1'])
|
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')
|
foo_var = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('foo')
|
||||||
self.assertTrue(foo_var.IsValid(), 'could not find 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;
|
short F;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CCC
|
||||||
|
{
|
||||||
|
int a, b, c;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char const *argv[]) {
|
int main(int argc, char const *argv[]) {
|
||||||
JustAStruct foo;
|
JustAStruct foo;
|
||||||
foo.A = 1;
|
foo.A = 1;
|
||||||
|
@ -29,6 +35,7 @@ int main(int argc, char const *argv[]) {
|
||||||
foo.D = 6.28;
|
foo.D = 6.28;
|
||||||
foo.E = 3100419850;
|
foo.E = 3100419850;
|
||||||
foo.F = 0;
|
foo.F = 0;
|
||||||
|
|
||||||
FooType bar;
|
FooType bar;
|
||||||
bar.A = 1;
|
bar.A = 1;
|
||||||
bar.B = 3.14;
|
bar.B = 3.14;
|
||||||
|
@ -37,6 +44,10 @@ int main(int argc, char const *argv[]) {
|
||||||
bar.E = 3100419850;
|
bar.E = 3100419850;
|
||||||
bar.F = 0;
|
bar.F = 0;
|
||||||
JustAStruct* foo_ptr = &foo;
|
JustAStruct* foo_ptr = &foo;
|
||||||
|
|
||||||
std::vector<int> int_vector;
|
std::vector<int> int_vector;
|
||||||
|
|
||||||
|
CCC ccc = {111, 222, 333};
|
||||||
|
|
||||||
return 0; // Set break point at this line.
|
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