LLDB mainline
SBStructuredData.cpp
Go to the documentation of this file.
1//===-- SBStructuredData.cpp ----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "lldb/API/SBDebugger.h"
13#include "lldb/API/SBStream.h"
15#include "lldb/Core/Debugger.h"
19#include "lldb/Utility/Event.h"
21#include "lldb/Utility/Status.h"
22#include "lldb/Utility/Stream.h"
25
26using namespace lldb;
27using namespace lldb_private;
28
29#pragma mark--
30#pragma mark SBStructuredData
31
35
40
42 const lldb::SBDebugger &debugger) {
43 LLDB_INSTRUMENT_VA(this, obj, debugger);
44
45 if (!obj.IsValid())
46 return;
47
48 ScriptInterpreter *interpreter =
49 debugger.m_opaque_sp->GetScriptInterpreter(true, obj.GetLanguage());
50
51 if (!interpreter)
52 return;
53
54 StructuredDataImplUP impl_up = std::make_unique<StructuredDataImpl>(
55 interpreter->CreateStructuredDataFromScriptObject(obj.ref()));
56 if (impl_up && impl_up->IsValid())
57 m_impl_up.reset(impl_up.release());
58}
59
61 : m_impl_up(new StructuredDataImpl(event_sp)) {
62 LLDB_INSTRUMENT_VA(this, event_sp);
63}
64
69
71
74 LLDB_INSTRUMENT_VA(this, rhs);
75
76 *m_impl_up = *rhs.m_impl_up;
77 return *this;
78}
79
81 LLDB_INSTRUMENT_VA(this, stream);
82
84
87 m_impl_up->SetObjectSP(json_obj);
88
89 static constexpr StructuredDataType unsupported_type[] = {
92 };
93
94 if (!json_obj || llvm::is_contained(unsupported_type, json_obj->GetType()))
95 error = Status::FromErrorString("Invalid Syntax");
96 return error;
97}
98
100 LLDB_INSTRUMENT_VA(this, json);
102 s.Print(json);
103 return SetFromJSON(s);
104}
105
107 LLDB_INSTRUMENT_VA(this);
108 return this->operator bool();
109}
110
111SBStructuredData::operator bool() const {
112 LLDB_INSTRUMENT_VA(this);
113
114 return m_impl_up->IsValid();
115}
116
118 LLDB_INSTRUMENT_VA(this);
119
120 m_impl_up->Clear();
121}
122
124 LLDB_INSTRUMENT_VA(this, stream);
125
127 error.SetError(m_impl_up->GetAsJSON(stream.ref()));
128 return error;
129}
130
132 LLDB_INSTRUMENT_VA(this, stream);
133
134 Status error = m_impl_up->GetDescription(stream.ref());
135 SBError sb_error;
136 sb_error.SetError(std::move(error));
137 return sb_error;
138}
139
141 LLDB_INSTRUMENT_VA(this);
142
143 return m_impl_up->GetType();
144}
145
147 LLDB_INSTRUMENT_VA(this);
148
149 return m_impl_up->GetSize();
150}
151
153 LLDB_INSTRUMENT_VA(this, keys);
154
156 return false;
157
158 StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP();
159 if (!obj_sp)
160 return false;
161
163 // We claimed we were a dictionary, so this can't be null.
164 assert(dict);
165 // The return kind of GetKeys is an Array:
166 StructuredData::ObjectSP array_sp = dict->GetKeys();
167 StructuredData::Array *key_arr = array_sp->GetAsArray();
168 assert(key_arr);
169
170 key_arr->ForEach([&keys](StructuredData::Object *object) -> bool {
171 llvm::StringRef key = object->GetStringValue("");
172 keys->AppendString(key);
173 return true;
174 });
175 return true;
176}
177
179 LLDB_INSTRUMENT_VA(this, key);
180
181 SBStructuredData result;
182 result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key));
183 return result;
184}
185
187 LLDB_INSTRUMENT_VA(this, idx);
188
189 SBStructuredData result;
190 result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx));
191 return result;
192}
193
194uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const {
195 LLDB_INSTRUMENT_VA(this, fail_value);
196
197 return GetUnsignedIntegerValue(fail_value);
198}
199
200uint64_t SBStructuredData::GetUnsignedIntegerValue(uint64_t fail_value) const {
201 LLDB_INSTRUMENT_VA(this, fail_value);
202
203 return m_impl_up->GetIntegerValue(fail_value);
204}
205
206int64_t SBStructuredData::GetSignedIntegerValue(int64_t fail_value) const {
207 LLDB_INSTRUMENT_VA(this, fail_value);
208
209 return m_impl_up->GetIntegerValue(fail_value);
210}
211
212double SBStructuredData::GetFloatValue(double fail_value) const {
213 LLDB_INSTRUMENT_VA(this, fail_value);
214
215 return m_impl_up->GetFloatValue(fail_value);
216}
217
218bool SBStructuredData::GetBooleanValue(bool fail_value) const {
219 LLDB_INSTRUMENT_VA(this, fail_value);
220
221 return m_impl_up->GetBooleanValue(fail_value);
222}
223
224size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const {
225 LLDB_INSTRUMENT_VA(this, dst, dst_len);
226
227 return m_impl_up->GetStringValue(dst, dst_len);
228}
229
235
237 SBStructuredData &value) {
238 LLDB_INSTRUMENT_VA(this, key, value);
239
240 if (StructuredData::ObjectSP obj_sp = value.m_impl_up->GetObjectSP())
241 m_impl_up->SetValueForKey(key, obj_sp);
242}
243
245 LLDB_INSTRUMENT_VA(this, value);
246
247 m_impl_up->SetUnsignedIntegerValue(value);
248}
249
251 LLDB_INSTRUMENT_VA(this, value);
252
253 m_impl_up->SetSignedIntegerValue(value);
254}
255
257 LLDB_INSTRUMENT_VA(this, value);
258
259 m_impl_up->SetFloatValue(value);
260}
261
263 LLDB_INSTRUMENT_VA(this, value);
264
265 m_impl_up->SetBooleanValue(value);
266}
267
268void SBStructuredData::SetStringValue(const char *value) {
269 LLDB_INSTRUMENT_VA(this, value);
270
271 m_impl_up->SetStringValue(value);
272}
273
275 LLDB_INSTRUMENT_VA(this, value);
276
277 m_impl_up->SetGenericValue(value.GetPointer());
278}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_INSTRUMENT_VA(...)
lldb::DebuggerSP m_opaque_sp
Definition SBDebugger.h:694
void SetError(uint32_t err, lldb::ErrorType type)
Definition SBError.cpp:124
lldb::ScriptLanguage GetLanguage() const
lldb::ScriptObjectPtr GetPointer() const
lldb_private::ScriptObject & ref()
void Print(const char *str)
Definition SBStream.cpp:65
lldb_private::Stream & ref()
Definition SBStream.cpp:177
const char * GetData()
Definition SBStream.cpp:44
void SetStringValue(const char *value)
Change the type to string and overwrite the previous data with the new value.
lldb::SBStructuredData GetItemAtIndex(size_t idx) const
Return the value corresponding to an index if this data structure is array.
lldb::SBStructuredData & operator=(const lldb::SBStructuredData &rhs)
int64_t GetSignedIntegerValue(int64_t fail_value=0) const
Return the integer value if this data structure is an integer type.
void SetGenericValue(SBScriptObject value)
Change the type to generic and overwrite the previous data with the new value.
lldb::SBError GetDescription(lldb::SBStream &stream) const
void SetBooleanValue(bool value)
Change the type to boolean and overwrite the previous data with the new value.
size_t GetStringValue(char *dst, size_t dst_len) const
Provides the string value if this data structure is a string type.
lldb::SBScriptObject GetGenericValue() const
Return the generic pointer if this data structure is a generic type.
bool GetBooleanValue(bool fail_value=false) const
Return the boolean value if this data structure is a boolean type.
StructuredDataImplUP m_impl_up
void SetUnsignedIntegerValue(uint64_t value)
Change the type to unsigned interger and overwrite the previous data with the new value.
lldb::StructuredDataType GetType() const
Return the type of data in this data structure.
uint64_t GetUnsignedIntegerValue(uint64_t fail_value=0) const
Return the integer value if this data structure is an integer type.
void SetSignedIntegerValue(int64_t value)
Change the type to signed interger and overwrite the previous data with the new value.
size_t GetSize() const
Return the size (i.e.
bool GetKeys(lldb::SBStringList &keys) const
Fill keys with the keys in this object and return true if this data structure is a dictionary.
lldb::SBError GetAsJSON(lldb::SBStream &stream) const
void SetFloatValue(double value)
Change the type to float and overwrite the previous data with the new value.
lldb::SBStructuredData GetValueForKey(const char *key) const
Return the value corresponding to a key if this data structure is a dictionary type.
lldb::SBError SetFromJSON(lldb::SBStream &stream)
double GetFloatValue(double fail_value=0.0) const
Return the floating point value if this data structure is a floating type.
void SetValueForKey(const char *key, SBStructuredData &value)
Set the value corresponding to a key.
virtual StructuredData::ObjectSP CreateStructuredDataFromScriptObject(ScriptObject obj)
An error handling class.
Definition Status.h:118
static Status FromErrorString(const char *str)
Definition Status.h:141
void AppendString(const std::string &s)
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
A class that represents a running process on the host machine.
@ eScriptLanguageDefault
std::shared_ptr< lldb_private::Event > EventSP
std::unique_ptr< lldb_private::StructuredDataImpl > StructuredDataImplUP
@ eStructuredDataTypeDictionary
@ eStructuredDataTypeInvalid
@ eStructuredDataTypeGeneric