LLDB mainline
SBCommandReturnObject.cpp
Go to the documentation of this file.
1//===-- SBCommandReturnObject.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#include "Utils.h"
11#include "lldb/API/SBError.h"
12#include "lldb/API/SBFile.h"
13#include "lldb/API/SBStream.h"
15#include "lldb/API/SBValue.h"
18#include "lldb/Host/File.h"
22#include "lldb/Utility/Status.h"
23#include "lldb/lldb-forward.h"
24
25using namespace lldb;
26using namespace lldb_private;
27
29public:
37 std::swap(*this, copy);
38 return *this;
39 }
40 // rvalue ctor+assignment are not used by SBCommandReturnObject.
42 if (m_owned)
43 delete m_ptr;
44 }
45
46 CommandReturnObject &operator*() const { return *m_ptr; }
47
48private:
50 bool m_owned = true;
51};
52
57
62
68
71 LLDB_INSTRUMENT_VA(this, rhs);
72
73 if (this != &rhs)
75 return *this;
76}
77
79
82 return this->operator bool();
83}
84SBCommandReturnObject::operator bool() const {
86
87 // This method is not useful but it needs to stay to keep SB API stable.
88 return true;
89}
90
93
94 ConstString output(ref().GetCommand());
95 return output.AsCString(/*value_if_empty*/ "");
96}
97
100
101 ConstString output(ref().GetOutputString());
102 return output.AsCString(/*value_if_empty*/ "");
103}
104
106 LLDB_INSTRUMENT_VA(this);
107
108 ConstString output(ref().GetErrorString());
109 return output.AsCString(/*value_if_empty*/ "");
110}
111
113 LLDB_INSTRUMENT_VA(this);
114
116 SBStructuredData sb_data;
117 sb_data.m_impl_up->SetObjectSP(data);
118 return sb_data;
119}
120
122 LLDB_INSTRUMENT_VA(this);
123
124 return ref().GetOutputString().size();
125}
126
128 LLDB_INSTRUMENT_VA(this);
129
130 return ref().GetErrorString().size();
131}
132
133size_t SBCommandReturnObject::PutOutput(FILE *fh) {
134 LLDB_INSTRUMENT_VA(this, fh);
135 if (fh) {
136 size_t num_bytes = GetOutputSize();
137 if (num_bytes)
138 return ::fprintf(fh, "%s", GetOutput());
139 }
140 return 0;
141}
142
144 LLDB_INSTRUMENT_VA(this, file_sp);
145 if (!file_sp)
146 return 0;
147 return file_sp->Printf("%s", GetOutput());
148}
149
151 LLDB_INSTRUMENT_VA(this, file);
152 if (!file.m_opaque_sp)
153 return 0;
154 return file.m_opaque_sp->Printf("%s", GetOutput());
155}
156
157size_t SBCommandReturnObject::PutError(FILE *fh) {
158 LLDB_INSTRUMENT_VA(this, fh);
159 if (fh) {
160 size_t num_bytes = GetErrorSize();
161 if (num_bytes)
162 return ::fprintf(fh, "%s", GetError());
163 }
164 return 0;
165}
166
168 LLDB_INSTRUMENT_VA(this, file_sp);
169 if (!file_sp)
170 return 0;
171 return file_sp->Printf("%s", GetError());
172}
173
175 LLDB_INSTRUMENT_VA(this, file);
176 if (!file.m_opaque_sp)
177 return 0;
178 return file.m_opaque_sp->Printf("%s", GetError());
179}
180
182 LLDB_INSTRUMENT_VA(this);
183
184 ref().Clear();
185}
186
192
194 LLDB_INSTRUMENT_VA(this, status);
195
196 ref().SetStatus(status);
197}
198
200 LLDB_INSTRUMENT_VA(this);
201
202 return ref().Succeeded();
203}
204
206 LLDB_INSTRUMENT_VA(this);
207
208 return ref().HasResult();
209}
210
211void SBCommandReturnObject::AppendMessage(const char *message) {
212 LLDB_INSTRUMENT_VA(this, message);
213
214 ref().AppendMessage(message);
215}
216
217void SBCommandReturnObject::AppendWarning(const char *message) {
218 LLDB_INSTRUMENT_VA(this, message);
219
220 ref().AppendWarning(message);
221}
222
226
230
234
238
240 LLDB_INSTRUMENT_VA(this, description);
241
242 Stream &strm = description.ref();
243
244 description.Printf("Error: ");
245 lldb::ReturnStatus status = ref().GetStatus();
246 if (status == lldb::eReturnStatusStarted)
247 strm.PutCString("Started");
248 else if (status == lldb::eReturnStatusInvalid)
249 strm.PutCString("Invalid");
250 else if (ref().Succeeded())
251 strm.PutCString("Success");
252 else
253 strm.PutCString("Fail");
254
255 if (GetOutputSize() > 0)
256 strm.Printf("\nOutput Message:\n%s", GetOutput());
257
258 if (GetErrorSize() > 0)
259 strm.Printf("\nError Message:\n%s", GetError());
260
261 return true;
262}
263
265 LLDB_INSTRUMENT_VA(this, fh);
266
267 SetImmediateOutputFile(fh, false);
268}
269
271 LLDB_INSTRUMENT_VA(this, fh);
272
273 SetImmediateErrorFile(fh, false);
274}
275
277 bool transfer_ownership) {
279 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
282}
283
285 bool transfer_ownership) {
287 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
290}
291
296
301
306
311
312void SBCommandReturnObject::PutCString(const char *string, int len) {
313 LLDB_INSTRUMENT_VA(this, string, len);
314
315 if (len == 0 || string == nullptr || *string == 0) {
316 return;
317 } else if (len > 0) {
318 std::string buffer(string, len);
319 ref().AppendMessage(buffer.c_str());
320 } else
321 ref().AppendMessage(string);
322}
323
324const char *SBCommandReturnObject::GetOutput(bool only_if_no_immediate) {
325 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
326
327 if (!only_if_no_immediate ||
328 ref().GetImmediateOutputStream().get() == nullptr)
329 return GetOutput();
330 return nullptr;
331}
332
333const char *SBCommandReturnObject::GetError(bool only_if_no_immediate) {
334 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
335
336 if (!only_if_no_immediate || ref().GetImmediateErrorStream().get() == nullptr)
337 return GetError();
338 return nullptr;
339}
340
341size_t SBCommandReturnObject::Printf(const char *format, ...) {
342 va_list args;
343 va_start(args, format);
344 size_t result = ref().GetOutputStream().PrintfVarArg(format, args);
345 va_end(args);
346 return result;
347}
348
350 const char *fallback_error_cstr) {
351 LLDB_INSTRUMENT_VA(this, error, fallback_error_cstr);
352
353 if (error.IsValid() && !error.Fail())
354 ref().SetError(error.ref().Clone());
355 else if (fallback_error_cstr)
356 ref().SetError(Status::FromErrorString(fallback_error_cstr));
357}
358
359void SBCommandReturnObject::SetError(const char *error_cstr) {
360 LLDB_INSTRUMENT_VA(this, error_cstr);
361
362 if (error_cstr)
363 ref().AppendError(error_cstr);
364}
365
368 LLDB_INSTRUMENT_VA(this, use_dynamic);
369
370 SBValueList value_list;
371 for (ValueObjectSP value_object_sp :
372 ref().GetValueObjectList().GetObjects()) {
373 SBValue value_sb;
374 value_sb.SetSP(value_object_sp, use_dynamic);
375 value_list.Append(value_sb);
376 }
377
378 return value_list;
379}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_INSTRUMENT_VA(...)
lldb_private::CommandReturnObject * get() const
lldb_private::CommandReturnObject & operator*() const
void SetStatus(lldb::ReturnStatus status)
bool GetDescription(lldb::SBStream &description)
lldb_private::CommandReturnObject * operator->() const
lldb::SBCommandReturnObject & operator=(const lldb::SBCommandReturnObject &rhs)
void SetError(lldb::SBError &error, const char *fallback_error_cstr=nullptr)
void AppendMessage(const char *message)
lldb_private::CommandReturnObject & ref() const
lldb::SBValueList GetValues(lldb::DynamicValueType use_dynamic)
const char * GetCommand()
Get the command as the user typed it.
void AppendWarning(const char *message)
void PutCString(const char *string, int len=-1)
std::unique_ptr< lldb_private::SBCommandReturnObjectImpl > m_opaque_up
FileSP m_opaque_sp
Definition SBFile.h:54
lldb_private::Stream & ref()
Definition SBStream.cpp:178
StructuredDataImplUP m_impl_up
void Append(const lldb::SBValue &val_obj)
void SetSP(const lldb::ValueObjectSP &sp)
Definition SBValue.cpp:1116
void AppendMessage(llvm::StringRef in_string)
void SetImmediateErrorFile(lldb::FileSP file_sp)
void void AppendError(llvm::StringRef in_string)
std::string GetErrorString(bool with_diagnostics=true) const
Return the errors as a string.
llvm::StringRef GetOutputString() const
void SetStatus(lldb::ReturnStatus status)
void SetImmediateOutputFile(lldb::FileSP file_sp)
void void AppendWarning(llvm::StringRef in_string)
A uniqued constant string class.
Definition ConstString.h:40
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
@ eOpenOptionWriteOnly
Definition File.h:52
SBCommandReturnObjectImpl(const SBCommandReturnObjectImpl &rhs)
SBCommandReturnObjectImpl & operator=(const SBCommandReturnObjectImpl &rhs)
static Status FromErrorString(const char *str)
Definition Status.h:141
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition Stream.cpp:65
size_t size_t PrintfVarArg(const char *format, va_list args)
Definition Stream.cpp:143
std::shared_ptr< Object > ObjectSP
A class that represents a running process on the host machine.
std::unique_ptr< T > clone(const std::unique_ptr< T > &src)
Definition Utils.h:17
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
class LLDB_API SBFile
Definition SBDefines.h:74
ReturnStatus
Command Return Status Types.
@ eReturnStatusStarted
@ eReturnStatusInvalid
std::shared_ptr< lldb_private::File > FileSP