diff options
Diffstat (limited to 'lldb/bindings/interface/SBValueList.i')
| -rw-r--r-- | lldb/bindings/interface/SBValueList.i | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/lldb/bindings/interface/SBValueList.i b/lldb/bindings/interface/SBValueList.i new file mode 100644 index 000000000000..17ba2056f0c2 --- /dev/null +++ b/lldb/bindings/interface/SBValueList.i @@ -0,0 +1,172 @@ +//===-- SWIG Interface for SBValueList --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +namespace lldb { + +%feature("docstring", +"Represents a collection of SBValues. Both SBFrame's GetVariables() and +GetRegisters() return a SBValueList. + +SBValueList supports SBValue iteration. For example (from test/lldbutil.py), + +def get_registers(frame, kind): + '''Returns the registers given the frame and the kind of registers desired. + + Returns None if there's no such kind. + ''' + registerSet = frame.GetRegisters() # Return type of SBValueList. + for value in registerSet: + if kind.lower() in value.GetName().lower(): + return value + + return None + +def get_GPRs(frame): + '''Returns the general purpose registers of the frame as an SBValue. + + The returned SBValue object is iterable. An example: + ... + from lldbutil import get_GPRs + regs = get_GPRs(frame) + for reg in regs: + print('%s => %s' % (reg.GetName(), reg.GetValue())) + ... + ''' + return get_registers(frame, 'general purpose') + +def get_FPRs(frame): + '''Returns the floating point registers of the frame as an SBValue. + + The returned SBValue object is iterable. An example: + ... + from lldbutil import get_FPRs + regs = get_FPRs(frame) + for reg in regs: + print('%s => %s' % (reg.GetName(), reg.GetValue())) + ... + ''' + return get_registers(frame, 'floating point') + +def get_ESRs(frame): + '''Returns the exception state registers of the frame as an SBValue. + + The returned SBValue object is iterable. An example: + ... + from lldbutil import get_ESRs + regs = get_ESRs(frame) + for reg in regs: + print('%s => %s' % (reg.GetName(), reg.GetValue())) + ... + ''' + return get_registers(frame, 'exception state')" +) SBValueList; +class SBValueList +{ +public: + + SBValueList (); + + SBValueList (const lldb::SBValueList &rhs); + + ~SBValueList(); + + bool + IsValid() const; + + explicit operator bool() const; + + void + Clear(); + + void + Append (const lldb::SBValue &val_obj); + + void + Append (const lldb::SBValueList& value_list); + + uint32_t + GetSize() const; + + lldb::SBValue + GetValueAtIndex (uint32_t idx) const; + + lldb::SBValue + FindValueObjectByUID (lldb::user_id_t uid); + + lldb::SBValue + GetFirstValueByName (const char* name) const; + + %extend { + %nothreadallow; + std::string lldb::SBValueList::__str__ (){ + lldb::SBStream description; + const size_t n = $self->GetSize(); + if (n) + { + for (size_t i=0; i<n; ++i) + $self->GetValueAtIndex(i).GetDescription(description); + } + else + { + description.Printf("<empty> lldb.SBValueList()"); + } + const char *desc = description.GetData(); + size_t desc_len = description.GetSize(); + if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) + --desc_len; + return std::string(desc, desc_len); + } + %clearnothreadallow; + } + +#ifdef SWIGPYTHON + %pythoncode %{ + def __iter__(self): + '''Iterate over all values in a lldb.SBValueList object.''' + return lldb_iter(self, 'GetSize', 'GetValueAtIndex') + + def __len__(self): + return int(self.GetSize()) + + def __getitem__(self, key): + count = len(self) + #------------------------------------------------------------ + # Access with "int" to get Nth item in the list + #------------------------------------------------------------ + if type(key) is int: + if key < count: + return self.GetValueAtIndex(key) + #------------------------------------------------------------ + # Access with "str" to get values by name + #------------------------------------------------------------ + elif type(key) is str: + matches = [] + for idx in range(count): + value = self.GetValueAtIndex(idx) + if value.name == key: + matches.append(value) + return matches + #------------------------------------------------------------ + # Match with regex + #------------------------------------------------------------ + elif isinstance(key, type(re.compile('.'))): + matches = [] + for idx in range(count): + value = self.GetValueAtIndex(idx) + re_match = key.search(value.name) + if re_match: + matches.append(value) + return matches + + %} +#endif + + +}; + +} // namespace lldb |
