1//===-- SWIG Interface for SBValueList --------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9namespace lldb {
10
11%feature("docstring",
12"Represents a collection of SBValues.  Both :py:class:`SBFrame.GetVariables()` and
13:py:class:`SBFrame.GetRegisters()` return a SBValueList.
14
15SBValueList supports :py:class:`SBValue` iteration. For example (from test/lldbutil.py),::
16
17    def get_registers(frame, kind):
18        '''Returns the registers given the frame and the kind of registers desired.
19
20        Returns None if there's no such kind.
21        '''
22        registerSet = frame.GetRegisters() # Return type of SBValueList.
23        for value in registerSet:
24            if kind.lower() in value.GetName().lower():
25                return value
26
27        return None
28
29    def get_GPRs(frame):
30        '''Returns the general purpose registers of the frame as an SBValue.
31
32        The returned SBValue object is iterable.  An example:
33            ...
34            from lldbutil import get_GPRs
35            regs = get_GPRs(frame)
36            for reg in regs:
37                print('%s => %s' % (reg.GetName(), reg.GetValue()))
38            ...
39        '''
40        return get_registers(frame, 'general purpose')
41
42    def get_FPRs(frame):
43        '''Returns the floating point registers of the frame as an SBValue.
44
45        The returned SBValue object is iterable.  An example:
46            ...
47            from lldbutil import get_FPRs
48            regs = get_FPRs(frame)
49            for reg in regs:
50                print('%s => %s' % (reg.GetName(), reg.GetValue()))
51            ...
52        '''
53        return get_registers(frame, 'floating point')
54
55    def get_ESRs(frame):
56        '''Returns the exception state registers of the frame as an SBValue.
57
58        The returned SBValue object is iterable.  An example:
59            ...
60            from lldbutil import get_ESRs
61            regs = get_ESRs(frame)
62            for reg in regs:
63                print('%s => %s' % (reg.GetName(), reg.GetValue()))
64            ...
65        '''
66        return get_registers(frame, 'exception state')
67"
68) SBValueList;
69class SBValueList
70{
71public:
72
73    SBValueList ();
74
75    SBValueList (const lldb::SBValueList &rhs);
76
77    ~SBValueList();
78
79    bool
80    IsValid() const;
81
82    explicit operator bool() const;
83
84    void
85    Clear();
86
87    void
88    Append (const lldb::SBValue &val_obj);
89
90    void
91    Append (const lldb::SBValueList& value_list);
92
93    uint32_t
94    GetSize() const;
95
96    lldb::SBValue
97    GetValueAtIndex (uint32_t idx) const;
98
99    lldb::SBValue
100    FindValueObjectByUID (lldb::user_id_t uid);
101
102    lldb::SBValue
103    GetFirstValueByName (const char* name) const;
104
105    lldb::SBError GetError();
106
107    %extend {
108#ifdef SWIGPYTHON
109       %nothreadallow;
110#endif
111       std::string lldb::SBValueList::__str__ (){
112           lldb::SBStream description;
113           const size_t n = $self->GetSize();
114           if (n)
115           {
116               for (size_t i=0; i<n; ++i)
117                   $self->GetValueAtIndex(i).GetDescription(description);
118           }
119           else
120           {
121               description.Printf("<empty> lldb.SBValueList()");
122           }
123           const char *desc = description.GetData();
124           size_t desc_len = description.GetSize();
125           if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
126               --desc_len;
127           return std::string(desc, desc_len);
128       }
129#ifdef SWIGPYTHON
130       %clearnothreadallow;
131#endif
132    }
133
134#ifdef SWIGPYTHON
135    %pythoncode %{
136        def __iter__(self):
137            '''Iterate over all values in a lldb.SBValueList object.'''
138            return lldb_iter(self, 'GetSize', 'GetValueAtIndex')
139
140        def __len__(self):
141            return int(self.GetSize())
142
143        def __getitem__(self, key):
144            count = len(self)
145            #------------------------------------------------------------
146            # Access with "int" to get Nth item in the list
147            #------------------------------------------------------------
148            if type(key) is int:
149                if key < count:
150                    return self.GetValueAtIndex(key)
151            #------------------------------------------------------------
152            # Access with "str" to get values by name
153            #------------------------------------------------------------
154            elif type(key) is str:
155                matches = []
156                for idx in range(count):
157                    value = self.GetValueAtIndex(idx)
158                    if value.name == key:
159                        matches.append(value)
160                return matches
161            #------------------------------------------------------------
162            # Match with regex
163            #------------------------------------------------------------
164            elif isinstance(key, type(re.compile('.'))):
165                matches = []
166                for idx in range(count):
167                    value = self.GetValueAtIndex(idx)
168                    re_match = key.search(value.name)
169                    if re_match:
170                        matches.append(value)
171                return matches
172
173    %}
174#endif
175
176
177};
178
179} // namespace lldb
180