1254721Semaste//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste 11254721Semaste#include "lldb/API/SBValueList.h" 12254721Semaste#include "lldb/API/SBValue.h" 13254721Semaste#include "lldb/API/SBStream.h" 14254721Semaste#include "lldb/Core/Log.h" 15254721Semaste#include "lldb/Core/ValueObjectList.h" 16254721Semaste 17254721Semaste#include <vector> 18254721Semaste 19254721Semasteusing namespace lldb; 20254721Semasteusing namespace lldb_private; 21254721Semaste 22254721Semasteclass ValueListImpl 23254721Semaste{ 24254721Semastepublic: 25254721Semaste ValueListImpl () : 26254721Semaste m_values() 27254721Semaste { 28254721Semaste } 29254721Semaste 30254721Semaste ValueListImpl (const ValueListImpl& rhs) : 31254721Semaste m_values(rhs.m_values) 32254721Semaste { 33254721Semaste } 34254721Semaste 35254721Semaste ValueListImpl& 36254721Semaste operator = (const ValueListImpl& rhs) 37254721Semaste { 38254721Semaste if (this == &rhs) 39254721Semaste return *this; 40254721Semaste m_values = rhs.m_values; 41254721Semaste return *this; 42254721Semaste }; 43254721Semaste 44254721Semaste uint32_t 45254721Semaste GetSize () 46254721Semaste { 47254721Semaste return m_values.size(); 48254721Semaste } 49254721Semaste 50254721Semaste void 51254721Semaste Append (const lldb::SBValue& sb_value) 52254721Semaste { 53254721Semaste m_values.push_back(sb_value); 54254721Semaste } 55254721Semaste 56254721Semaste void 57254721Semaste Append (const ValueListImpl& list) 58254721Semaste { 59254721Semaste for (auto val : list.m_values) 60254721Semaste Append (val); 61254721Semaste } 62254721Semaste 63254721Semaste lldb::SBValue 64254721Semaste GetValueAtIndex (uint32_t index) 65254721Semaste { 66254721Semaste if (index >= GetSize()) 67254721Semaste return lldb::SBValue(); 68254721Semaste return m_values[index]; 69254721Semaste } 70254721Semaste 71254721Semaste lldb::SBValue 72254721Semaste FindValueByUID (lldb::user_id_t uid) 73254721Semaste { 74254721Semaste for (auto val : m_values) 75254721Semaste { 76254721Semaste if (val.IsValid() && val.GetID() == uid) 77254721Semaste return val; 78254721Semaste } 79254721Semaste return lldb::SBValue(); 80254721Semaste } 81254721Semaste 82254721Semasteprivate: 83254721Semaste std::vector<lldb::SBValue> m_values; 84254721Semaste}; 85254721Semaste 86254721SemasteSBValueList::SBValueList () : 87254721Semaste m_opaque_ap () 88254721Semaste{ 89254721Semaste} 90254721Semaste 91254721SemasteSBValueList::SBValueList (const SBValueList &rhs) : 92254721Semaste m_opaque_ap () 93254721Semaste{ 94254721Semaste Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 95254721Semaste 96254721Semaste if (rhs.IsValid()) 97254721Semaste m_opaque_ap.reset (new ValueListImpl (*rhs)); 98254721Semaste 99254721Semaste if (log) 100254721Semaste { 101254721Semaste log->Printf ("SBValueList::SBValueList (rhs.ap=%p) => this.ap = %p", 102254721Semaste (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL), 103254721Semaste m_opaque_ap.get()); 104254721Semaste } 105254721Semaste} 106254721Semaste 107254721SemasteSBValueList::SBValueList (const ValueListImpl *lldb_object_ptr) : 108254721Semaste m_opaque_ap () 109254721Semaste{ 110254721Semaste Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 111254721Semaste 112254721Semaste if (lldb_object_ptr) 113254721Semaste m_opaque_ap.reset (new ValueListImpl (*lldb_object_ptr)); 114254721Semaste 115254721Semaste if (log) 116254721Semaste { 117254721Semaste log->Printf ("SBValueList::SBValueList (lldb_object_ptr=%p) => this.ap = %p", 118254721Semaste lldb_object_ptr, 119254721Semaste m_opaque_ap.get()); 120254721Semaste } 121254721Semaste} 122254721Semaste 123254721SemasteSBValueList::~SBValueList () 124254721Semaste{ 125254721Semaste} 126254721Semaste 127254721Semastebool 128254721SemasteSBValueList::IsValid () const 129254721Semaste{ 130254721Semaste return (m_opaque_ap.get() != NULL); 131254721Semaste} 132254721Semaste 133254721Semastevoid 134254721SemasteSBValueList::Clear() 135254721Semaste{ 136254721Semaste m_opaque_ap.reset(); 137254721Semaste} 138254721Semaste 139254721Semasteconst SBValueList & 140254721SemasteSBValueList::operator = (const SBValueList &rhs) 141254721Semaste{ 142254721Semaste if (this != &rhs) 143254721Semaste { 144254721Semaste if (rhs.IsValid()) 145254721Semaste m_opaque_ap.reset (new ValueListImpl (*rhs)); 146254721Semaste else 147254721Semaste m_opaque_ap.reset (); 148254721Semaste } 149254721Semaste return *this; 150254721Semaste} 151254721Semaste 152254721SemasteValueListImpl * 153254721SemasteSBValueList::operator->() 154254721Semaste{ 155254721Semaste return m_opaque_ap.get(); 156254721Semaste} 157254721Semaste 158254721SemasteValueListImpl & 159254721SemasteSBValueList::operator*() 160254721Semaste{ 161254721Semaste return *m_opaque_ap; 162254721Semaste} 163254721Semaste 164254721Semasteconst ValueListImpl * 165254721SemasteSBValueList::operator->() const 166254721Semaste{ 167254721Semaste return m_opaque_ap.get(); 168254721Semaste} 169254721Semaste 170254721Semasteconst ValueListImpl & 171254721SemasteSBValueList::operator*() const 172254721Semaste{ 173254721Semaste return *m_opaque_ap; 174254721Semaste} 175254721Semaste 176254721Semastevoid 177254721SemasteSBValueList::Append (const SBValue &val_obj) 178254721Semaste{ 179254721Semaste CreateIfNeeded (); 180254721Semaste m_opaque_ap->Append (val_obj); 181254721Semaste} 182254721Semaste 183254721Semastevoid 184254721SemasteSBValueList::Append (lldb::ValueObjectSP& val_obj_sp) 185254721Semaste{ 186254721Semaste if (val_obj_sp) 187254721Semaste { 188254721Semaste CreateIfNeeded (); 189254721Semaste m_opaque_ap->Append (SBValue(val_obj_sp)); 190254721Semaste } 191254721Semaste} 192254721Semaste 193254721Semastevoid 194254721SemasteSBValueList::Append (const lldb::SBValueList& value_list) 195254721Semaste{ 196254721Semaste if (value_list.IsValid()) 197254721Semaste { 198254721Semaste CreateIfNeeded (); 199254721Semaste m_opaque_ap->Append (*value_list); 200254721Semaste } 201254721Semaste} 202254721Semaste 203254721Semaste 204254721SemasteSBValue 205254721SemasteSBValueList::GetValueAtIndex (uint32_t idx) const 206254721Semaste{ 207254721Semaste Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 208254721Semaste 209254721Semaste //if (log) 210254721Semaste // log->Printf ("SBValueList::GetValueAtIndex (uint32_t idx) idx = %d", idx); 211254721Semaste 212254721Semaste SBValue sb_value; 213254721Semaste if (m_opaque_ap.get()) 214254721Semaste sb_value = m_opaque_ap->GetValueAtIndex (idx); 215254721Semaste 216254721Semaste if (log) 217254721Semaste { 218254721Semaste SBStream sstr; 219254721Semaste sb_value.GetDescription (sstr); 220254721Semaste log->Printf ("SBValueList::GetValueAtIndex (this.ap=%p, idx=%d) => SBValue (this.sp = %p, '%s')", 221254721Semaste m_opaque_ap.get(), idx, sb_value.GetSP().get(), sstr.GetData()); 222254721Semaste } 223254721Semaste 224254721Semaste return sb_value; 225254721Semaste} 226254721Semaste 227254721Semasteuint32_t 228254721SemasteSBValueList::GetSize () const 229254721Semaste{ 230254721Semaste Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 231254721Semaste 232254721Semaste //if (log) 233254721Semaste // log->Printf ("SBValueList::GetSize ()"); 234254721Semaste 235254721Semaste uint32_t size = 0; 236254721Semaste if (m_opaque_ap.get()) 237254721Semaste size = m_opaque_ap->GetSize(); 238254721Semaste 239254721Semaste if (log) 240254721Semaste log->Printf ("SBValueList::GetSize (this.ap=%p) => %d", m_opaque_ap.get(), size); 241254721Semaste 242254721Semaste return size; 243254721Semaste} 244254721Semaste 245254721Semastevoid 246254721SemasteSBValueList::CreateIfNeeded () 247254721Semaste{ 248254721Semaste if (m_opaque_ap.get() == NULL) 249254721Semaste m_opaque_ap.reset (new ValueListImpl()); 250254721Semaste} 251254721Semaste 252254721Semaste 253254721SemasteSBValue 254254721SemasteSBValueList::FindValueObjectByUID (lldb::user_id_t uid) 255254721Semaste{ 256254721Semaste SBValue sb_value; 257254721Semaste if (m_opaque_ap.get()) 258254721Semaste sb_value = m_opaque_ap->FindValueByUID(uid); 259254721Semaste return sb_value; 260254721Semaste} 261254721Semaste 262254721Semastevoid * 263254721SemasteSBValueList::opaque_ptr () 264254721Semaste{ 265254721Semaste return m_opaque_ap.get(); 266254721Semaste} 267254721Semaste 268254721SemasteValueListImpl & 269254721SemasteSBValueList::ref () 270254721Semaste{ 271254721Semaste CreateIfNeeded(); 272254721Semaste return *m_opaque_ap.get(); 273254721Semaste} 274254721Semaste 275254721Semaste 276