mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-09 12:24:08 +00:00
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.
|
||||
}
|
||||
|
64
lldb/test/python_api/formatters/synth.py
Normal file
64
lldb/test/python_api/formatters/synth.py
Normal file
@ -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
Block a user