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
11#include "Utils.h"
12#include "lldb/API/SBError.h"
13#include "lldb/API/SBFile.h"
14#include "lldb/API/SBStream.h"
16#include "lldb/API/SBValue.h"
19#include "lldb/Host/File.h"
23#include "lldb/Utility/Status.h"
24#include "lldb/lldb-forward.h"
25
26using namespace lldb;
27using namespace lldb_private;
28
31
34
38
42 std::swap(*this, copy);
43 return *this;
44}
45
50
55
60
66
69 LLDB_INSTRUMENT_VA(this, rhs);
70
71 if (this != &rhs)
73 return *this;
74}
75
77
80 return this->operator bool();
81}
82SBCommandReturnObject::operator bool() const {
84
85 // This method is not useful but it needs to stay to keep SB API stable.
86 return true;
87}
88
91
92 ConstString output(ref().GetCommand());
93 return output.AsCString(/*value_if_empty*/ "");
94}
95
98
99 ConstString output(ref().GetOutputString());
100 return output.AsCString(/*value_if_empty*/ "");
101}
102
104 LLDB_INSTRUMENT_VA(this);
105
106 ConstString output(ref().GetErrorString());
107 return output.AsCString(/*value_if_empty*/ "");
108}
109
111 LLDB_INSTRUMENT_VA(this);
112
114 SBStructuredData sb_data;
115 sb_data.m_impl_up->SetObjectSP(data);
116 return sb_data;
117}
118
120 LLDB_INSTRUMENT_VA(this);
121
122 return ref().GetOutputString().size();
123}
124
126 LLDB_INSTRUMENT_VA(this);
127
128 return ref().GetErrorString().size();
129}
130
131size_t SBCommandReturnObject::PutOutput(FILE *fh) {
132 LLDB_INSTRUMENT_VA(this, fh);
133 if (fh) {
134 size_t num_bytes = GetOutputSize();
135 if (num_bytes)
136 return ::fprintf(fh, "%s", GetOutput());
137 }
138 return 0;
139}
140
142 LLDB_INSTRUMENT_VA(this, file_sp);
143 if (!file_sp)
144 return 0;
145 return file_sp->Printf("%s", GetOutput());
146}
147
149 LLDB_INSTRUMENT_VA(this, file);
150 if (!file.m_opaque_sp)
151 return 0;
152 return file.m_opaque_sp->Printf("%s", GetOutput());
153}
154
155size_t SBCommandReturnObject::PutError(FILE *fh) {
156 LLDB_INSTRUMENT_VA(this, fh);
157 if (fh) {
158 size_t num_bytes = GetErrorSize();
159 if (num_bytes)
160 return ::fprintf(fh, "%s", GetError());
161 }
162 return 0;
163}
164
166 LLDB_INSTRUMENT_VA(this, file_sp);
167 if (!file_sp)
168 return 0;
169 return file_sp->Printf("%s", GetError());
170}
171
173 LLDB_INSTRUMENT_VA(this, file);
174 if (!file.m_opaque_sp)
175 return 0;
176 return file.m_opaque_sp->Printf("%s", GetError());
177}
178
180 LLDB_INSTRUMENT_VA(this);
181
182 ref().Clear();
183}
184
190
192 LLDB_INSTRUMENT_VA(this, status);
193
194 ref().SetStatus(status);
195}
196
198 LLDB_INSTRUMENT_VA(this);
199
200 return ref().Succeeded();
201}
202
204 LLDB_INSTRUMENT_VA(this);
205
206 return ref().HasResult();
207}
208
209void SBCommandReturnObject::AppendMessage(const char *message) {
210 LLDB_INSTRUMENT_VA(this, message);
211
212 ref().AppendMessage(message);
213}
214
215void SBCommandReturnObject::AppendWarning(const char *message) {
216 LLDB_INSTRUMENT_VA(this, message);
217
218 ref().AppendWarning(message);
219}
220
224
228
232
236
238 LLDB_INSTRUMENT_VA(this, description);
239
240 Stream &strm = description.ref();
241
242 description.Printf("Error: ");
243 lldb::ReturnStatus status = ref().GetStatus();
244 if (status == lldb::eReturnStatusStarted)
245 strm.PutCString("Started");
246 else if (status == lldb::eReturnStatusInvalid)
247 strm.PutCString("Invalid");
248 else if (ref().Succeeded())
249 strm.PutCString("Success");
250 else
251 strm.PutCString("Fail");
252
253 if (GetOutputSize() > 0)
254 strm.Printf("\nOutput Message:\n%s", GetOutput());
255
256 if (GetErrorSize() > 0)
257 strm.Printf("\nError Message:\n%s", GetError());
258
259 return true;
260}
261
263 LLDB_INSTRUMENT_VA(this, fh);
264
265 SetImmediateOutputFile(fh, false);
266}
267
269 LLDB_INSTRUMENT_VA(this, fh);
270
271 SetImmediateErrorFile(fh, false);
272}
273
275 bool transfer_ownership) {
277 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
280}
281
283 bool transfer_ownership) {
285 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
288}
289
294
299
304
309
310void SBCommandReturnObject::PutCString(const char *string, int len) {
311 LLDB_INSTRUMENT_VA(this, string, len);
312
313 if (len == 0 || string == nullptr || *string == 0) {
314 return;
315 } else if (len > 0) {
316 const llvm::StringRef buffer(string, static_cast<size_t>(len));
317 ref().AppendMessage(buffer);
318 } else
319 ref().AppendMessage(string);
320}
321
322const char *SBCommandReturnObject::GetOutput(bool only_if_no_immediate) {
323 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
324
325 if (!only_if_no_immediate ||
326 ref().GetImmediateOutputStream().get() == nullptr)
327 return GetOutput();
328 return nullptr;
329}
330
331const char *SBCommandReturnObject::GetError(bool only_if_no_immediate) {
332 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
333
334 if (!only_if_no_immediate || ref().GetImmediateErrorStream().get() == nullptr)
335 return GetError();
336 return nullptr;
337}
338
339size_t SBCommandReturnObject::Printf(const char *format, ...) {
340 va_list args;
341 va_start(args, format);
342 size_t result = ref().GetOutputStream().PrintfVarArg(format, args);
343 va_end(args);
344 return result;
345}
346
348 const char *fallback_error_cstr) {
349 LLDB_INSTRUMENT_VA(this, error, fallback_error_cstr);
350
351 if (error.IsValid() && !error.Fail())
352 ref().SetError(error.ref().Clone());
353 else if (fallback_error_cstr)
354 ref().SetError(Status::FromErrorString(fallback_error_cstr));
355}
356
357void SBCommandReturnObject::SetError(const char *error_cstr) {
358 LLDB_INSTRUMENT_VA(this, error_cstr);
359
360 if (error_cstr)
361 ref().AppendError(error_cstr);
362}
363
366 LLDB_INSTRUMENT_VA(this, use_dynamic);
367
368 SBValueList value_list;
369 for (ValueObjectSP value_object_sp :
370 ref().GetValueObjectList().GetObjects()) {
371 SBValue value_sb;
372 value_sb.SetSP(value_object_sp, use_dynamic);
373 value_list.Append(value_sb);
374 }
375
376 return value_list;
377}
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:1020
void AppendMessage(llvm::StringRef in_string)
void SetImmediateErrorFile(lldb::FileSP file_sp)
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 AppendWarning(llvm::StringRef in_string)
A uniqued constant string class.
Definition ConstString.h:40
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
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:63
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