130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===// 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" 10dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 116f9e6901SZachary Turner #include "lldb/Utility/Log.h" 1297206d57SZachary Turner #include "lldb/Utility/Status.h" 13dde9cff3SCaroline Tice 149c68da97SEli Friedman #include <stdarg.h> 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner using namespace lldb; 1730fdc8d8SChris Lattner using namespace lldb_private; 1830fdc8d8SChris Lattner 19*d5b44036SJonas Devlieghere SBError::SBError() : m_opaque_up() {} 2030fdc8d8SChris Lattner 21*d5b44036SJonas Devlieghere SBError::SBError(const SBError &rhs) : m_opaque_up() { 2230fdc8d8SChris Lattner if (rhs.IsValid()) 23*d5b44036SJonas Devlieghere m_opaque_up.reset(new Status(*rhs)); 2430fdc8d8SChris Lattner } 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBError::~SBError() {} 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone const SBError &SBError::operator=(const SBError &rhs) { 29b9c1b51eSKate Stone if (rhs.IsValid()) { 30*d5b44036SJonas Devlieghere if (m_opaque_up) 31*d5b44036SJonas Devlieghere *m_opaque_up = *rhs; 3230fdc8d8SChris Lattner else 33*d5b44036SJonas Devlieghere m_opaque_up.reset(new Status(*rhs)); 34b9c1b51eSKate Stone } else 35*d5b44036SJonas Devlieghere m_opaque_up.reset(); 36ceb6b139SCaroline Tice 3730fdc8d8SChris Lattner return *this; 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40b9c1b51eSKate Stone const char *SBError::GetCString() const { 41*d5b44036SJonas Devlieghere if (m_opaque_up) 42*d5b44036SJonas Devlieghere return m_opaque_up->AsCString(); 4330fdc8d8SChris Lattner return NULL; 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 46b9c1b51eSKate Stone void SBError::Clear() { 47*d5b44036SJonas Devlieghere if (m_opaque_up) 48*d5b44036SJonas Devlieghere m_opaque_up->Clear(); 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 51b9c1b51eSKate Stone bool SBError::Fail() const { 525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53ceb6b139SCaroline Tice 54ceb6b139SCaroline Tice bool ret_value = false; 55*d5b44036SJonas Devlieghere if (m_opaque_up) 56*d5b44036SJonas Devlieghere ret_value = m_opaque_up->Fail(); 57ceb6b139SCaroline Tice 58ceb6b139SCaroline Tice if (log) 59324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Fail () => %i", 60*d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 61ceb6b139SCaroline Tice 62ceb6b139SCaroline Tice return ret_value; 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone bool SBError::Success() const { 665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6716e0c686SJim Ingham bool ret_value = true; 68*d5b44036SJonas Devlieghere if (m_opaque_up) 69*d5b44036SJonas Devlieghere ret_value = m_opaque_up->Success(); 704838131bSGreg Clayton 714838131bSGreg Clayton if (log) 72324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Success () => %i", 73*d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), ret_value); 744838131bSGreg Clayton 754838131bSGreg Clayton return ret_value; 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 78b9c1b51eSKate Stone uint32_t SBError::GetError() const { 795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 804838131bSGreg Clayton 814838131bSGreg Clayton uint32_t err = 0; 82*d5b44036SJonas Devlieghere if (m_opaque_up) 83*d5b44036SJonas Devlieghere err = m_opaque_up->GetError(); 844838131bSGreg Clayton 854838131bSGreg Clayton if (log) 86324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetError () => 0x%8.8x", 87*d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err); 884838131bSGreg Clayton 894838131bSGreg Clayton return err; 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 92b9c1b51eSKate Stone ErrorType SBError::GetType() const { 935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 944838131bSGreg Clayton ErrorType err_type = eErrorTypeInvalid; 95*d5b44036SJonas Devlieghere if (m_opaque_up) 96*d5b44036SJonas Devlieghere err_type = m_opaque_up->GetType(); 974838131bSGreg Clayton 984838131bSGreg Clayton if (log) 99324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetType () => %i", 100*d5b44036SJonas Devlieghere static_cast<void *>(m_opaque_up.get()), err_type); 1014838131bSGreg Clayton 1024838131bSGreg Clayton return err_type; 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 105b9c1b51eSKate Stone void SBError::SetError(uint32_t err, ErrorType type) { 10630fdc8d8SChris Lattner CreateIfNeeded(); 107*d5b44036SJonas Devlieghere m_opaque_up->SetError(err, type); 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 11097206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 11130fdc8d8SChris Lattner CreateIfNeeded(); 112*d5b44036SJonas Devlieghere *m_opaque_up = lldb_error; 11330fdc8d8SChris Lattner } 11430fdc8d8SChris Lattner 115b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 11630fdc8d8SChris Lattner CreateIfNeeded(); 117*d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 120b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 12130fdc8d8SChris Lattner CreateIfNeeded(); 122*d5b44036SJonas Devlieghere m_opaque_up->SetErrorToErrno(); 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 125b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 12630fdc8d8SChris Lattner CreateIfNeeded(); 127*d5b44036SJonas Devlieghere m_opaque_up->SetErrorString(err_str); 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 130b9c1b51eSKate Stone int SBError::SetErrorStringWithFormat(const char *format, ...) { 13130fdc8d8SChris Lattner CreateIfNeeded(); 13230fdc8d8SChris Lattner va_list args; 13330fdc8d8SChris Lattner va_start(args, format); 134*d5b44036SJonas Devlieghere int num_chars = m_opaque_up->SetErrorStringWithVarArg(format, args); 13530fdc8d8SChris Lattner va_end(args); 13630fdc8d8SChris Lattner return num_chars; 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner 139*d5b44036SJonas Devlieghere bool SBError::IsValid() const { return m_opaque_up != NULL; } 14030fdc8d8SChris Lattner 141b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 142*d5b44036SJonas Devlieghere if (m_opaque_up == NULL) 143*d5b44036SJonas Devlieghere m_opaque_up.reset(new Status()); 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 146*d5b44036SJonas Devlieghere lldb_private::Status *SBError::operator->() { return m_opaque_up.get(); } 14730fdc8d8SChris Lattner 148*d5b44036SJonas Devlieghere lldb_private::Status *SBError::get() { return m_opaque_up.get(); } 14930fdc8d8SChris Lattner 15097206d57SZachary Turner lldb_private::Status &SBError::ref() { 1518f343b09SGreg Clayton CreateIfNeeded(); 152*d5b44036SJonas Devlieghere return *m_opaque_up; 1538f343b09SGreg Clayton } 15430fdc8d8SChris Lattner 15597206d57SZachary Turner const lldb_private::Status &SBError::operator*() const { 15630fdc8d8SChris Lattner // Be sure to call "IsValid()" before calling this function or it will crash 157*d5b44036SJonas Devlieghere return *m_opaque_up; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 161*d5b44036SJonas Devlieghere if (m_opaque_up) { 162*d5b44036SJonas Devlieghere if (m_opaque_up->Success()) 163262f80dfSGreg Clayton description.Printf("success"); 164b9c1b51eSKate Stone else { 165dde9cff3SCaroline Tice const char *err_string = GetCString(); 166262f80dfSGreg Clayton description.Printf("error: %s", (err_string != NULL ? err_string : "")); 167dde9cff3SCaroline Tice } 168b9c1b51eSKate Stone } else 169262f80dfSGreg Clayton description.Printf("error: <NULL>"); 170ceb6b139SCaroline Tice 171ceb6b139SCaroline Tice return true; 172ceb6b139SCaroline Tice } 173