180814287SRaphael Isemann //===-- SBError.cpp -------------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBError.h" 10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 11bd4bf82aSJonas Devlieghere #include "Utils.h" 12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1397206d57SZachary Turner #include "lldb/Utility/Status.h" 14dde9cff3SCaroline Tice 1576e47d48SRaphael Isemann #include <cstdarg> 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner using namespace lldb; 1830fdc8d8SChris Lattner using namespace lldb_private; 1930fdc8d8SChris Lattner 20a3436f73SKazu Hirata SBError::SBError() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBError); } 2130fdc8d8SChris Lattner 22a3436f73SKazu Hirata SBError::SBError(const SBError &rhs) { 23baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBError, (const lldb::SBError &), rhs); 24baf5664fSJonas Devlieghere 25bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 2630fdc8d8SChris Lattner } 2730fdc8d8SChris Lattner 28866b7a65SJonas Devlieghere SBError::~SBError() = default; 2930fdc8d8SChris Lattner 30b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 31baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBError &, 32baf5664fSJonas Devlieghere SBError, operator=,(const lldb::SBError &), rhs); 33baf5664fSJonas Devlieghere 34bd4bf82aSJonas Devlieghere if (this != &rhs) 35bd4bf82aSJonas Devlieghere m_opaque_up = clone(rhs.m_opaque_up); 36*d232abc3SJonas Devlieghere return *this; 3730fdc8d8SChris Lattner } 3830fdc8d8SChris Lattner 39b9c1b51eSKate Stone const char *SBError::GetCString() const { 40baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBError, GetCString); 41baf5664fSJonas Devlieghere 42d5b44036SJonas Devlieghere if (m_opaque_up) 43d5b44036SJonas Devlieghere return m_opaque_up->AsCString(); 44248a1305SKonrad Kleine return nullptr; 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone void SBError::Clear() { 48baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, Clear); 49baf5664fSJonas Devlieghere 50d5b44036SJonas Devlieghere if (m_opaque_up) 51d5b44036SJonas Devlieghere m_opaque_up->Clear(); 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone bool SBError::Fail() const { 55baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Fail); 56baf5664fSJonas Devlieghere 57ceb6b139SCaroline Tice bool ret_value = false; 58d5b44036SJonas Devlieghere if (m_opaque_up) 59d5b44036SJonas Devlieghere ret_value = m_opaque_up->Fail(); 60ceb6b139SCaroline Tice 61ceb6b139SCaroline Tice 62ceb6b139SCaroline Tice return ret_value; 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone bool SBError::Success() const { 66baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, Success); 67baf5664fSJonas Devlieghere 6816e0c686SJim Ingham bool ret_value = true; 69d5b44036SJonas Devlieghere if (m_opaque_up) 70d5b44036SJonas Devlieghere ret_value = m_opaque_up->Success(); 714838131bSGreg Clayton 724838131bSGreg Clayton return ret_value; 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone uint32_t SBError::GetError() const { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBError, GetError); 77baf5664fSJonas Devlieghere 784838131bSGreg Clayton 794838131bSGreg Clayton uint32_t err = 0; 80d5b44036SJonas Devlieghere if (m_opaque_up) 81d5b44036SJonas Devlieghere err = m_opaque_up->GetError(); 824838131bSGreg Clayton 834838131bSGreg Clayton 844838131bSGreg Clayton return err; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 87b9c1b51eSKate Stone ErrorType SBError::GetType() const { 88baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ErrorType, SBError, GetType); 89baf5664fSJonas Devlieghere 904838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 91d5b44036SJonas Devlieghere if (m_opaque_up) 92d5b44036SJonas Devlieghere err_type = m_opaque_up->GetType(); 934838131bSGreg Clayton 944838131bSGreg Clayton return err_type; 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 97b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 98baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetError, (uint32_t, lldb::ErrorType), err, 99baf5664fSJonas Devlieghere type); 100baf5664fSJonas Devlieghere 10130fdc8d8SChris Lattner CreateIfNeeded(); 102d5b44036SJonas Devlieghere m_opaque_up->SetError(err, type); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 10597206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 10630fdc8d8SChris Lattner CreateIfNeeded(); 107d5b44036SJonas Devlieghere *m_opaque_up = lldb_error; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 110b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 111baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToErrno); 112baf5664fSJonas Devlieghere 11330fdc8d8SChris Lattner CreateIfNeeded(); 114d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 117b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 118baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBError, SetErrorToGenericError); 119baf5664fSJonas Devlieghere 12030fdc8d8SChris Lattner CreateIfNeeded(); 121206e8d89SAndy Yankovsky m_opaque_up->SetErrorToGenericError(); 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 124b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 125baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBError, SetErrorString, (const char *), err_str); 126baf5664fSJonas Devlieghere 12730fdc8d8SChris Lattner CreateIfNeeded(); 128d5b44036SJonas Devlieghere m_opaque_up->SetErrorString(err_str); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 131b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 13230fdc8d8SChris Lattner CreateIfNeeded(); 13330fdc8d8SChris Lattner va_list args; 13430fdc8d8SChris Lattner va_start(args, format); 135d5b44036SJonas Devlieghere int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args); 13630fdc8d8SChris Lattner va_end(args); 13730fdc8d8SChris Lattner return num_chars; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 140baf5664fSJonas Devlieghere bool SBError::IsValid() const { 141baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, IsValid); 1427f5237bcSPavel Labath return this->operator bool(); 1437f5237bcSPavel Labath } 1447f5237bcSPavel Labath SBError::operator bool() const { 1457f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBError, operator bool); 146baf5664fSJonas Devlieghere 147248a1305SKonrad Kleine return m_opaque_up != nullptr; 148baf5664fSJonas Devlieghere } 14930fdc8d8SChris Lattner 150b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 151248a1305SKonrad Kleine if (m_opaque_up == nullptr) 1521c0bbe43SJonas Devlieghere m_opaque_up = std::make_unique<Status>(); 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner 155d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); } 15630fdc8d8SChris Lattner 157d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); } 15830fdc8d8SChris Lattner 15997206d57SZachary Turner lldb_private::Status &SBError::ref() { 1608f343b09SGreg Clayton CreateIfNeeded(); 161d5b44036SJonas Devlieghere return *m_opaque_up; 1628f343b09SGreg Clayton } 16330fdc8d8SChris Lattner 16497206d57SZachary Turner const lldb_private::Status &SBError::operator*() const { 16530fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 166d5b44036SJonas Devlieghere return *m_opaque_up; 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 169b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 170baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBError, GetDescription, (lldb::SBStream &), 171baf5664fSJonas Devlieghere description); 172baf5664fSJonas Devlieghere 173d5b44036SJonas Devlieghere if (m_opaque_up) { 174d5b44036SJonas Devlieghere if (m_opaque_up->Success()) 175262f80dfSGreg Clayton description.Printf("success"); 176b9c1b51eSKate Stone else { 177dde9cff3SCaroline Tice const char *err_string = GetCString(); 178248a1305SKonrad Kleine description.Printf("error: %s", 179248a1305SKonrad Kleine (err_string != nullptr ? err_string : "")); 180dde9cff3SCaroline Tice } 181b9c1b51eSKate Stone } else 182262f80dfSGreg Clayton description.Printf("error: <NULL>"); 183ceb6b139SCaroline Tice 184ceb6b139SCaroline Tice return true; 185ceb6b139SCaroline Tice } 186