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 "lldb/API/SBError.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 #include "lldb/Utility/Instrumentation.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/Status.h"
16*0b57cec5SDimitry Andric #include <vector>
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric using namespace lldb;
19*0b57cec5SDimitry Andric using namespace lldb_private;
20*0b57cec5SDimitry Andric 
21*0b57cec5SDimitry Andric class ValueListImpl {
22*0b57cec5SDimitry Andric public:
23*0b57cec5SDimitry Andric   ValueListImpl() = default;
24*0b57cec5SDimitry Andric 
25*0b57cec5SDimitry Andric   ValueListImpl(const ValueListImpl &rhs) = default;
26*0b57cec5SDimitry Andric 
operator =(const ValueListImpl & rhs)27*0b57cec5SDimitry Andric   ValueListImpl &operator=(const ValueListImpl &rhs) {
28*0b57cec5SDimitry Andric     if (this == &rhs)
29*0b57cec5SDimitry Andric       return *this;
30*0b57cec5SDimitry Andric     m_values = rhs.m_values;
31*0b57cec5SDimitry Andric     m_error = rhs.m_error;
32*0b57cec5SDimitry Andric     return *this;
33*0b57cec5SDimitry Andric   }
34*0b57cec5SDimitry Andric 
GetSize()35*0b57cec5SDimitry Andric   uint32_t GetSize() { return m_values.size(); }
36*0b57cec5SDimitry Andric 
Append(const lldb::SBValue & sb_value)37*0b57cec5SDimitry Andric   void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
38*0b57cec5SDimitry Andric 
Append(const ValueListImpl & list)39*0b57cec5SDimitry Andric   void Append(const ValueListImpl &list) {
40*0b57cec5SDimitry Andric     for (auto val : list.m_values)
41*0b57cec5SDimitry Andric       Append(val);
42*0b57cec5SDimitry Andric   }
43*0b57cec5SDimitry Andric 
GetValueAtIndex(uint32_t index)44*0b57cec5SDimitry Andric   lldb::SBValue GetValueAtIndex(uint32_t index) {
45*0b57cec5SDimitry Andric     if (index >= GetSize())
46*0b57cec5SDimitry Andric       return lldb::SBValue();
47*0b57cec5SDimitry Andric     return m_values[index];
48*0b57cec5SDimitry Andric   }
49*0b57cec5SDimitry Andric 
FindValueByUID(lldb::user_id_t uid)50*0b57cec5SDimitry Andric   lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
51*0b57cec5SDimitry Andric     for (auto val : m_values) {
52*0b57cec5SDimitry Andric       if (val.IsValid() && val.GetID() == uid)
53*0b57cec5SDimitry Andric         return val;
54*0b57cec5SDimitry Andric     }
55*0b57cec5SDimitry Andric     return lldb::SBValue();
56*0b57cec5SDimitry Andric   }
57*0b57cec5SDimitry Andric 
GetFirstValueByName(const char * name) const58*0b57cec5SDimitry Andric   lldb::SBValue GetFirstValueByName(const char *name) const {
59*0b57cec5SDimitry Andric     if (name) {
60*0b57cec5SDimitry Andric       for (auto val : m_values) {
61*0b57cec5SDimitry Andric         if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
62*0b57cec5SDimitry Andric           return val;
63*0b57cec5SDimitry Andric       }
64*0b57cec5SDimitry Andric     }
65*0b57cec5SDimitry Andric     return lldb::SBValue();
66*0b57cec5SDimitry Andric   }
67*0b57cec5SDimitry Andric 
GetError() const68*0b57cec5SDimitry Andric   const Status &GetError() const { return m_error; }
69*0b57cec5SDimitry Andric 
SetError(const Status & error)70*0b57cec5SDimitry Andric   void SetError(const Status &error) { m_error = error; }
71*0b57cec5SDimitry Andric 
72*0b57cec5SDimitry Andric private:
73*0b57cec5SDimitry Andric   std::vector<lldb::SBValue> m_values;
74*0b57cec5SDimitry Andric   Status m_error;
75*0b57cec5SDimitry Andric };
76*0b57cec5SDimitry Andric 
SBValueList()77*0b57cec5SDimitry Andric SBValueList::SBValueList() { LLDB_INSTRUMENT_VA(this); }
78*0b57cec5SDimitry Andric 
SBValueList(const SBValueList & rhs)79*0b57cec5SDimitry Andric SBValueList::SBValueList(const SBValueList &rhs) {
80*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
81*0b57cec5SDimitry Andric 
82*0b57cec5SDimitry Andric   if (rhs.IsValid())
83*0b57cec5SDimitry Andric     m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
84*0b57cec5SDimitry Andric }
85*0b57cec5SDimitry Andric 
SBValueList(const ValueListImpl * lldb_object_ptr)86*0b57cec5SDimitry Andric SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) {
87*0b57cec5SDimitry Andric   if (lldb_object_ptr)
88*0b57cec5SDimitry Andric     m_opaque_up = std::make_unique<ValueListImpl>(*lldb_object_ptr);
89*0b57cec5SDimitry Andric }
90*0b57cec5SDimitry Andric 
91*0b57cec5SDimitry Andric SBValueList::~SBValueList() = default;
92*0b57cec5SDimitry Andric 
IsValid() const93*0b57cec5SDimitry Andric bool SBValueList::IsValid() const {
94*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
95*0b57cec5SDimitry Andric   return this->operator bool();
96*0b57cec5SDimitry Andric }
operator bool() const97*0b57cec5SDimitry Andric SBValueList::operator bool() const {
98*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
99*0b57cec5SDimitry Andric 
100*0b57cec5SDimitry Andric   return (m_opaque_up != nullptr);
101*0b57cec5SDimitry Andric }
102*0b57cec5SDimitry Andric 
Clear()103*0b57cec5SDimitry Andric void SBValueList::Clear() {
104*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
105*0b57cec5SDimitry Andric 
106*0b57cec5SDimitry Andric   m_opaque_up.reset();
107*0b57cec5SDimitry Andric }
108*0b57cec5SDimitry Andric 
operator =(const SBValueList & rhs)109*0b57cec5SDimitry Andric const SBValueList &SBValueList::operator=(const SBValueList &rhs) {
110*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
111*0b57cec5SDimitry Andric 
112*0b57cec5SDimitry Andric   if (this != &rhs) {
113*0b57cec5SDimitry Andric     if (rhs.IsValid())
114*0b57cec5SDimitry Andric       m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
115*0b57cec5SDimitry Andric     else
116*0b57cec5SDimitry Andric       m_opaque_up.reset();
117*0b57cec5SDimitry Andric   }
118*0b57cec5SDimitry Andric   return *this;
119*0b57cec5SDimitry Andric }
120*0b57cec5SDimitry Andric 
operator ->()121*0b57cec5SDimitry Andric ValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }
122*0b57cec5SDimitry Andric 
operator *()123*0b57cec5SDimitry Andric ValueListImpl &SBValueList::operator*() { return *m_opaque_up; }
124*0b57cec5SDimitry Andric 
operator ->() const125*0b57cec5SDimitry Andric const ValueListImpl *SBValueList::operator->() const {
126*0b57cec5SDimitry Andric   return m_opaque_up.get();
127*0b57cec5SDimitry Andric }
128*0b57cec5SDimitry Andric 
operator *() const129*0b57cec5SDimitry Andric const ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }
130*0b57cec5SDimitry Andric 
Append(const SBValue & val_obj)131*0b57cec5SDimitry Andric void SBValueList::Append(const SBValue &val_obj) {
132*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, val_obj);
133*0b57cec5SDimitry Andric 
134*0b57cec5SDimitry Andric   CreateIfNeeded();
135*0b57cec5SDimitry Andric   m_opaque_up->Append(val_obj);
136*0b57cec5SDimitry Andric }
137*0b57cec5SDimitry Andric 
Append(lldb::ValueObjectSP & val_obj_sp)138*0b57cec5SDimitry Andric void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
139*0b57cec5SDimitry Andric   if (val_obj_sp) {
140*0b57cec5SDimitry Andric     CreateIfNeeded();
141*0b57cec5SDimitry Andric     m_opaque_up->Append(SBValue(val_obj_sp));
142*0b57cec5SDimitry Andric   }
143*0b57cec5SDimitry Andric }
144*0b57cec5SDimitry Andric 
Append(const lldb::SBValueList & value_list)145*0b57cec5SDimitry Andric void SBValueList::Append(const lldb::SBValueList &value_list) {
146*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, value_list);
147*0b57cec5SDimitry Andric 
148*0b57cec5SDimitry Andric   if (value_list.IsValid()) {
149*0b57cec5SDimitry Andric     CreateIfNeeded();
150*0b57cec5SDimitry Andric     m_opaque_up->Append(*value_list);
151*0b57cec5SDimitry Andric   }
152*0b57cec5SDimitry Andric }
153*0b57cec5SDimitry Andric 
GetValueAtIndex(uint32_t idx) const154*0b57cec5SDimitry Andric SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
155*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
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 sb_value;
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric 
GetSize() const164*0b57cec5SDimitry Andric uint32_t SBValueList::GetSize() const {
165*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
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_INSTRUMENT_VA(this, uid);
181*0b57cec5SDimitry Andric 
182*0b57cec5SDimitry Andric   SBValue sb_value;
183*0b57cec5SDimitry Andric   if (m_opaque_up)
184*0b57cec5SDimitry Andric     sb_value = m_opaque_up->FindValueByUID(uid);
185*0b57cec5SDimitry Andric   return sb_value;
186*0b57cec5SDimitry Andric }
187*0b57cec5SDimitry Andric 
GetFirstValueByName(const char * name) const188*0b57cec5SDimitry Andric SBValue SBValueList::GetFirstValueByName(const char *name) const {
189*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, name);
190*0b57cec5SDimitry Andric 
191*0b57cec5SDimitry Andric   SBValue sb_value;
192*0b57cec5SDimitry Andric   if (m_opaque_up)
193*0b57cec5SDimitry Andric     sb_value = m_opaque_up->GetFirstValueByName(name);
194*0b57cec5SDimitry Andric   return sb_value;
195*0b57cec5SDimitry Andric }
196*0b57cec5SDimitry Andric 
opaque_ptr()197*0b57cec5SDimitry Andric void *SBValueList::opaque_ptr() { return m_opaque_up.get(); }
198*0b57cec5SDimitry Andric 
ref()199*0b57cec5SDimitry Andric ValueListImpl &SBValueList::ref() {
200*0b57cec5SDimitry Andric   CreateIfNeeded();
201*0b57cec5SDimitry Andric   return *m_opaque_up;
202*0b57cec5SDimitry Andric }
203*0b57cec5SDimitry Andric 
GetError()204*0b57cec5SDimitry Andric lldb::SBError SBValueList::GetError() {
205*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
206*0b57cec5SDimitry Andric   SBError sb_error;
207*0b57cec5SDimitry Andric   if (m_opaque_up)
208*0b57cec5SDimitry Andric     sb_error.SetError(m_opaque_up->GetError());
209*0b57cec5SDimitry Andric   return sb_error;
210*0b57cec5SDimitry Andric }
211*0b57cec5SDimitry Andric 
SetError(const lldb_private::Status & status)212*0b57cec5SDimitry Andric void SBValueList::SetError(const lldb_private::Status &status) {
213*0b57cec5SDimitry Andric   ref().SetError(status);
214*0b57cec5SDimitry Andric }
215*0b57cec5SDimitry Andric