1*0b57cec5SDimitry Andric //===-- SBValueList.cpp ---------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "lldb/API/SBValueList.h"
10*0b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
12*0b57cec5SDimitry Andric #include "lldb/API/SBValue.h"
13*0b57cec5SDimitry Andric #include "lldb/Core/ValueObjectList.h"
14*0b57cec5SDimitry Andric
15*0b57cec5SDimitry Andric #include <vector>
16*0b57cec5SDimitry Andric
17*0b57cec5SDimitry Andric using namespace lldb;
18*0b57cec5SDimitry Andric using namespace lldb_private;
19*0b57cec5SDimitry Andric
20*0b57cec5SDimitry Andric class ValueListImpl {
21*0b57cec5SDimitry Andric public:
ValueListImpl()22*0b57cec5SDimitry Andric ValueListImpl() : m_values() {}
23*0b57cec5SDimitry Andric
ValueListImpl(const ValueListImpl & rhs)24*0b57cec5SDimitry Andric ValueListImpl(const ValueListImpl &rhs) : m_values(rhs.m_values) {}
25*0b57cec5SDimitry Andric
operator =(const ValueListImpl & rhs)26*0b57cec5SDimitry Andric ValueListImpl &operator=(const ValueListImpl &rhs) {
27*0b57cec5SDimitry Andric if (this == &rhs)
28*0b57cec5SDimitry Andric return *this;
29*0b57cec5SDimitry Andric m_values = rhs.m_values;
30*0b57cec5SDimitry Andric return *this;
31*0b57cec5SDimitry Andric }
32*0b57cec5SDimitry Andric
GetSize()33*0b57cec5SDimitry Andric uint32_t GetSize() { return m_values.size(); }
34*0b57cec5SDimitry Andric
Append(const lldb::SBValue & sb_value)35*0b57cec5SDimitry Andric void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
36*0b57cec5SDimitry Andric
Append(const ValueListImpl & list)37*0b57cec5SDimitry Andric void Append(const ValueListImpl &list) {
38*0b57cec5SDimitry Andric for (auto val : list.m_values)
39*0b57cec5SDimitry Andric Append(val);
40*0b57cec5SDimitry Andric }
41*0b57cec5SDimitry Andric
GetValueAtIndex(uint32_t index)42*0b57cec5SDimitry Andric lldb::SBValue GetValueAtIndex(uint32_t index) {
43*0b57cec5SDimitry Andric if (index >= GetSize())
44*0b57cec5SDimitry Andric return lldb::SBValue();
45*0b57cec5SDimitry Andric return m_values[index];
46*0b57cec5SDimitry Andric }
47*0b57cec5SDimitry Andric
FindValueByUID(lldb::user_id_t uid)48*0b57cec5SDimitry Andric lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
49*0b57cec5SDimitry Andric for (auto val : m_values) {
50*0b57cec5SDimitry Andric if (val.IsValid() && val.GetID() == uid)
51*0b57cec5SDimitry Andric return val;
52*0b57cec5SDimitry Andric }
53*0b57cec5SDimitry Andric return lldb::SBValue();
54*0b57cec5SDimitry Andric }
55*0b57cec5SDimitry Andric
GetFirstValueByName(const char * name) const56*0b57cec5SDimitry Andric lldb::SBValue GetFirstValueByName(const char *name) const {
57*0b57cec5SDimitry Andric if (name) {
58*0b57cec5SDimitry Andric for (auto val : m_values) {
59*0b57cec5SDimitry Andric if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
60*0b57cec5SDimitry Andric return val;
61*0b57cec5SDimitry Andric }
62*0b57cec5SDimitry Andric }
63*0b57cec5SDimitry Andric return lldb::SBValue();
64*0b57cec5SDimitry Andric }
65*0b57cec5SDimitry Andric
66*0b57cec5SDimitry Andric private:
67*0b57cec5SDimitry Andric std::vector<lldb::SBValue> m_values;
68*0b57cec5SDimitry Andric };
69*0b57cec5SDimitry Andric
SBValueList()70*0b57cec5SDimitry Andric SBValueList::SBValueList() : m_opaque_up() {
71*0b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBValueList);
72*0b57cec5SDimitry Andric }
73*0b57cec5SDimitry Andric
SBValueList(const SBValueList & rhs)74*0b57cec5SDimitry Andric SBValueList::SBValueList(const SBValueList &rhs) : m_opaque_up() {
75*0b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &), rhs);
76*0b57cec5SDimitry Andric
77*0b57cec5SDimitry Andric if (rhs.IsValid())
78*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
79*0b57cec5SDimitry Andric }
80*0b57cec5SDimitry Andric
SBValueList(const ValueListImpl * lldb_object_ptr)81*0b57cec5SDimitry Andric SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) : m_opaque_up() {
82*0b57cec5SDimitry Andric if (lldb_object_ptr)
83*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<ValueListImpl>(*lldb_object_ptr);
84*0b57cec5SDimitry Andric }
85*0b57cec5SDimitry Andric
86*0b57cec5SDimitry Andric SBValueList::~SBValueList() = default;
87*0b57cec5SDimitry Andric
IsValid() const88*0b57cec5SDimitry Andric bool SBValueList::IsValid() const {
89*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, IsValid);
90*0b57cec5SDimitry Andric return this->operator bool();
91*0b57cec5SDimitry Andric }
operator bool() const92*0b57cec5SDimitry Andric SBValueList::operator bool() const {
93*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, operator bool);
94*0b57cec5SDimitry Andric
95*0b57cec5SDimitry Andric return (m_opaque_up != nullptr);
96*0b57cec5SDimitry Andric }
97*0b57cec5SDimitry Andric
Clear()98*0b57cec5SDimitry Andric void SBValueList::Clear() {
99*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBValueList, Clear);
100*0b57cec5SDimitry Andric
101*0b57cec5SDimitry Andric m_opaque_up.reset();
102*0b57cec5SDimitry Andric }
103*0b57cec5SDimitry Andric
operator =(const SBValueList & rhs)104*0b57cec5SDimitry Andric const SBValueList &SBValueList::operator=(const SBValueList &rhs) {
105*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(const lldb::SBValueList &,
106*0b57cec5SDimitry Andric SBValueList, operator=,(const lldb::SBValueList &), rhs);
107*0b57cec5SDimitry Andric
108*0b57cec5SDimitry Andric if (this != &rhs) {
109*0b57cec5SDimitry Andric if (rhs.IsValid())
110*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
111*0b57cec5SDimitry Andric else
112*0b57cec5SDimitry Andric m_opaque_up.reset();
113*0b57cec5SDimitry Andric }
114*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(*this);
115*0b57cec5SDimitry Andric }
116*0b57cec5SDimitry Andric
operator ->()117*0b57cec5SDimitry Andric ValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }
118*0b57cec5SDimitry Andric
operator *()119*0b57cec5SDimitry Andric ValueListImpl &SBValueList::operator*() { return *m_opaque_up; }
120*0b57cec5SDimitry Andric
operator ->() const121*0b57cec5SDimitry Andric const ValueListImpl *SBValueList::operator->() const {
122*0b57cec5SDimitry Andric return m_opaque_up.get();
123*0b57cec5SDimitry Andric }
124*0b57cec5SDimitry Andric
operator *() const125*0b57cec5SDimitry Andric const ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }
126*0b57cec5SDimitry Andric
Append(const SBValue & val_obj)127*0b57cec5SDimitry Andric void SBValueList::Append(const SBValue &val_obj) {
128*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValue &),
129*0b57cec5SDimitry Andric val_obj);
130*0b57cec5SDimitry Andric
131*0b57cec5SDimitry Andric CreateIfNeeded();
132*0b57cec5SDimitry Andric m_opaque_up->Append(val_obj);
133*0b57cec5SDimitry Andric }
134*0b57cec5SDimitry Andric
Append(lldb::ValueObjectSP & val_obj_sp)135*0b57cec5SDimitry Andric void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
136*0b57cec5SDimitry Andric if (val_obj_sp) {
137*0b57cec5SDimitry Andric CreateIfNeeded();
138*0b57cec5SDimitry Andric m_opaque_up->Append(SBValue(val_obj_sp));
139*0b57cec5SDimitry Andric }
140*0b57cec5SDimitry Andric }
141*0b57cec5SDimitry Andric
Append(const lldb::SBValueList & value_list)142*0b57cec5SDimitry Andric void SBValueList::Append(const lldb::SBValueList &value_list) {
143*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValueList &),
144*0b57cec5SDimitry Andric value_list);
145*0b57cec5SDimitry Andric
146*0b57cec5SDimitry Andric if (value_list.IsValid()) {
147*0b57cec5SDimitry Andric CreateIfNeeded();
148*0b57cec5SDimitry Andric m_opaque_up->Append(*value_list);
149*0b57cec5SDimitry Andric }
150*0b57cec5SDimitry Andric }
151*0b57cec5SDimitry Andric
GetValueAtIndex(uint32_t idx) const152*0b57cec5SDimitry Andric SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
153*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
154*0b57cec5SDimitry Andric (uint32_t), idx);
155*0b57cec5SDimitry Andric
156*0b57cec5SDimitry Andric
157*0b57cec5SDimitry Andric SBValue sb_value;
158*0b57cec5SDimitry Andric if (m_opaque_up)
159*0b57cec5SDimitry Andric sb_value = m_opaque_up->GetValueAtIndex(idx);
160*0b57cec5SDimitry Andric
161*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_value);
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric
GetSize() const164*0b57cec5SDimitry Andric uint32_t SBValueList::GetSize() const {
165*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBValueList, GetSize);
166*0b57cec5SDimitry Andric
167*0b57cec5SDimitry Andric uint32_t size = 0;
168*0b57cec5SDimitry Andric if (m_opaque_up)
169*0b57cec5SDimitry Andric size = m_opaque_up->GetSize();
170*0b57cec5SDimitry Andric
171*0b57cec5SDimitry Andric return size;
172*0b57cec5SDimitry Andric }
173*0b57cec5SDimitry Andric
CreateIfNeeded()174*0b57cec5SDimitry Andric void SBValueList::CreateIfNeeded() {
175*0b57cec5SDimitry Andric if (m_opaque_up == nullptr)
176*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<ValueListImpl>();
177*0b57cec5SDimitry Andric }
178*0b57cec5SDimitry Andric
FindValueObjectByUID(lldb::user_id_t uid)179*0b57cec5SDimitry Andric SBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {
180*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
181*0b57cec5SDimitry Andric (lldb::user_id_t), uid);
182*0b57cec5SDimitry Andric
183*0b57cec5SDimitry Andric SBValue sb_value;
184*0b57cec5SDimitry Andric if (m_opaque_up)
185*0b57cec5SDimitry Andric sb_value = m_opaque_up->FindValueByUID(uid);
186*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_value);
187*0b57cec5SDimitry Andric }
188*0b57cec5SDimitry Andric
GetFirstValueByName(const char * name) const189*0b57cec5SDimitry Andric SBValue SBValueList::GetFirstValueByName(const char *name) const {
190*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
191*0b57cec5SDimitry Andric (const char *), name);
192*0b57cec5SDimitry Andric
193*0b57cec5SDimitry Andric SBValue sb_value;
194*0b57cec5SDimitry Andric if (m_opaque_up)
195*0b57cec5SDimitry Andric sb_value = m_opaque_up->GetFirstValueByName(name);
196*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_value);
197*0b57cec5SDimitry Andric }
198*0b57cec5SDimitry Andric
opaque_ptr()199*0b57cec5SDimitry Andric void *SBValueList::opaque_ptr() { return m_opaque_up.get(); }
200*0b57cec5SDimitry Andric
ref()201*0b57cec5SDimitry Andric ValueListImpl &SBValueList::ref() {
202*0b57cec5SDimitry Andric CreateIfNeeded();
203*0b57cec5SDimitry Andric return *m_opaque_up;
204*0b57cec5SDimitry Andric }
205*0b57cec5SDimitry Andric
206*0b57cec5SDimitry Andric namespace lldb_private {
207*0b57cec5SDimitry Andric namespace repro {
208*0b57cec5SDimitry Andric
209*0b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)210*0b57cec5SDimitry Andric void RegisterMethods<SBValueList>(Registry &R) {
211*0b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBValueList, ());
212*0b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &));
213*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBValueList, IsValid, ());
214*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBValueList, operator bool, ());
215*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBValueList, Clear, ());
216*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBValueList &,
217*0b57cec5SDimitry Andric SBValueList, operator=,(const lldb::SBValueList &));
218*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBValueList, Append, (const lldb::SBValue &));
219*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBValueList, Append,
220*0b57cec5SDimitry Andric (const lldb::SBValueList &));
221*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
222*0b57cec5SDimitry Andric (uint32_t));
223*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBValueList, GetSize, ());
224*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
225*0b57cec5SDimitry Andric (lldb::user_id_t));
226*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
227*0b57cec5SDimitry Andric (const char *));
228*0b57cec5SDimitry Andric }
229*0b57cec5SDimitry Andric
230*0b57cec5SDimitry Andric }
231*0b57cec5SDimitry Andric }
232