1 //===-- SBValueList.cpp -----------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "lldb/API/SBValueList.h"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/API/SBValue.h"
13 #include "lldb/Core/ValueObjectList.h"
14 #include "lldb/Utility/Log.h"
15
16 #include <vector>
17
18 using namespace lldb;
19 using namespace lldb_private;
20
21 class ValueListImpl {
22 public:
ValueListImpl()23 ValueListImpl() : m_values() {}
24
ValueListImpl(const ValueListImpl & rhs)25 ValueListImpl(const ValueListImpl &rhs) : m_values(rhs.m_values) {}
26
operator =(const ValueListImpl & rhs)27 ValueListImpl &operator=(const ValueListImpl &rhs) {
28 if (this == &rhs)
29 return *this;
30 m_values = rhs.m_values;
31 return *this;
32 }
33
GetSize()34 uint32_t GetSize() { return m_values.size(); }
35
Append(const lldb::SBValue & sb_value)36 void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
37
Append(const ValueListImpl & list)38 void Append(const ValueListImpl &list) {
39 for (auto val : list.m_values)
40 Append(val);
41 }
42
GetValueAtIndex(uint32_t index)43 lldb::SBValue GetValueAtIndex(uint32_t index) {
44 if (index >= GetSize())
45 return lldb::SBValue();
46 return m_values[index];
47 }
48
FindValueByUID(lldb::user_id_t uid)49 lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
50 for (auto val : m_values) {
51 if (val.IsValid() && val.GetID() == uid)
52 return val;
53 }
54 return lldb::SBValue();
55 }
56
GetFirstValueByName(const char * name) const57 lldb::SBValue GetFirstValueByName(const char *name) const {
58 if (name) {
59 for (auto val : m_values) {
60 if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
61 return val;
62 }
63 }
64 return lldb::SBValue();
65 }
66
67 private:
68 std::vector<lldb::SBValue> m_values;
69 };
70
SBValueList()71 SBValueList::SBValueList() : m_opaque_ap() {}
72
SBValueList(const SBValueList & rhs)73 SBValueList::SBValueList(const SBValueList &rhs) : m_opaque_ap() {
74 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
75
76 if (rhs.IsValid())
77 m_opaque_ap.reset(new ValueListImpl(*rhs));
78
79 if (log) {
80 log->Printf(
81 "SBValueList::SBValueList (rhs.ap=%p) => this.ap = %p",
82 static_cast<void *>(rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL),
83 static_cast<void *>(m_opaque_ap.get()));
84 }
85 }
86
SBValueList(const ValueListImpl * lldb_object_ptr)87 SBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) : m_opaque_ap() {
88 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
89
90 if (lldb_object_ptr)
91 m_opaque_ap.reset(new ValueListImpl(*lldb_object_ptr));
92
93 if (log) {
94 log->Printf("SBValueList::SBValueList (lldb_object_ptr=%p) => this.ap = %p",
95 static_cast<const void *>(lldb_object_ptr),
96 static_cast<void *>(m_opaque_ap.get()));
97 }
98 }
99
~SBValueList()100 SBValueList::~SBValueList() {}
101
IsValid() const102 bool SBValueList::IsValid() const { return (m_opaque_ap != NULL); }
103
Clear()104 void SBValueList::Clear() { m_opaque_ap.reset(); }
105
operator =(const SBValueList & rhs)106 const SBValueList &SBValueList::operator=(const SBValueList &rhs) {
107 if (this != &rhs) {
108 if (rhs.IsValid())
109 m_opaque_ap.reset(new ValueListImpl(*rhs));
110 else
111 m_opaque_ap.reset();
112 }
113 return *this;
114 }
115
operator ->()116 ValueListImpl *SBValueList::operator->() { return m_opaque_ap.get(); }
117
operator *()118 ValueListImpl &SBValueList::operator*() { return *m_opaque_ap; }
119
operator ->() const120 const ValueListImpl *SBValueList::operator->() const {
121 return m_opaque_ap.get();
122 }
123
operator *() const124 const ValueListImpl &SBValueList::operator*() const { return *m_opaque_ap; }
125
Append(const SBValue & val_obj)126 void SBValueList::Append(const SBValue &val_obj) {
127 CreateIfNeeded();
128 m_opaque_ap->Append(val_obj);
129 }
130
Append(lldb::ValueObjectSP & val_obj_sp)131 void SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
132 if (val_obj_sp) {
133 CreateIfNeeded();
134 m_opaque_ap->Append(SBValue(val_obj_sp));
135 }
136 }
137
Append(const lldb::SBValueList & value_list)138 void SBValueList::Append(const lldb::SBValueList &value_list) {
139 if (value_list.IsValid()) {
140 CreateIfNeeded();
141 m_opaque_ap->Append(*value_list);
142 }
143 }
144
GetValueAtIndex(uint32_t idx) const145 SBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
146 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
147
148 // if (log)
149 // log->Printf ("SBValueList::GetValueAtIndex (uint32_t idx) idx = %d",
150 // idx);
151
152 SBValue sb_value;
153 if (m_opaque_ap)
154 sb_value = m_opaque_ap->GetValueAtIndex(idx);
155
156 if (log) {
157 SBStream sstr;
158 sb_value.GetDescription(sstr);
159 log->Printf("SBValueList::GetValueAtIndex (this.ap=%p, idx=%d) => SBValue "
160 "(this.sp = %p, '%s')",
161 static_cast<void *>(m_opaque_ap.get()), idx,
162 static_cast<void *>(sb_value.GetSP().get()), sstr.GetData());
163 }
164
165 return sb_value;
166 }
167
GetSize() const168 uint32_t SBValueList::GetSize() const {
169 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
170
171 // if (log)
172 // log->Printf ("SBValueList::GetSize ()");
173
174 uint32_t size = 0;
175 if (m_opaque_ap)
176 size = m_opaque_ap->GetSize();
177
178 if (log)
179 log->Printf("SBValueList::GetSize (this.ap=%p) => %d",
180 static_cast<void *>(m_opaque_ap.get()), size);
181
182 return size;
183 }
184
CreateIfNeeded()185 void SBValueList::CreateIfNeeded() {
186 if (m_opaque_ap == NULL)
187 m_opaque_ap.reset(new ValueListImpl());
188 }
189
FindValueObjectByUID(lldb::user_id_t uid)190 SBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {
191 SBValue sb_value;
192 if (m_opaque_ap)
193 sb_value = m_opaque_ap->FindValueByUID(uid);
194 return sb_value;
195 }
196
GetFirstValueByName(const char * name) const197 SBValue SBValueList::GetFirstValueByName(const char *name) const {
198 SBValue sb_value;
199 if (m_opaque_ap)
200 sb_value = m_opaque_ap->GetFirstValueByName(name);
201 return sb_value;
202 }
203
opaque_ptr()204 void *SBValueList::opaque_ptr() { return m_opaque_ap.get(); }
205
ref()206 ValueListImpl &SBValueList::ref() {
207 CreateIfNeeded();
208 return *m_opaque_ap;
209 }
210