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#include <utility>
26
27using namespace lldb;
28using namespace lldb_private;
29
32
35
39
42 // After the copy-and-swap, `copy` holds the previous state of `this`.
43 // `copy` will be destroyed when it goes out of scope.
45 std::swap(this->m_ptr, copy.m_ptr);
46 std::swap(this->m_owned, copy.m_owned);
47 return *this;
48}
49
54
59
64
70
73 LLDB_INSTRUMENT_VA(this, rhs);
74
75 if (this != &rhs)
77 return *this;
78}
79
81
84 return this->operator bool();
85}
86SBCommandReturnObject::operator bool() const {
88
89 // This method is not useful but it needs to stay to keep SB API stable.
90 return true;
91}
92
95
96 ConstString output(ref().GetCommand());
97 return output.AsCString(/*value_if_empty*/ "");
98}
99
101 LLDB_INSTRUMENT_VA(this);
102
103 ConstString output(ref().GetOutputString());
104 return output.AsCString(/*value_if_empty*/ "");
105}
106
108 LLDB_INSTRUMENT_VA(this);
109
110 ConstString output(ref().GetErrorString());
111 return output.AsCString(/*value_if_empty*/ "");
112}
113
115 LLDB_INSTRUMENT_VA(this);
116
118 SBStructuredData sb_data;
119 sb_data.m_impl_up->SetObjectSP(data);
120 return sb_data;
121}
122
124 LLDB_INSTRUMENT_VA(this);
125
126 return ref().GetOutputString().size();
127}
128
130 LLDB_INSTRUMENT_VA(this);
131
132 return ref().GetErrorString().size();
133}
134
135size_t SBCommandReturnObject::PutOutput(FILE *fh) {
136 LLDB_INSTRUMENT_VA(this, fh);
137 if (fh) {
138 size_t num_bytes = GetOutputSize();
139 if (num_bytes)
140 return ::fprintf(fh, "%s", GetOutput());
141 }
142 return 0;
143}
144
146 LLDB_INSTRUMENT_VA(this, file_sp);
147 if (!file_sp)
148 return 0;
149 return file_sp->Printf("%s", GetOutput());
150}
151
153 LLDB_INSTRUMENT_VA(this, file);
154 if (!file.m_opaque_sp)
155 return 0;
156 return file.m_opaque_sp->Printf("%s", GetOutput());
157}
158
159size_t SBCommandReturnObject::PutError(FILE *fh) {
160 LLDB_INSTRUMENT_VA(this, fh);
161 if (fh) {
162 size_t num_bytes = GetErrorSize();
163 if (num_bytes)
164 return ::fprintf(fh, "%s", GetError());
165 }
166 return 0;
167}
168
170 LLDB_INSTRUMENT_VA(this, file_sp);
171 if (!file_sp)
172 return 0;
173 return file_sp->Printf("%s", GetError());
174}
175
177 LLDB_INSTRUMENT_VA(this, file);
178 if (!file.m_opaque_sp)
179 return 0;
180 return file.m_opaque_sp->Printf("%s", GetError());
181}
182
184 LLDB_INSTRUMENT_VA(this);
185
186 ref().Clear();
187}
188
194
196 LLDB_INSTRUMENT_VA(this, status);
197
198 ref().SetStatus(status);
199}
200
202 LLDB_INSTRUMENT_VA(this);
203
204 return ref().Succeeded();
205}
206
208 LLDB_INSTRUMENT_VA(this);
209
210 return ref().HasResult();
211}
212
213void SBCommandReturnObject::AppendMessage(const char *message) {
214 LLDB_INSTRUMENT_VA(this, message);
215
216 ref().AppendMessage(message);
217}
218
219void SBCommandReturnObject::AppendWarning(const char *message) {
220 LLDB_INSTRUMENT_VA(this, message);
221
222 ref().AppendWarning(message);
223}
224
228
232
236
240
242 LLDB_INSTRUMENT_VA(this, description);
243
244 Stream &strm = description.ref();
245
246 description.Printf("Error: ");
247 lldb::ReturnStatus status = ref().GetStatus();
248 if (status == lldb::eReturnStatusStarted)
249 strm.PutCString("Started");
250 else if (status == lldb::eReturnStatusInvalid)
251 strm.PutCString("Invalid");
252 else if (ref().Succeeded())
253 strm.PutCString("Success");
254 else
255 strm.PutCString("Fail");
256
257 if (GetOutputSize() > 0)
258 strm.Printf("\nOutput Message:\n%s", GetOutput());
259
260 if (GetErrorSize() > 0)
261 strm.Printf("\nError Message:\n%s", GetError());
262
263 return true;
264}
265
267 LLDB_INSTRUMENT_VA(this, fh);
268
269 SetImmediateOutputFile(fh, false);
270}
271
273 LLDB_INSTRUMENT_VA(this, fh);
274
275 SetImmediateErrorFile(fh, false);
276}
277
279 bool transfer_ownership) {
281 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
284}
285
287 bool transfer_ownership) {
289 FileSP file = std::make_shared<NativeFile>(fh, File::eOpenOptionWriteOnly,
292}
293
298
303
308
313
314void SBCommandReturnObject::PutCString(const char *string, int len) {
315 LLDB_INSTRUMENT_VA(this, string, len);
316
317 if (len == 0 || string == nullptr || *string == 0) {
318 return;
319 } else if (len > 0) {
320 const llvm::StringRef buffer(string, static_cast<size_t>(len));
321 ref().AppendMessage(buffer);
322 } else
323 ref().AppendMessage(string);
324}
325
326const char *SBCommandReturnObject::GetOutput(bool only_if_no_immediate) {
327 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
328
329 if (!only_if_no_immediate ||
330 ref().GetImmediateOutputStream().get() == nullptr)
331 return GetOutput();
332 return nullptr;
333}
334
335const char *SBCommandReturnObject::GetError(bool only_if_no_immediate) {
336 LLDB_INSTRUMENT_VA(this, only_if_no_immediate);
337
338 if (!only_if_no_immediate || ref().GetImmediateErrorStream().get() == nullptr)
339 return GetError();
340 return nullptr;
341}
342
343size_t SBCommandReturnObject::Printf(const char *format, ...) {
344 va_list args;
345 va_start(args, format);
346 size_t result = ref().GetOutputStream().PrintfVarArg(format, args);
347 va_end(args);
348 return result;
349}
350
352 const char *fallback_error_cstr) {
353 LLDB_INSTRUMENT_VA(this, error, fallback_error_cstr);
354
355 if (error.IsValid() && !error.Fail())
356 ref().SetError(error.ref().Clone());
357 else if (fallback_error_cstr)
358 ref().SetError(Status::FromErrorString(fallback_error_cstr));
359}
360
361void SBCommandReturnObject::SetError(const char *error_cstr) {
362 LLDB_INSTRUMENT_VA(this, error_cstr);
363
364 if (error_cstr)
365 ref().AppendError(error_cstr);
366}
367
370 LLDB_INSTRUMENT_VA(this, use_dynamic);
371
372 SBValueList value_list;
373 for (ValueObjectSP value_object_sp :
374 ref().GetValueObjectList().GetObjects()) {
375 SBValue value_sb;
376 value_sb.SetSP(value_object_sp, use_dynamic);
377 value_list.Append(value_sb);
378 }
379
380 return value_list;
381}
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:64
lldb_private::Stream & ref()
Definition SBStream.cpp:179
StructuredDataImplUP m_impl_up
void Append(const lldb::SBValue &val_obj)
void SetSP(const lldb::ValueObjectSP &sp)
Definition SBValue.cpp:1067
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:75
ReturnStatus
Command Return Status Types.
@ eReturnStatusStarted
@ eReturnStatusInvalid
std::shared_ptr< lldb_private::File > FileSP