15ffd83dbSDimitry Andric //===-- SBValueList.cpp ---------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBValueList.h"
10bdd1243dSDimitry Andric #include "lldb/API/SBError.h"
110b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
120b57cec5SDimitry Andric #include "lldb/API/SBValue.h"
130b57cec5SDimitry Andric #include "lldb/Core/ValueObjectList.h"
1404eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
15bdd1243dSDimitry Andric #include "lldb/Utility/Status.h"
160b57cec5SDimitry Andric #include <vector>
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric using namespace lldb;
190b57cec5SDimitry Andric using namespace lldb_private;
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric class ValueListImpl {
220b57cec5SDimitry Andric public:
2381ad6265SDimitry Andric   ValueListImpl() = default;
240b57cec5SDimitry Andric 
2581ad6265SDimitry Andric   ValueListImpl(const ValueListImpl &rhs) = default;
260b57cec5SDimitry Andric 
operator =(const ValueListImpl & rhs)270b57cec5SDimitry Andric   ValueListImpl &operator=(const ValueListImpl &rhs) {
280b57cec5SDimitry Andric     if (this == &rhs)
290b57cec5SDimitry Andric       return *this;
300b57cec5SDimitry Andric     m_values = rhs.m_values;
31bdd1243dSDimitry Andric     m_error = rhs.m_error;
320b57cec5SDimitry Andric     return *this;
330b57cec5SDimitry Andric   }
340b57cec5SDimitry Andric 
GetSize()350b57cec5SDimitry Andric   uint32_t GetSize() { return m_values.size(); }
360b57cec5SDimitry Andric 
Append(const lldb::SBValue & sb_value)370b57cec5SDimitry Andric   void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
380b57cec5SDimitry Andric 
Append(const ValueListImpl & list)390b57cec5SDimitry Andric   void Append(const ValueListImpl &list) {
400b57cec5SDimitry Andric     for (auto val : list.m_values)
410b57cec5SDimitry Andric       Append(val);
420b57cec5SDimitry Andric   }
430b57cec5SDimitry Andric 
GetValueAtIndex(uint32_t index)440b57cec5SDimitry Andric   lldb::SBValue GetValueAtIndex(uint32_t index) {
450b57cec5SDimitry Andric     if (index >= GetSize())
460b57cec5SDimitry Andric       return lldb::SBValue();
470b57cec5SDimitry Andric     return m_values[index];
480b57cec5SDimitry Andric   }
490b57cec5SDimitry Andric 
FindValueByUID(lldb::user_id_t uid)500b57cec5SDimitry Andric   lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
510b57cec5SDimitry Andric     for (auto val : m_values) {
520b57cec5SDimitry Andric       if (val.IsValid() && val.GetID() == uid)
530b57cec5SDimitry Andric         return val;
540b57cec5SDimitry Andric     }
550b57cec5SDimitry Andric     return lldb::SBValue();
560b57cec5SDimitry Andric   }
570b57cec5SDimitry Andric 
GetFirstValueByName(const char * name) const580b57cec5SDimitry Andric   lldb::SBValue GetFirstValueByName(const char *name) const {
590b57cec5SDimitry Andric     if (name) {
600b57cec5SDimitry Andric       for (auto val : m_values) {
610b57cec5SDimitry Andric         if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
620b57cec5SDimitry Andric           return val;
630b57cec5SDimitry Andric       }
640b57cec5SDimitry Andric     }
650b57cec5SDimitry Andric     return lldb::SBValue();
660b57cec5SDimitry Andric   }
670b57cec5SDimitry Andric 
GetError() const68bdd1243dSDimitry Andric   const Status &GetError() const { return m_error; }
69bdd1243dSDimitry Andric 
SetError(const Status & error)70bdd1243dSDimitry Andric   void SetError(const Status &error) { m_error = error; }
71bdd1243dSDimitry Andric 
720b57cec5SDimitry Andric private:
730b57cec5SDimitry Andric   std::vector<lldb::SBValue> m_values;
74bdd1243dSDimitry Andric   Status m_error;
750b57cec5SDimitry Andric };
760b57cec5SDimitry Andric 
SBValueList()7704eeddc0SDimitry Andric SBValueList::SBValueList() { LLDB_INSTRUMENT_VA(this); }
780b57cec5SDimitry Andric 
SBValueList(const SBValueList & rhs)7904eeddc0SDimitry Andric SBValueList::SBValueList(const SBValueList &rhs) {
8004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   if (rhs.IsValid())
835ffd83dbSDimitry Andric     m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
840b57cec5SDimitry Andric }
850b57cec5SDimitry Andric 
SBValueList(const ValueListImpl * lldb_object_ptr)8604eeddc0SDimitry Andric SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) {
870b57cec5SDimitry Andric   if (lldb_object_ptr)
885ffd83dbSDimitry Andric     m_opaque_up = std::make_unique<ValueListImpl>(*lldb_object_ptr);
890b57cec5SDimitry Andric }
900b57cec5SDimitry Andric 
915ffd83dbSDimitry Andric SBValueList::~SBValueList() = default;
920b57cec5SDimitry Andric 
IsValid() const930b57cec5SDimitry Andric bool SBValueList::IsValid() const {
9404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
950b57cec5SDimitry Andric   return this->operator bool();
960b57cec5SDimitry Andric }
operator bool() const970b57cec5SDimitry Andric SBValueList::operator bool() const {
9804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   return (m_opaque_up != nullptr);
1010b57cec5SDimitry Andric }
1020b57cec5SDimitry Andric 
Clear()1030b57cec5SDimitry Andric void SBValueList::Clear() {
10404eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric   m_opaque_up.reset();
1070b57cec5SDimitry Andric }
1080b57cec5SDimitry Andric 
operator =(const SBValueList & rhs)1090b57cec5SDimitry Andric const SBValueList &SBValueList::operator=(const SBValueList &rhs) {
11004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric   if (this != &rhs) {
1130b57cec5SDimitry Andric     if (rhs.IsValid())
1145ffd83dbSDimitry Andric       m_opaque_up = std::make_unique<ValueListImpl>(*rhs);
1150b57cec5SDimitry Andric     else
1160b57cec5SDimitry Andric       m_opaque_up.reset();
1170b57cec5SDimitry Andric   }
11804eeddc0SDimitry Andric   return *this;
1190b57cec5SDimitry Andric }
1200b57cec5SDimitry Andric 
operator ->()1210b57cec5SDimitry Andric ValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }
1220b57cec5SDimitry Andric 
operator *()1230b57cec5SDimitry Andric ValueListImpl &SBValueList::operator*() { return *m_opaque_up; }
1240b57cec5SDimitry Andric 
operator ->() const1250b57cec5SDimitry Andric const ValueListImpl *SBValueList::operator->() const {
1260b57cec5SDimitry Andric   return m_opaque_up.get();
1270b57cec5SDimitry Andric }
1280b57cec5SDimitry Andric 
operator *() const1290b57cec5SDimitry Andric const ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }
1300b57cec5SDimitry Andric 
Append(const SBValue & val_obj)1310b57cec5SDimitry Andric void SBValueList::Append(const SBValue &val_obj) {
13204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, val_obj);
1330b57cec5SDimitry Andric 
1340b57cec5SDimitry Andric   CreateIfNeeded();
1350b57cec5SDimitry Andric   m_opaque_up->Append(val_obj);
1360b57cec5SDimitry Andric }
1370b57cec5SDimitry Andric 
Append(lldb::ValueObjectSP & val_obj_sp)1380b57cec5SDimitry Andric void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
1390b57cec5SDimitry Andric   if (val_obj_sp) {
1400b57cec5SDimitry Andric     CreateIfNeeded();
1410b57cec5SDimitry Andric     m_opaque_up->Append(SBValue(val_obj_sp));
1420b57cec5SDimitry Andric   }
1430b57cec5SDimitry Andric }
1440b57cec5SDimitry Andric 
Append(const lldb::SBValueList & value_list)1450b57cec5SDimitry Andric void SBValueList::Append(const lldb::SBValueList &value_list) {
14604eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, value_list);
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric   if (value_list.IsValid()) {
1490b57cec5SDimitry Andric     CreateIfNeeded();
1500b57cec5SDimitry Andric     m_opaque_up->Append(*value_list);
1510b57cec5SDimitry Andric   }
1520b57cec5SDimitry Andric }
1530b57cec5SDimitry Andric 
GetValueAtIndex(uint32_t idx) const1540b57cec5SDimitry Andric SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
15504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
1560b57cec5SDimitry Andric 
1570b57cec5SDimitry Andric   SBValue sb_value;
1580b57cec5SDimitry Andric   if (m_opaque_up)
1590b57cec5SDimitry Andric     sb_value = m_opaque_up->GetValueAtIndex(idx);
1600b57cec5SDimitry Andric 
16104eeddc0SDimitry Andric   return sb_value;
1620b57cec5SDimitry Andric }
1630b57cec5SDimitry Andric 
GetSize() const1640b57cec5SDimitry Andric uint32_t SBValueList::GetSize() const {
16504eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric   uint32_t size = 0;
1680b57cec5SDimitry Andric   if (m_opaque_up)
1690b57cec5SDimitry Andric     size = m_opaque_up->GetSize();
1700b57cec5SDimitry Andric 
1710b57cec5SDimitry Andric   return size;
1720b57cec5SDimitry Andric }
1730b57cec5SDimitry Andric 
CreateIfNeeded()1740b57cec5SDimitry Andric void SBValueList::CreateIfNeeded() {
1750b57cec5SDimitry Andric   if (m_opaque_up == nullptr)
1765ffd83dbSDimitry Andric     m_opaque_up = std::make_unique<ValueListImpl>();
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric 
FindValueObjectByUID(lldb::user_id_t uid)1790b57cec5SDimitry Andric SBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {
18004eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, uid);
1810b57cec5SDimitry Andric 
1820b57cec5SDimitry Andric   SBValue sb_value;
1830b57cec5SDimitry Andric   if (m_opaque_up)
1840b57cec5SDimitry Andric     sb_value = m_opaque_up->FindValueByUID(uid);
18504eeddc0SDimitry Andric   return sb_value;
1860b57cec5SDimitry Andric }
1870b57cec5SDimitry Andric 
GetFirstValueByName(const char * name) const1880b57cec5SDimitry Andric SBValue SBValueList::GetFirstValueByName(const char *name) const {
18904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, name);
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric   SBValue sb_value;
1920b57cec5SDimitry Andric   if (m_opaque_up)
1930b57cec5SDimitry Andric     sb_value = m_opaque_up->GetFirstValueByName(name);
19404eeddc0SDimitry Andric   return sb_value;
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric 
opaque_ptr()1970b57cec5SDimitry Andric void *SBValueList::opaque_ptr() { return m_opaque_up.get(); }
1980b57cec5SDimitry Andric 
ref()1990b57cec5SDimitry Andric ValueListImpl &SBValueList::ref() {
2000b57cec5SDimitry Andric   CreateIfNeeded();
2010b57cec5SDimitry Andric   return *m_opaque_up;
2020b57cec5SDimitry Andric }
203bdd1243dSDimitry Andric 
GetError()204bdd1243dSDimitry Andric lldb::SBError SBValueList::GetError() {
205bdd1243dSDimitry Andric   LLDB_INSTRUMENT_VA(this);
206bdd1243dSDimitry Andric   SBError sb_error;
207bdd1243dSDimitry Andric   if (m_opaque_up)
208bdd1243dSDimitry Andric     sb_error.SetError(m_opaque_up->GetError());
209bdd1243dSDimitry Andric   return sb_error;
210bdd1243dSDimitry Andric }
211bdd1243dSDimitry Andric 
SetError(const lldb_private::Status & status)212bdd1243dSDimitry Andric void SBValueList::SetError(const lldb_private::Status &status) {
213bdd1243dSDimitry Andric   ref().SetError(status);
214bdd1243dSDimitry Andric }
215