You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
eng
libcxx
libcxxabi
libunwind
lld
lldb
cmake
docs
examples
customization
darwin
functions
interposing
lookup
plugins
python
scripting
summaries
synthetic
bitfield
example.py
program.cpp
gnu_libstdcpp.py
libcxx.py
unordered_multi.py
test
include
lit
lldb.xcodeproj
lldb.xcworkspace
packages
resources
scripts
source
third_party
tools
unittests
utils
www
.arcconfig
.clang-format
.gitignore
CMakeLists.txt
CODE_OWNERS.txt
INSTALL.txt
LICENSE.TXT
use_lldb_suite_root.py
llvm
nuget
openmp
polly
Directory.Build.props
Directory.Build.targets
NuGet.config
azure-pipelines.yml
build.cmd
build.sh
dir.common.props
global.json
llvm.proj
mxe-Win64.cmake.in
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
124 lines
5.5 KiB
Python
124 lines
5.5 KiB
Python
![]() |
# Synthetic children provider example for class MaskedData
|
||
|
# to use me:
|
||
|
# command script import ./example.py --allow-reload
|
||
|
# type synthetic add MaskedData --python-class
|
||
|
# example.MaskedData_SyntheticChildrenProvider
|
||
|
|
||
|
|
||
|
class MaskedData_SyntheticChildrenProvider:
|
||
|
|
||
|
def __init__(self, valobj, dict):
|
||
|
# remember the SBValue since you will not have another chance to get it
|
||
|
# :-)
|
||
|
self.valobj = valobj
|
||
|
|
||
|
def num_children(self):
|
||
|
# you could perform calculations involving the SBValue and/or its children to determine this value
|
||
|
# here, we have an hardcoded value - but since you have stored the SBValue you could use it to
|
||
|
# help figure out the correct thing to return here. if you return a number N, you should be prepared to
|
||
|
# answer questions about N children
|
||
|
return 4
|
||
|
|
||
|
def has_children(self):
|
||
|
# we simply say True here because we know we have 4 children
|
||
|
# in general, you want to make this calculation as simple as possible
|
||
|
# and return True if in doubt (you can always return num_children == 0
|
||
|
# later)
|
||
|
return True
|
||
|
|
||
|
def get_child_index(self, name):
|
||
|
# given a name, return its index
|
||
|
# you can return None if you don't know the answer for a given name
|
||
|
if name == "value":
|
||
|
return 0
|
||
|
# here, we are using a reserved C++ keyword as a child name - we could not do that in the source code
|
||
|
# but we are free to use the names we like best in the synthetic children provider class
|
||
|
# we are also not respecting the order of declaration in the C++ class itself - as long as
|
||
|
# we are consistent, we can do that freely
|
||
|
if name == "operator":
|
||
|
return 1
|
||
|
if name == "mask":
|
||
|
return 2
|
||
|
# this member does not exist in the original class - we will compute its value and show it to the user
|
||
|
# when returning synthetic children, there is no need to only stick to
|
||
|
# what already exists in memory
|
||
|
if name == "apply()":
|
||
|
return 3
|
||
|
return None # no clue, just say none
|
||
|
|
||
|
def get_child_at_index(self, index):
|
||
|
# precautionary measures
|
||
|
if index < 0:
|
||
|
return None
|
||
|
if index > self.num_children():
|
||
|
return None
|
||
|
if self.valobj.IsValid() == False:
|
||
|
return None
|
||
|
if index == 0:
|
||
|
return self.valobj.GetChildMemberWithName("value")
|
||
|
if index == 1:
|
||
|
# fetch the value of the operator
|
||
|
op_chosen = self.valobj.GetChildMemberWithName(
|
||
|
"oper").GetValueAsUnsigned()
|
||
|
# if it is a known value, return a descriptive string for it
|
||
|
# we are not doing this in the most efficient possible way, but the code is very readable
|
||
|
# and easy to maintain - if you change the values on the C++ side,
|
||
|
# the same changes must be made here
|
||
|
if op_chosen == 0:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"none"')
|
||
|
elif op_chosen == 1:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"AND"')
|
||
|
elif op_chosen == 2:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"OR"')
|
||
|
elif op_chosen == 3:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"XOR"')
|
||
|
elif op_chosen == 4:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"NAND"')
|
||
|
elif op_chosen == 5:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"NOR"')
|
||
|
else:
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"operator", '(const char*)"unknown"') # something else
|
||
|
if index == 2:
|
||
|
return self.valobj.GetChildMemberWithName("mask")
|
||
|
if index == 3:
|
||
|
# for this, we must fetch all the other elements
|
||
|
# in an efficient implementation, we would be caching this data for
|
||
|
# efficiency
|
||
|
value = self.valobj.GetChildMemberWithName(
|
||
|
"value").GetValueAsUnsigned()
|
||
|
operator = self.valobj.GetChildMemberWithName(
|
||
|
"oper").GetValueAsUnsigned()
|
||
|
mask = self.valobj.GetChildMemberWithName(
|
||
|
"mask").GetValueAsUnsigned()
|
||
|
# compute the masked value according to the operator
|
||
|
if operator == 1:
|
||
|
value = value & mask
|
||
|
elif operator == 2:
|
||
|
value = value | mask
|
||
|
elif operator == 3:
|
||
|
value = value ^ mask
|
||
|
elif operator == 4:
|
||
|
value = ~(value & mask)
|
||
|
elif operator == 5:
|
||
|
value = ~(value | mask)
|
||
|
else:
|
||
|
pass
|
||
|
value &= 0xFFFFFFFF # make sure Python does not extend our values to 64-bits
|
||
|
# return it - again, not the most efficient possible way. we should actually be pushing the computed value
|
||
|
# into an SBData, and using the SBData to create an SBValue - this
|
||
|
# has the advantage of readability
|
||
|
return self.valobj.CreateValueFromExpression(
|
||
|
"apply()", '(uint32_t)(' + str(value) + ')')
|
||
|
|
||
|
def update(self):
|
||
|
# we do not do anything special in update - but this would be the right place to lookup
|
||
|
# the data we use in get_child_at_index and cache it
|
||
|
pass
|