1254721Semaste//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===// 2254721Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6254721Semaste// 7254721Semaste//===----------------------------------------------------------------------===// 8254721Semaste 9254721Semaste#include "lldb/API/SBValueList.h" 10353358Sdim#include "SBReproducerPrivate.h" 11314564Sdim#include "lldb/API/SBStream.h" 12254721Semaste#include "lldb/API/SBValue.h" 13254721Semaste#include "lldb/Core/ValueObjectList.h" 14254721Semaste 15254721Semaste#include <vector> 16254721Semaste 17254721Semasteusing namespace lldb; 18254721Semasteusing namespace lldb_private; 19254721Semaste 20314564Sdimclass ValueListImpl { 21254721Semastepublic: 22314564Sdim ValueListImpl() : m_values() {} 23314564Sdim 24314564Sdim ValueListImpl(const ValueListImpl &rhs) : m_values(rhs.m_values) {} 25314564Sdim 26314564Sdim ValueListImpl &operator=(const ValueListImpl &rhs) { 27314564Sdim if (this == &rhs) 28314564Sdim return *this; 29314564Sdim m_values = rhs.m_values; 30314564Sdim return *this; 31314564Sdim } 32314564Sdim 33314564Sdim uint32_t GetSize() { return m_values.size(); } 34314564Sdim 35314564Sdim void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); } 36314564Sdim 37314564Sdim void Append(const ValueListImpl &list) { 38314564Sdim for (auto val : list.m_values) 39314564Sdim Append(val); 40314564Sdim } 41314564Sdim 42314564Sdim lldb::SBValue GetValueAtIndex(uint32_t index) { 43314564Sdim if (index >= GetSize()) 44314564Sdim return lldb::SBValue(); 45314564Sdim return m_values[index]; 46314564Sdim } 47314564Sdim 48314564Sdim lldb::SBValue FindValueByUID(lldb::user_id_t uid) { 49314564Sdim for (auto val : m_values) { 50314564Sdim if (val.IsValid() && val.GetID() == uid) 51314564Sdim return val; 52254721Semaste } 53314564Sdim return lldb::SBValue(); 54314564Sdim } 55314564Sdim 56314564Sdim lldb::SBValue GetFirstValueByName(const char *name) const { 57314564Sdim if (name) { 58314564Sdim for (auto val : m_values) { 59314564Sdim if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0) 60314564Sdim return val; 61314564Sdim } 62254721Semaste } 63314564Sdim return lldb::SBValue(); 64314564Sdim } 65254721Semaste 66254721Semasteprivate: 67314564Sdim std::vector<lldb::SBValue> m_values; 68254721Semaste}; 69254721Semaste 70353358SdimSBValueList::SBValueList() : m_opaque_up() { 71353358Sdim LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBValueList); 72353358Sdim} 73254721Semaste 74353358SdimSBValueList::SBValueList(const SBValueList &rhs) : m_opaque_up() { 75353358Sdim LLDB_RECORD_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &), rhs); 76254721Semaste 77314564Sdim if (rhs.IsValid()) 78353358Sdim m_opaque_up.reset(new ValueListImpl(*rhs)); 79353358Sdim} 80254721Semaste 81353358SdimSBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) : m_opaque_up() { 82353358Sdim if (lldb_object_ptr) 83353358Sdim m_opaque_up.reset(new ValueListImpl(*lldb_object_ptr)); 84254721Semaste} 85254721Semaste 86353358SdimSBValueList::~SBValueList() {} 87254721Semaste 88353358Sdimbool SBValueList::IsValid() const { 89353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, IsValid); 90353358Sdim return this->operator bool(); 91353358Sdim} 92353358SdimSBValueList::operator bool() const { 93353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, operator bool); 94254721Semaste 95353358Sdim return (m_opaque_up != nullptr); 96254721Semaste} 97254721Semaste 98353358Sdimvoid SBValueList::Clear() { 99353358Sdim LLDB_RECORD_METHOD_NO_ARGS(void, SBValueList, Clear); 100254721Semaste 101353358Sdim m_opaque_up.reset(); 102353358Sdim} 103254721Semaste 104353358Sdimconst SBValueList &SBValueList::operator=(const SBValueList &rhs) { 105353358Sdim LLDB_RECORD_METHOD(const lldb::SBValueList &, 106353358Sdim SBValueList, operator=,(const lldb::SBValueList &), rhs); 107254721Semaste 108314564Sdim if (this != &rhs) { 109314564Sdim if (rhs.IsValid()) 110353358Sdim m_opaque_up.reset(new ValueListImpl(*rhs)); 111314564Sdim else 112353358Sdim m_opaque_up.reset(); 113314564Sdim } 114353358Sdim return LLDB_RECORD_RESULT(*this); 115254721Semaste} 116254721Semaste 117353358SdimValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); } 118254721Semaste 119353358SdimValueListImpl &SBValueList::operator*() { return *m_opaque_up; } 120254721Semaste 121314564Sdimconst ValueListImpl *SBValueList::operator->() const { 122353358Sdim return m_opaque_up.get(); 123254721Semaste} 124254721Semaste 125353358Sdimconst ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; } 126254721Semaste 127314564Sdimvoid SBValueList::Append(const SBValue &val_obj) { 128353358Sdim LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValue &), 129353358Sdim val_obj); 130353358Sdim 131314564Sdim CreateIfNeeded(); 132353358Sdim m_opaque_up->Append(val_obj); 133254721Semaste} 134254721Semaste 135314564Sdimvoid SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) { 136314564Sdim if (val_obj_sp) { 137314564Sdim CreateIfNeeded(); 138353358Sdim m_opaque_up->Append(SBValue(val_obj_sp)); 139314564Sdim } 140254721Semaste} 141254721Semaste 142314564Sdimvoid SBValueList::Append(const lldb::SBValueList &value_list) { 143353358Sdim LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValueList &), 144353358Sdim value_list); 145353358Sdim 146314564Sdim if (value_list.IsValid()) { 147314564Sdim CreateIfNeeded(); 148353358Sdim m_opaque_up->Append(*value_list); 149314564Sdim } 150254721Semaste} 151254721Semaste 152314564SdimSBValue SBValueList::GetValueAtIndex(uint32_t idx) const { 153353358Sdim LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex, 154353358Sdim (uint32_t), idx); 155254721Semaste 156254721Semaste 157314564Sdim SBValue sb_value; 158353358Sdim if (m_opaque_up) 159353358Sdim sb_value = m_opaque_up->GetValueAtIndex(idx); 160254721Semaste 161353358Sdim return LLDB_RECORD_RESULT(sb_value); 162254721Semaste} 163254721Semaste 164314564Sdimuint32_t SBValueList::GetSize() const { 165353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBValueList, GetSize); 166254721Semaste 167314564Sdim uint32_t size = 0; 168353358Sdim if (m_opaque_up) 169353358Sdim size = m_opaque_up->GetSize(); 170254721Semaste 171314564Sdim return size; 172254721Semaste} 173254721Semaste 174314564Sdimvoid SBValueList::CreateIfNeeded() { 175353358Sdim if (m_opaque_up == nullptr) 176353358Sdim m_opaque_up.reset(new ValueListImpl()); 177254721Semaste} 178254721Semaste 179314564SdimSBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) { 180353358Sdim LLDB_RECORD_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID, 181353358Sdim (lldb::user_id_t), uid); 182353358Sdim 183314564Sdim SBValue sb_value; 184353358Sdim if (m_opaque_up) 185353358Sdim sb_value = m_opaque_up->FindValueByUID(uid); 186353358Sdim return LLDB_RECORD_RESULT(sb_value); 187254721Semaste} 188254721Semaste 189314564SdimSBValue SBValueList::GetFirstValueByName(const char *name) const { 190353358Sdim LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName, 191353358Sdim (const char *), name); 192353358Sdim 193314564Sdim SBValue sb_value; 194353358Sdim if (m_opaque_up) 195353358Sdim sb_value = m_opaque_up->GetFirstValueByName(name); 196353358Sdim return LLDB_RECORD_RESULT(sb_value); 197280031Sdim} 198280031Sdim 199353358Sdimvoid *SBValueList::opaque_ptr() { return m_opaque_up.get(); } 200254721Semaste 201314564SdimValueListImpl &SBValueList::ref() { 202314564Sdim CreateIfNeeded(); 203353358Sdim return *m_opaque_up; 204254721Semaste} 205353358Sdim 206353358Sdimnamespace lldb_private { 207353358Sdimnamespace repro { 208353358Sdim 209353358Sdimtemplate <> 210353358Sdimvoid RegisterMethods<SBValueList>(Registry &R) { 211353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBValueList, ()); 212353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &)); 213353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBValueList, IsValid, ()); 214353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBValueList, operator bool, ()); 215353358Sdim LLDB_REGISTER_METHOD(void, SBValueList, Clear, ()); 216353358Sdim LLDB_REGISTER_METHOD(const lldb::SBValueList &, 217353358Sdim SBValueList, operator=,(const lldb::SBValueList &)); 218353358Sdim LLDB_REGISTER_METHOD(void, SBValueList, Append, (const lldb::SBValue &)); 219353358Sdim LLDB_REGISTER_METHOD(void, SBValueList, Append, 220353358Sdim (const lldb::SBValueList &)); 221353358Sdim LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex, 222353358Sdim (uint32_t)); 223353358Sdim LLDB_REGISTER_METHOD_CONST(uint32_t, SBValueList, GetSize, ()); 224353358Sdim LLDB_REGISTER_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID, 225353358Sdim (lldb::user_id_t)); 226353358Sdim LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName, 227353358Sdim (const char *)); 228353358Sdim} 229353358Sdim 230353358Sdim} 231353358Sdim} 232