130fdc8d8SChris Lattner //===-- SBError.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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 19b9c1b51eSKate Stone SBError::SBError() : m_opaque_ap() {} 2030fdc8d8SChris Lattner 21b9c1b51eSKate Stone SBError::SBError(const SBError &rhs) : m_opaque_ap() { 2230fdc8d8SChris Lattner if (rhs.IsValid()) 2397206d57SZachary Turner m_opaque_ap.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()) { 303447077aSJonas Devlieghere if (m_opaque_ap) 316611103cSGreg Clayton *m_opaque_ap = *rhs; 3230fdc8d8SChris Lattner else 3397206d57SZachary Turner m_opaque_ap.reset(new Status(*rhs)); 34b9c1b51eSKate Stone } else 356611103cSGreg Clayton m_opaque_ap.reset(); 36ceb6b139SCaroline Tice 3730fdc8d8SChris Lattner return *this; 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40b9c1b51eSKate Stone const char *SBError::GetCString() const { 413447077aSJonas Devlieghere if (m_opaque_ap) 426611103cSGreg Clayton return m_opaque_ap->AsCString(); 4330fdc8d8SChris Lattner return NULL; 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 46b9c1b51eSKate Stone void SBError::Clear() { 473447077aSJonas Devlieghere if (m_opaque_ap) 486611103cSGreg Clayton m_opaque_ap->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; 553447077aSJonas Devlieghere if (m_opaque_ap) 56ceb6b139SCaroline Tice ret_value = m_opaque_ap->Fail(); 57ceb6b139SCaroline Tice 58ceb6b139SCaroline Tice if (log) 59324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Fail () => %i", 60324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.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; 683447077aSJonas Devlieghere if (m_opaque_ap) 694838131bSGreg Clayton ret_value = m_opaque_ap->Success(); 704838131bSGreg Clayton 714838131bSGreg Clayton if (log) 72324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::Success () => %i", 73324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.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; 823447077aSJonas Devlieghere if (m_opaque_ap) 834838131bSGreg Clayton err = m_opaque_ap->GetError(); 844838131bSGreg Clayton 854838131bSGreg Clayton if (log) 86324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetError () => 0x%8.8x", 87324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.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; 953447077aSJonas Devlieghere if (m_opaque_ap) 964838131bSGreg Clayton err_type = m_opaque_ap->GetType(); 974838131bSGreg Clayton 984838131bSGreg Clayton if (log) 99324a1036SSaleem Abdulrasool log->Printf("SBError(%p)::GetType () => %i", 100324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ap.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(); 1076611103cSGreg Clayton m_opaque_ap->SetError(err, type); 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 11097206d57SZachary Turner void SBError::SetError(const Status &lldb_error) { 11130fdc8d8SChris Lattner CreateIfNeeded(); 1126611103cSGreg Clayton *m_opaque_ap = lldb_error; 11330fdc8d8SChris Lattner } 11430fdc8d8SChris Lattner 115b9c1b51eSKate Stone void SBError::SetErrorToErrno() { 11630fdc8d8SChris Lattner CreateIfNeeded(); 1176611103cSGreg Clayton m_opaque_ap->SetErrorToErrno(); 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 120b9c1b51eSKate Stone void SBError::SetErrorToGenericError() { 12130fdc8d8SChris Lattner CreateIfNeeded(); 1226611103cSGreg Clayton m_opaque_ap->SetErrorToErrno(); 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 125b9c1b51eSKate Stone void SBError::SetErrorString(const char *err_str) { 12630fdc8d8SChris Lattner CreateIfNeeded(); 1276611103cSGreg Clayton m_opaque_ap->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); 1346611103cSGreg Clayton int num_chars = m_opaque_ap->SetErrorStringWithVarArg(format, args); 13530fdc8d8SChris Lattner va_end(args); 13630fdc8d8SChris Lattner return num_chars; 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner 1393447077aSJonas Devlieghere bool SBError::IsValid() const { return m_opaque_ap != NULL; } 14030fdc8d8SChris Lattner 141b9c1b51eSKate Stone void SBError::CreateIfNeeded() { 1423447077aSJonas Devlieghere if (m_opaque_ap == NULL) 14397206d57SZachary Turner m_opaque_ap.reset(new Status()); 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 14697206d57SZachary Turner lldb_private::Status *SBError::operator->() { return m_opaque_ap.get(); } 14730fdc8d8SChris Lattner 14897206d57SZachary Turner lldb_private::Status *SBError::get() { return m_opaque_ap.get(); } 14930fdc8d8SChris Lattner 15097206d57SZachary Turner lldb_private::Status &SBError::ref() { 1518f343b09SGreg Clayton CreateIfNeeded(); 1528f343b09SGreg Clayton return *m_opaque_ap; 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 1576611103cSGreg Clayton return *m_opaque_ap; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9c1b51eSKate Stone bool SBError::GetDescription(SBStream &description) { 1613447077aSJonas Devlieghere if (m_opaque_ap) { 162262f80dfSGreg Clayton if (m_opaque_ap->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