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 AndricSBValueList::SBValueList() { LLDB_INSTRUMENT_VA(this); } 78*0b57cec5SDimitry Andric SBValueList(const SBValueList & rhs)79*0b57cec5SDimitry AndricSBValueList::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 AndricSBValueList::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 Andricbool SBValueList::IsValid() const { 94*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this); 95*0b57cec5SDimitry Andric return this->operator bool(); 96*0b57cec5SDimitry Andric } operator bool() const97*0b57cec5SDimitry AndricSBValueList::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 Andricvoid 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 Andricconst 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 AndricValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); } 122*0b57cec5SDimitry Andric operator *()123*0b57cec5SDimitry AndricValueListImpl &SBValueList::operator*() { return *m_opaque_up; } 124*0b57cec5SDimitry Andric operator ->() const125*0b57cec5SDimitry Andricconst ValueListImpl *SBValueList::operator->() const { 126*0b57cec5SDimitry Andric return m_opaque_up.get(); 127*0b57cec5SDimitry Andric } 128*0b57cec5SDimitry Andric operator *() const129*0b57cec5SDimitry Andricconst ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; } 130*0b57cec5SDimitry Andric Append(const SBValue & val_obj)131*0b57cec5SDimitry Andricvoid 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 Andricvoid 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 Andricvoid 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 AndricSBValue 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 Andricuint32_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 Andricvoid 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 AndricSBValue 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 AndricSBValue 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 Andricvoid *SBValueList::opaque_ptr() { return m_opaque_up.get(); } 198*0b57cec5SDimitry Andric ref()199*0b57cec5SDimitry AndricValueListImpl &SBValueList::ref() { 200*0b57cec5SDimitry Andric CreateIfNeeded(); 201*0b57cec5SDimitry Andric return *m_opaque_up; 202*0b57cec5SDimitry Andric } 203*0b57cec5SDimitry Andric GetError()204*0b57cec5SDimitry Andriclldb::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 Andricvoid SBValueList::SetError(const lldb_private::Status &status) { 213*0b57cec5SDimitry Andric ref().SetError(status); 214*0b57cec5SDimitry Andric } 215*0b57cec5SDimitry Andric