1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
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
),
)
|