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 AndricSBValueList::SBValueList() { LLDB_INSTRUMENT_VA(this); } 780b57cec5SDimitry Andric SBValueList(const SBValueList & rhs)7904eeddc0SDimitry AndricSBValueList::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 AndricSBValueList::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 Andricbool SBValueList::IsValid() const { 9404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 950b57cec5SDimitry Andric return this->operator bool(); 960b57cec5SDimitry Andric } operator bool() const970b57cec5SDimitry AndricSBValueList::operator bool() const { 9804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric return (m_opaque_up != nullptr); 1010b57cec5SDimitry Andric } 1020b57cec5SDimitry Andric Clear()1030b57cec5SDimitry Andricvoid 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 Andricconst 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 AndricValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); } 1220b57cec5SDimitry Andric operator *()1230b57cec5SDimitry AndricValueListImpl &SBValueList::operator*() { return *m_opaque_up; } 1240b57cec5SDimitry Andric operator ->() const1250b57cec5SDimitry Andricconst ValueListImpl *SBValueList::operator->() const { 1260b57cec5SDimitry Andric return m_opaque_up.get(); 1270b57cec5SDimitry Andric } 1280b57cec5SDimitry Andric operator *() const1290b57cec5SDimitry Andricconst ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; } 1300b57cec5SDimitry Andric Append(const SBValue & val_obj)1310b57cec5SDimitry Andricvoid 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 Andricvoid 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 Andricvoid 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 AndricSBValue 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 Andricuint32_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 Andricvoid 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 AndricSBValue 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 AndricSBValue 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 Andricvoid *SBValueList::opaque_ptr() { return m_opaque_up.get(); } 1980b57cec5SDimitry Andric ref()1990b57cec5SDimitry AndricValueListImpl &SBValueList::ref() { 2000b57cec5SDimitry Andric CreateIfNeeded(); 2010b57cec5SDimitry Andric return *m_opaque_up; 2020b57cec5SDimitry Andric } 203bdd1243dSDimitry Andric GetError()204bdd1243dSDimitry Andriclldb::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 Andricvoid SBValueList::SetError(const lldb_private::Status &status) { 213bdd1243dSDimitry Andric ref().SetError(status); 214bdd1243dSDimitry Andric } 215