15ffd83dbSDimitry Andric //===-- SBError.cpp -------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "lldb/API/SBError.h"
100b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
110b57cec5SDimitry Andric #include "Utils.h"
120b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
130b57cec5SDimitry Andric #include "lldb/Utility/Status.h"
140b57cec5SDimitry Andric
15*5f7ddb14SDimitry Andric #include <cstdarg>
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric using namespace lldb;
180b57cec5SDimitry Andric using namespace lldb_private;
190b57cec5SDimitry Andric
SBError()200b57cec5SDimitry Andric SBError::SBError() : m_opaque_up() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBError); }
210b57cec5SDimitry Andric
SBError(const SBError & rhs)220b57cec5SDimitry Andric SBError::SBError(const SBError &rhs) : m_opaque_up() {
230b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBError, (const lldb::SBError &), rhs);
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric
285ffd83dbSDimitry Andric SBError::~SBError() = default;
290b57cec5SDimitry Andric
operator =(const SBError & rhs)300b57cec5SDimitry Andric const SBError &SBError::operator=(const SBError &rhs) {
310b57cec5SDimitry Andric LLDB_RECORD_METHOD(const lldb::SBError &,
320b57cec5SDimitry Andric SBError, operator=,(const lldb::SBError &), rhs);
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric if (this != &rhs)
350b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
360b57cec5SDimitry Andric return LLDB_RECORD_RESULT(*this);
370b57cec5SDimitry Andric }
380b57cec5SDimitry Andric
GetCString() const390b57cec5SDimitry Andric const char *SBError::GetCString() const {
400b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBError, GetCString);
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric if (m_opaque_up)
430b57cec5SDimitry Andric return m_opaque_up->AsCString();
440b57cec5SDimitry Andric return nullptr;
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric
Clear()470b57cec5SDimitry Andric void SBError::Clear() {
480b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBError, Clear);
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric if (m_opaque_up)
510b57cec5SDimitry Andric m_opaque_up->Clear();
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric
Fail() const540b57cec5SDimitry Andric bool SBError::Fail() const {
550b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Fail);
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric bool ret_value = false;
580b57cec5SDimitry Andric if (m_opaque_up)
590b57cec5SDimitry Andric ret_value = m_opaque_up->Fail();
600b57cec5SDimitry Andric
610b57cec5SDimitry Andric
620b57cec5SDimitry Andric return ret_value;
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric
Success() const650b57cec5SDimitry Andric bool SBError::Success() const {
660b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Success);
670b57cec5SDimitry Andric
680b57cec5SDimitry Andric bool ret_value = true;
690b57cec5SDimitry Andric if (m_opaque_up)
700b57cec5SDimitry Andric ret_value = m_opaque_up->Success();
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric return ret_value;
730b57cec5SDimitry Andric }
740b57cec5SDimitry Andric
GetError() const750b57cec5SDimitry Andric uint32_t SBError::GetError() const {
760b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBError, GetError);
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric uint32_t err = 0;
800b57cec5SDimitry Andric if (m_opaque_up)
810b57cec5SDimitry Andric err = m_opaque_up->GetError();
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric
840b57cec5SDimitry Andric return err;
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric
GetType() const870b57cec5SDimitry Andric ErrorType SBError::GetType() const {
880b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ErrorType, SBError, GetType);
890b57cec5SDimitry Andric
900b57cec5SDimitry Andric ErrorType err_type = eErrorTypeInvalid;
910b57cec5SDimitry Andric if (m_opaque_up)
920b57cec5SDimitry Andric err_type = m_opaque_up->GetType();
930b57cec5SDimitry Andric
940b57cec5SDimitry Andric return err_type;
950b57cec5SDimitry Andric }
960b57cec5SDimitry Andric
SetError(uint32_t err,ErrorType type)970b57cec5SDimitry Andric void SBError::SetError(uint32_t err, ErrorType type) {
980b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType), err,
990b57cec5SDimitry Andric type);
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric CreateIfNeeded();
1020b57cec5SDimitry Andric m_opaque_up->SetError(err, type);
1030b57cec5SDimitry Andric }
1040b57cec5SDimitry Andric
SetError(const Status & lldb_error)1050b57cec5SDimitry Andric void SBError::SetError(const Status &lldb_error) {
1060b57cec5SDimitry Andric CreateIfNeeded();
1070b57cec5SDimitry Andric *m_opaque_up = lldb_error;
1080b57cec5SDimitry Andric }
1090b57cec5SDimitry Andric
SetErrorToErrno()1100b57cec5SDimitry Andric void SBError::SetErrorToErrno() {
1110b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToErrno);
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric CreateIfNeeded();
1140b57cec5SDimitry Andric m_opaque_up->SetErrorToErrno();
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric
SetErrorToGenericError()1170b57cec5SDimitry Andric void SBError::SetErrorToGenericError() {
1180b57cec5SDimitry Andric LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToGenericError);
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andric CreateIfNeeded();
121af732203SDimitry Andric m_opaque_up->SetErrorToGenericError();
1220b57cec5SDimitry Andric }
1230b57cec5SDimitry Andric
SetErrorString(const char * err_str)1240b57cec5SDimitry Andric void SBError::SetErrorString(const char *err_str) {
1250b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBError, SetErrorString, (const char *), err_str);
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric CreateIfNeeded();
1280b57cec5SDimitry Andric m_opaque_up->SetErrorString(err_str);
1290b57cec5SDimitry Andric }
1300b57cec5SDimitry Andric
SetErrorStringWithFormat(const char * format,...)1310b57cec5SDimitry Andric int SBError::SetErrorStringWithFormat(const char *format, ...) {
1320b57cec5SDimitry Andric CreateIfNeeded();
1330b57cec5SDimitry Andric va_list args;
1340b57cec5SDimitry Andric va_start(args, format);
1350b57cec5SDimitry Andric int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args);
1360b57cec5SDimitry Andric va_end(args);
1370b57cec5SDimitry Andric return num_chars;
1380b57cec5SDimitry Andric }
1390b57cec5SDimitry Andric
IsValid() const1400b57cec5SDimitry Andric bool SBError::IsValid() const {
1410b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, IsValid);
1420b57cec5SDimitry Andric return this->operator bool();
1430b57cec5SDimitry Andric }
operator bool() const1440b57cec5SDimitry Andric SBError::operator bool() const {
1450b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, operator bool);
1460b57cec5SDimitry Andric
1470b57cec5SDimitry Andric return m_opaque_up != nullptr;
1480b57cec5SDimitry Andric }
1490b57cec5SDimitry Andric
CreateIfNeeded()1500b57cec5SDimitry Andric void SBError::CreateIfNeeded() {
1510b57cec5SDimitry Andric if (m_opaque_up == nullptr)
1525ffd83dbSDimitry Andric m_opaque_up = std::make_unique<Status>();
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric
operator ->()1550b57cec5SDimitry Andric lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); }
1560b57cec5SDimitry Andric
get()1570b57cec5SDimitry Andric lldb_private::Status *SBError::get() { return m_opaque_up.get(); }
1580b57cec5SDimitry Andric
ref()1590b57cec5SDimitry Andric lldb_private::Status &SBError::ref() {
1600b57cec5SDimitry Andric CreateIfNeeded();
1610b57cec5SDimitry Andric return *m_opaque_up;
1620b57cec5SDimitry Andric }
1630b57cec5SDimitry Andric
operator *() const1640b57cec5SDimitry Andric const lldb_private::Status &SBError::operator*() const {
1650b57cec5SDimitry Andric // Be sure to call "IsValid()" before calling this function or it will crash
1660b57cec5SDimitry Andric return *m_opaque_up;
1670b57cec5SDimitry Andric }
1680b57cec5SDimitry Andric
GetDescription(SBStream & description)1690b57cec5SDimitry Andric bool SBError::GetDescription(SBStream &description) {
1700b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBError, GetDescription, (lldb::SBStream &),
1710b57cec5SDimitry Andric description);
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andric if (m_opaque_up) {
1740b57cec5SDimitry Andric if (m_opaque_up->Success())
1750b57cec5SDimitry Andric description.Printf("success");
1760b57cec5SDimitry Andric else {
1770b57cec5SDimitry Andric const char *err_string = GetCString();
1780b57cec5SDimitry Andric description.Printf("error: %s",
1790b57cec5SDimitry Andric (err_string != nullptr ? err_string : ""));
1800b57cec5SDimitry Andric }
1810b57cec5SDimitry Andric } else
1820b57cec5SDimitry Andric description.Printf("error: <NULL>");
1830b57cec5SDimitry Andric
1840b57cec5SDimitry Andric return true;
1850b57cec5SDimitry Andric }
1860b57cec5SDimitry Andric
1870b57cec5SDimitry Andric namespace lldb_private {
1880b57cec5SDimitry Andric namespace repro {
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)1910b57cec5SDimitry Andric void RegisterMethods<SBError>(Registry &R) {
1920b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBError, ());
1930b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBError, (const lldb::SBError &));
1940b57cec5SDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBError &,
1950b57cec5SDimitry Andric SBError, operator=,(const lldb::SBError &));
1960b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(const char *, SBError, GetCString, ());
1970b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBError, Clear, ());
1980b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBError, Fail, ());
1990b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBError, Success, ());
2000b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBError, GetError, ());
2010b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::ErrorType, SBError, GetType, ());
2020b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType));
2030b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBError, SetErrorToErrno, ());
2040b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBError, SetErrorToGenericError, ());
2050b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBError, SetErrorString, (const char *));
2060b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBError, IsValid, ());
2070b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBError, operator bool, ());
2080b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBError, GetDescription, (lldb::SBStream &));
2090b57cec5SDimitry Andric }
2100b57cec5SDimitry Andric
2110b57cec5SDimitry Andric }
2120b57cec5SDimitry Andric }
213