
Adds GetSyntheticValue to the API on top of GetNonSyntheticValue. --------- Co-authored-by: Vincent Belliard <v-bulle@github.com>
162 lines
5.0 KiB
Python
162 lines
5.0 KiB
Python
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 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
|
|
),
|
|
)
|